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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。. a$ Q! Z5 G; b2 C1 c+ n6 c& I
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备: r) K5 l2 s8 V' S8 V% p
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本8 ]" l% n) D3 |+ [1 v) k
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接) F5 b/ p' p0 t9 c+ x
(4):重启执行VBS脚本,得到输出结果! q& f; w3 U% \& q& H, ^! g
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)4 [: n) |4 n5 D. B, i

9 a; z; L8 l8 ?2 [+ E6 C9 w问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
7 x' W2 @, N2 p: o4 ?& P   请高手指点一下如何通过这个acpimof.dll来获得控制权
' C& y' n8 y& }2 y5 {   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 421

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,% o& S& I, t4 A; z3 ~3 c
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
& j$ f; e7 z4 G3 }或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
! L$ S. ~% ]$ l+ w  ~ 谢谢各位。
5 C/ o+ K& y/ I, R 

Using WMI.rar

1.08 KB, 下载次数: 457

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
: G( q7 p2 d+ h8 t7 B9 v/ a! q* e( ~+ s7 h' t- {
// Using WMI.cpp : 定义应用程序的类行为。
* r2 f. C7 s2 J# R5 h. T//
5 e! I/ i2 i0 p3 c7 d0 V" H8 p) u% a
#include "stdafx.h"9 e/ q, p& a, ?
#include "Using WMI.h"2 r: Q+ F6 g& ^5 {5 o- n, r
#include "Using WMIDlg.h"
8 L0 r5 |0 y* w7 |' Y% t& D) X) x# g5 h9 I; ?2 H; e$ B3 S
#ifdef _DEBUG* \6 h4 h: b' ?
#define new DEBUG_NEW
0 Q9 D, u, C; J#endif
$ I& x5 o- W# ?# ?
6 n- j: u0 N( E$ [$ H& _; V! T9 u$ w- y# \
// CUsingWMIApp. ^0 [) ^: T' x% r* m. A& h
, h6 L7 J* C" X/ ^+ s
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)( j3 N3 [2 I- c# Z  q0 z
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
0 Y0 ^. X) d+ z/ O: `4 ]5 GEND_MESSAGE_MAP()
; s. x  r6 m, N/ X
* ?5 Q9 |& K3 ]! R! E8 }% i9 u; w' r& U6 |" k
// CUsingWMIApp 构造
$ E7 Q3 K& Q! B5 `# E
6 y! C3 a& X' {( }4 v5 s0 a9 ZCUsingWMIApp::CUsingWMIApp(). _/ A9 C5 E# W0 g
{' ?) {) A) {9 W$ f: ~  O3 a
        // TODO: 在此处添加构造代码,& `# k4 X3 f/ ?, u$ R1 Z1 R
        // 将所有重要的初始化放置在 InitInstance 中
6 |& z4 ?/ Q) v% c: ?4 R}
: |8 m  @5 P) a" y' d) A
" G  D& Y8 x$ F* P0 J0 t8 m
/ X( S- a9 b! U// 唯一的一个 CUsingWMIApp 对象0 T1 }6 R& W+ R2 }

! O: Z; {: m6 k0 E( T7 x) _CUsingWMIApp theApp;
1 ^/ i; X4 f( X; f+ Y9 h
$ s0 c3 \! a2 W) f
2 F9 C9 O: i# f% R. k// CUsingWMIApp 初始化
  A  r, [) i4 y, y" a% K3 v! {6 J, s& G* W
BOOL CUsingWMIApp::InitInstance()
% M- G) l* f9 O9 R" G2 A{
/ D0 h: s% m: X1 ?. g9 y$ v        // 如果一个运行在 Windows XP 上的应用程序清单指定要
9 s: l4 P: K1 _4 Q        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
6 ]) {9 r+ f& x2 X% _        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
$ E( _9 B' _$ Z" L        INITCOMMONCONTROLSEX InitCtrls;, E. y7 ?( Y# t0 ^) T0 z
        InitCtrls.dwSize = sizeof(InitCtrls);. k& x, D, b* M! p0 p- x/ P
        // 将它设置为包括所有要在应用程序中使用的
. j% l4 S  o- Q( ^2 r        // 公共控件类。
. n3 q# K$ |6 l1 x; m        InitCtrls.dwICC = ICC_WIN95_CLASSES;/ f! c0 m! }) m; \6 @
        InitCommonControlsEx(&InitCtrls);
* o5 t' y% M1 q* ^1 v: I. q2 }6 X/ L- a3 I& J
        CWinApp::InitInstance();) o; \3 d- x) ]$ T6 s
8 o: H/ |1 T( F. a9 D
        AfxEnableControlContainer();
& Z6 O; k# ]  x/ T
3 g3 g, T8 L( V. L1 W; ~: x        // 标准初始化
5 Z- p; I- {, ]/ M7 ]0 L0 q        // 如果未使用这些功能并希望减小, c- g9 G4 B# _/ k
        // 最终可执行文件的大小,则应移除下列
6 G4 u1 `  G6 ?' t7 n        // 不需要的特定初始化例程
  b3 I, d5 w4 w8 K& S1 x1 C        // 更改用于存储设置的注册表项8 j! N; |; g+ J9 C
        // TODO: 应适当修改该字符串,
/ s7 ^  I' e  {" Q$ @  }        // 例如修改为公司或组织名
% u. l5 z' q! N        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
7 g/ b) m+ Y' b* u; Y& q& G. Q
* i" o1 U( i, l6 e% i% b        CUsingWMIDlg dlg;
! e& E( v% ?! j  l5 e        m_pMainWnd = &dlg;7 Z4 r- k5 I6 K. J1 i
        INT_PTR nResponse = dlg.DoModal();# u( T2 t$ J7 `7 T9 W# E
        if (nResponse == IDOK)
6 |, T$ V5 X5 o" }! _; a        {- }3 [6 p6 R0 A3 E) J2 j& C
                // TODO: 在此放置处理何时用6 k& u+ f2 ^$ [* ~
                //  “确定”来关闭对话框的代码
( W4 {/ k0 p7 o1 N        }$ W6 a0 ^5 V6 Q2 u
        else if (nResponse == IDCANCEL)( b& w) I0 V) j2 t% z. n
        {* X1 q* E1 A% B  J/ u0 T
                // TODO: 在此放置处理何时用
2 u  p; S4 x) V: L; n                //  “取消”来关闭对话框的代码
2 B. [' b0 u% j! k* i        }
/ Y; V1 w1 b# E3 B8 s3 y; ]8 h/ e6 k5 b
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,. p7 U& a. |1 f5 [& `2 {) \* n/ Z
        //  而不是启动应用程序的消息泵。
! r# ]; T+ n% Z3 J2 Y9 W        return FALSE;# n! {$ v! M/ K4 ]+ b( z6 I
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 17:05 , Processed in 0.024813 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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