找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 28661|回复: 6

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。+ d) C, G2 ~2 L; b% c
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
, N7 O1 v9 y$ T(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
! U1 ?2 Z% A: L(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
7 j% Y) J$ u: c% [  D( o4 k8 z(4):重启执行VBS脚本,得到输出结果
% B; h; G* F9 _6 B" f(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
7 J, Z, b/ R8 A6 t( w. U) I4 p% u6 ^% v8 k  u2 p3 K
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
  O3 J4 i, L8 Q3 R0 ?   请高手指点一下如何通过这个acpimof.dll来获得控制权: g, P9 g3 B0 N
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 936

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
! Q3 k, [/ S; b我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,* W# M7 O7 I. F/ t) K
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
" ?! z7 X# ]) h! `或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!4 k; i0 S/ d7 ~# x0 }- q
 谢谢各位。
# G7 x; Z3 V. q3 Z4 w 

Using WMI.rar

1.08 KB, 下载次数: 957

回复

使用道具 举报

发表于 2010-3-17 17:42:45 | 显示全部楼层
咋下不了啊?using wmi
回复

使用道具 举报

发表于 2010-4-15 10:07:49 | 显示全部楼层
这个问题我好像也遇到过
回复

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
$ i) y; W& n. f, n2 H! y- l% a" M' i0 _
// Using WMI.cpp : 定义应用程序的类行为。/ y( |6 h* n% Y/ _+ H2 ^- D/ \
//
* Q0 P& f+ s6 R9 b- N( P# B% F/ N: z+ [
#include "stdafx.h"
! m' l2 K  k* C1 p* l#include "Using WMI.h"
+ c( v2 l- M" z" i+ ?7 s+ C& i; V#include "Using WMIDlg.h") h1 B3 i2 j& Z9 R
# S' B* S6 t' {2 W: k
#ifdef _DEBUG
% U6 I9 k; c5 n* P4 D! {8 F; p' b- }#define new DEBUG_NEW
8 }' x) S: w' Z# x) V7 O+ {#endif
% _5 p2 @- k1 B% U- n. H5 m7 ^0 A0 T
' E0 k' v/ ^* n! e  M( N
// CUsingWMIApp) V% C: x# a! r5 B
8 @' i2 w* p" ^; {1 c2 a) F8 I
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
. h' a: N; e& P) h! L        ON_COMMAND(ID_HELP, &CWinApp::OnHelp), v5 [- [) U7 p$ i3 v
END_MESSAGE_MAP()
5 S; Y) p; T) y; T6 p% c6 h2 D) D+ L

: r; l; Y# M; p( j* W, \1 h; p// CUsingWMIApp 构造
1 B5 ]3 @  H: ?9 r# ^# |
8 ]  l7 \4 \4 \+ p! S) WCUsingWMIApp::CUsingWMIApp()
* J( f  n# s8 b# K- @4 ]$ U{
" t, F2 y- U+ \9 P        // TODO: 在此处添加构造代码,
* D& i3 D& ^1 _5 c* x8 Q        // 将所有重要的初始化放置在 InitInstance 中
9 Z- [% H6 f- ~}5 }& q0 `1 D/ {

$ ?5 H& `; Z! A
$ {" ]6 ]9 X9 g# b// 唯一的一个 CUsingWMIApp 对象
: W. ?! A5 q" R$ c" W1 ?5 k8 H* a! ^3 G5 w0 C7 k
CUsingWMIApp theApp;9 k3 M3 K6 h* g/ P* B
* H/ \$ F, S! n; }8 q0 M2 A, u8 o7 s
$ f- Q% n4 z% z& t. p
// CUsingWMIApp 初始化
. [5 e1 \: l! O: q3 {8 l, M4 X( Z! Y
0 @5 c0 g1 }; d6 M  {BOOL CUsingWMIApp::InitInstance()% Z: G5 B  O1 Q# G, d
{1 }& K! M) M2 E9 R
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
9 g  I" R* g( i5 H9 n/ E( d        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
/ K) }1 R% S5 t0 G8 n( t' h        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
) V" Z# \  J" r$ `. I8 E; s- p2 v        INITCOMMONCONTROLSEX InitCtrls;! S7 R. d4 }( S. K0 |) Y
        InitCtrls.dwSize = sizeof(InitCtrls);. I: a) v6 ~* j" r
        // 将它设置为包括所有要在应用程序中使用的
' y* T, U. Z  D4 i* e9 ~4 p) l# {        // 公共控件类。) R' {' `1 K! h& ]+ h
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
& a0 t! J$ x  f! @' f# U        InitCommonControlsEx(&InitCtrls);) U5 V& e  D- L' V0 E' F) z/ p' w; N) d
" N. f, |, R5 I4 R2 r
        CWinApp::InitInstance();
- d1 t0 T: I# k' R+ U) ~, t9 z" N. Y
        AfxEnableControlContainer();
' e8 _& K& x  c4 |1 J0 [/ h0 q* H
+ N7 p3 e: y/ H        // 标准初始化" `( ~- Q) y; w/ a" B( q
        // 如果未使用这些功能并希望减小2 `7 _% U- s5 I- e4 {. t
        // 最终可执行文件的大小,则应移除下列
9 g' X- Y2 T- X5 o, \$ \6 Z        // 不需要的特定初始化例程
2 A8 [+ e! @( I5 ~; F9 k4 @0 ?        // 更改用于存储设置的注册表项' H' ^1 Y; A, S: |/ J7 ]: p
        // TODO: 应适当修改该字符串,
' S. s1 C7 l+ v( Z# V: ?" s        // 例如修改为公司或组织名
8 B! E( ]7 C: A% n  v( a        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
9 s3 ~# A" ]4 h5 ^1 R1 ~
1 [/ c' q- U5 l- o        CUsingWMIDlg dlg;
0 e0 o6 a  E  X( V/ Q        m_pMainWnd = &dlg;+ x5 f- ]/ }5 s+ w
        INT_PTR nResponse = dlg.DoModal();/ N7 G2 y! c" m) A3 ?% o
        if (nResponse == IDOK)) V0 O9 Q6 G: o6 }5 u1 T
        {2 S, l5 R% g$ M" ?: C
                // TODO: 在此放置处理何时用
6 ]' E- q( P$ q6 }7 b. @                //  “确定”来关闭对话框的代码2 f" n$ H, P) y8 H# c( }
        }
4 p6 `4 h1 i+ z$ y        else if (nResponse == IDCANCEL)
9 t) Q( T' B" q+ d) s        {
' t+ t8 ^& ?+ g8 D                // TODO: 在此放置处理何时用! L) p. y3 Y, D) A6 {
                //  “取消”来关闭对话框的代码' |  X' ]' I6 o0 S% H
        }3 R# J! e  Z8 C3 W

$ b, C+ M& t9 z8 l/ h; v; x        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
5 l) k  ]5 b: u0 o8 i0 z4 p        //  而不是启动应用程序的消息泵。" Y; H2 b0 O2 C+ q* r& u
        return FALSE;/ t! X4 W, Y! g. g3 D% p! |
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2025-12-1 08:37 , Processed in 0.319149 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表