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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。9 B4 x- E% M# t! Z
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
) V' K1 Q" h6 k(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
- N: u! v$ {: H# S! K/ d8 |5 e(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接/ [' |$ t# }; t, d% ~
(4):重启执行VBS脚本,得到输出结果2 A. e9 P- F8 c
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)+ w8 Q& e! M. s" R
4 j" E; r, U/ [
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。. b1 H) e% q! o
   请高手指点一下如何通过这个acpimof.dll来获得控制权+ U9 S, R; G) U' i) c
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1557

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.$ S, Q4 F1 ]5 s* c0 N* J
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,5 j3 B4 h) C) t  A# u# a
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。: W/ r5 Z% b/ Y' ^
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
6 G3 E( B; p& p& y. g0 X* P1 t# G+ F 谢谢各位。, y# L% N9 C& M+ D) I! _
 

Using WMI.rar

1.08 KB, 下载次数: 1610

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
2 m' V& T; J/ r+ m* k2 a
0 Q( c% s( y. W// Using WMI.cpp : 定义应用程序的类行为。( z/ c( Z. m# ^7 Y! N
//
. _; v% S' A4 I2 t
0 m% [* q9 a3 E4 w  z$ D" V/ @#include "stdafx.h"5 f6 K+ f; K1 l1 a4 ]4 E
#include "Using WMI.h") }4 S0 I( R0 v9 N. B
#include "Using WMIDlg.h"# X# K7 o" [  T3 Z1 d, K

" C. @9 j6 a" Z4 f7 u, E& C#ifdef _DEBUG5 S6 z, t2 g) W9 ]/ P) I
#define new DEBUG_NEW( n2 n! \/ T$ n
#endif
, d+ q* @# Z. L9 g2 u8 q* Q3 |8 L% C3 z  j* Q7 _% d7 z
- u- Y6 N, n1 B. g, M, w2 g& J2 n
// CUsingWMIApp7 I3 F+ Z* k$ S

. I! d+ m  x- j& `BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)5 X/ e# J, T; m5 E
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
0 t. y2 Y+ z& j5 ~% ?END_MESSAGE_MAP()
) @+ {$ X; q' ]# w1 J5 E4 x, ]
& J: _$ c; l3 c1 p7 h2 z' X
# w# d/ g* a) |, a& N5 z& ^// CUsingWMIApp 构造. a# E5 k* @9 ?

! ?9 _5 G" x( W( ~CUsingWMIApp::CUsingWMIApp()
: e) v( k' B6 b: i! t" ?{
& b' a; R7 k5 P  ]        // TODO: 在此处添加构造代码,
/ m1 b9 D% d8 [0 x$ |1 P+ g        // 将所有重要的初始化放置在 InitInstance 中. X8 ^$ {: M/ F7 a
}  [6 z: z! W  p8 u' u

6 ^2 r7 q6 W2 b( T  y2 a7 i: T
. D9 G# a7 R3 `* B$ Y7 {3 V! a  ?// 唯一的一个 CUsingWMIApp 对象
/ X- k  h" L# ?8 l. K4 L1 B
3 O& W  Z$ F. `) M7 O' w! |8 RCUsingWMIApp theApp;* _+ y* v% W5 O$ ^; ^4 D& A. I

" E7 N0 s2 n9 ?2 {0 m8 x; y2 r6 L
// CUsingWMIApp 初始化- G0 \5 `# l! [6 r; A% u) @% Q

+ R$ H# {# B* N( n* b3 \BOOL CUsingWMIApp::InitInstance()
3 f! Y/ `! u/ U* c- A7 ^1 P{
/ H  D9 I) \/ S* K' w        // 如果一个运行在 Windows XP 上的应用程序清单指定要& c. }& V. q# x/ Z
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,9 u4 ?/ i  {# S" h5 h& ~+ k
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
- ^6 \7 \1 i; u3 \1 ]2 j        INITCOMMONCONTROLSEX InitCtrls;  }) z; o  P4 y* A0 E4 }
        InitCtrls.dwSize = sizeof(InitCtrls);  I; x5 [/ G& U9 F6 B  A) T  R0 ?
        // 将它设置为包括所有要在应用程序中使用的( b$ H" T! G. {7 _- J
        // 公共控件类。
6 M/ s7 A- [7 C/ s# v9 D        InitCtrls.dwICC = ICC_WIN95_CLASSES;
! u5 u, a; ?/ h* C+ K; r  s        InitCommonControlsEx(&InitCtrls);
6 P$ [# d. R$ `6 X! j+ ^& y
- t3 O( O9 n( A6 v! V+ h* {+ v        CWinApp::InitInstance();
2 Y" U7 h. K- q( A+ ^6 F% E
; u* W( c! ?2 F( q6 R+ s( r        AfxEnableControlContainer();/ M& F! V8 }: v8 u) l
! D8 ~* r" ]. @
        // 标准初始化2 w3 V5 }. D" o
        // 如果未使用这些功能并希望减小
* v% `) u4 K/ ?        // 最终可执行文件的大小,则应移除下列
9 k! Z9 c( t' y! ]% R        // 不需要的特定初始化例程8 A. {. }0 u+ X2 @
        // 更改用于存储设置的注册表项
& j' d9 l' g* j2 b2 ?8 g- k) Y        // TODO: 应适当修改该字符串,
' D: T4 d% ^, ^! _6 m        // 例如修改为公司或组织名6 w/ S, ?" D8 r6 R" N
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));6 w+ P) o1 C1 G: R  d8 ?. n
: o4 a$ y" t# H8 w
        CUsingWMIDlg dlg;
9 }8 u3 j: q2 @+ A        m_pMainWnd = &dlg;8 D( i5 T. o  `
        INT_PTR nResponse = dlg.DoModal();) j7 t# }; `* B; D9 g' z: n. `9 }2 _
        if (nResponse == IDOK): d; s5 _0 Z; |0 x7 J" y* u
        {
$ `; U* S2 g5 V6 t* v                // TODO: 在此放置处理何时用9 v& c4 c4 R5 j0 _* i6 M
                //  “确定”来关闭对话框的代码
1 m+ `1 O  i& \! T0 p6 S1 ]4 R8 ]        }5 i3 }1 k5 L( o- C3 M* D5 ~
        else if (nResponse == IDCANCEL)5 H; x4 h: M4 s& Y* j1 A3 x
        {
! A: n5 l& f8 q4 M                // TODO: 在此放置处理何时用4 i2 c. m* \/ V" l/ l# S
                //  “取消”来关闭对话框的代码
4 e7 m8 D# t1 z5 ]# }        }: l" _8 _- X: ~) V# f- }
! k4 b8 q; i7 J  @, k9 }' I' W
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
0 l- n& }5 @: R7 k1 [  W- r# q+ @, A        //  而不是启动应用程序的消息泵。
/ ]/ z! ^0 {1 y7 r: ^' X' Y        return FALSE;
7 I( ^3 e' x/ X% x' j2 Y}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 05:45 , Processed in 0.045137 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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