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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
% P0 V0 L7 @! d' U0 ](1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
$ b- j6 b# w1 N- Q(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本, v2 N# ]; O2 b; F- c) H
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
; e/ a) x: Z+ |/ x( C/ a+ w(4):重启执行VBS脚本,得到输出结果2 A# C/ B: l% {: g* i% c
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)6 M% o2 w5 Z+ K' L/ K

: N; B) }9 |1 L" c$ ^7 {- Z问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
/ Z& N* N! i# L1 U# J   请高手指点一下如何通过这个acpimof.dll来获得控制权
3 G/ E1 L1 w$ o: C* o% R+ S. W   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1568

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
9 E) Y, N4 P6 X! Q" K我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,  ~9 ?6 ^! E  Y: i0 m( m! K0 l/ Q
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。- ]0 V7 M" o1 w8 a" g3 ^* p
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
9 z0 G5 D- M. s8 y: K. } 谢谢各位。
4 [. k$ ^" C# o3 D/ D& h2 s; O 

Using WMI.rar

1.08 KB, 下载次数: 1622

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件& J5 m0 x* S0 C& U* ]

' b4 o6 ]- N, ^# s' Z7 ^. U6 t9 F// Using WMI.cpp : 定义应用程序的类行为。4 a5 j: [0 Z* e1 u+ s8 Y
//4 H3 r1 C) e* p
. p9 c& N8 ]2 w3 {- T& ^8 q; K
#include "stdafx.h"+ e9 Z: B1 c. X2 H/ u
#include "Using WMI.h"
- q2 `" X) U* N# r#include "Using WMIDlg.h"; b- u/ M2 e3 o6 R

) r2 r. A: I1 f9 T4 B1 E' H#ifdef _DEBUG
0 j8 b& H7 h6 G#define new DEBUG_NEW2 ~/ B" G/ H2 R. W3 p; s7 m
#endif
$ }; T4 R0 J6 w- Y: U. p6 R9 p. Z9 q) R" g  h$ Y* y

9 }6 x! C& o+ A- h. G5 z* F1 z! q% n// CUsingWMIApp
7 y. l) u( w5 D5 E. ]! h
, f, l% g  a5 }! S* NBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)$ A6 u$ z( b) g9 V/ U
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
5 p5 F# ^0 W# e  MEND_MESSAGE_MAP()* j* q+ r' g, C6 W* s2 U

1 [& N% ?: ]. n; e& R3 y( o5 [& x7 b+ _, a( e
// CUsingWMIApp 构造
0 [: q' {3 b$ n! Z
: O$ Y6 b7 r2 c3 B' l8 DCUsingWMIApp::CUsingWMIApp()
1 m) L3 b5 V1 j$ _8 D( r{
9 |8 m( G/ p' ~. h, Z        // TODO: 在此处添加构造代码,
* F7 \3 [* m/ J  T, K        // 将所有重要的初始化放置在 InitInstance 中5 X, h; z( S7 U  P9 S6 ^
}
4 j6 \9 H; D8 z" _6 P/ Y" j  E. @! b8 M- T6 ^+ S* \& X9 E

* ^1 B% e+ a2 U2 L$ |// 唯一的一个 CUsingWMIApp 对象
9 F0 n" w* ^: |# Q3 o" E( [/ B# i" _. S6 {6 l6 Z
CUsingWMIApp theApp;% w! l; a6 o" C: X

) ~+ x/ W8 \* B" h& r2 ^) T( o* c5 J7 u2 {+ A
// CUsingWMIApp 初始化
4 p0 s, U( C+ {! j; ^% {) z# `3 U4 I- d0 z6 ]1 y- C. F. V& H9 R  B; p
BOOL CUsingWMIApp::InitInstance()
5 A3 f* Q7 y$ C$ q2 Y" V: k' B/ T{
$ V3 c; L; S' H' ]6 V9 w6 ]        // 如果一个运行在 Windows XP 上的应用程序清单指定要9 D; q* s  c( W0 r5 k
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
' f( D) `; [$ {$ m! F/ d! P        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。, q# }% b  g! ^8 }! W
        INITCOMMONCONTROLSEX InitCtrls;
" T/ I+ m2 M( L, J& ]9 {- r4 I        InitCtrls.dwSize = sizeof(InitCtrls);
& d9 y  C4 l# N2 d3 N        // 将它设置为包括所有要在应用程序中使用的
! N, G2 ]8 i5 g' d0 V) V        // 公共控件类。, Y4 j4 O; m' c
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
: ^) e" W1 L7 u' t: }        InitCommonControlsEx(&InitCtrls);7 T! c+ f7 z2 j- R0 W% S1 ?; q  q

, M4 h) s! Y: r: E        CWinApp::InitInstance();! z. _2 E3 h' Q. T
1 m0 l* z, N$ i8 d: r7 p
        AfxEnableControlContainer();2 q6 B/ `" B+ L* K& _4 T
8 P: r( ?3 [- m) w
        // 标准初始化3 [) ~. ^' L. c# t* B6 ?
        // 如果未使用这些功能并希望减小. Q( c3 \  Z+ i  f7 B' Z, Q0 y
        // 最终可执行文件的大小,则应移除下列+ k$ o' H/ [/ ?. h3 l% ~
        // 不需要的特定初始化例程
( `8 R! w- V) B3 L( R5 G. O        // 更改用于存储设置的注册表项
) f' m9 u: K4 L8 B* }+ }  ?        // TODO: 应适当修改该字符串,. d+ g5 H+ c/ N. _( v
        // 例如修改为公司或组织名3 y8 u4 j$ ~9 {+ w0 ~9 q) U2 |+ n/ M
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));3 S4 P- d4 c7 |$ B, M

; `- L1 ~7 w* Q% x        CUsingWMIDlg dlg;  v, _! u% X/ p/ w+ ^0 q( T0 _
        m_pMainWnd = &dlg;" [; \: e9 N& v+ K; T: V* Q& t! s! U
        INT_PTR nResponse = dlg.DoModal();
7 t( V* f) H, E1 a        if (nResponse == IDOK)! o9 F% T3 m8 w! W& X- K
        {
- `5 X6 N" s7 A/ e                // TODO: 在此放置处理何时用
& z8 J4 B2 q# \, W, K0 f6 i                //  “确定”来关闭对话框的代码" n& q. s$ L: Z; }- m/ V
        }: Q8 j2 c& K& s( ~  t
        else if (nResponse == IDCANCEL)" I& R: |# l& X. c
        {0 M) e1 O, M. d5 k. _6 y
                // TODO: 在此放置处理何时用# a8 `, a6 b1 `# m( q, @
                //  “取消”来关闭对话框的代码' x+ n$ y6 z/ j0 V$ D$ ]
        }
: M5 o, r# F4 _$ p/ H2 a& [
$ h1 {! e% z, I: C        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
' p' N2 |) J) O& K5 |/ H$ h        //  而不是启动应用程序的消息泵。
9 m$ n* s! I3 G6 S$ \        return FALSE;5 L7 C2 A3 p( t( p0 z) I- T9 N
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 07:37 , Processed in 0.624413 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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