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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
1 i' k/ V( N" Q(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备! Z) q$ [. M) B. D7 r
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本: h% _8 i) C8 A' K
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
% V4 O* t1 J' S2 ?4 s. @(4):重启执行VBS脚本,得到输出结果
: q5 E6 w* R# f4 H# v5 u$ F$ d(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
( x3 g  }- d+ g1 b& s1 G( A
) C- [9 j5 i8 s* T" D问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
' |+ @+ L6 Z: y   请高手指点一下如何通过这个acpimof.dll来获得控制权
! ]; u% c* Q) z- M* E   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1642

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,/ @- k6 v! B: m" M! C1 n
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。/ e9 B! K- x' G2 w2 ^  w
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!1 e8 G( ~3 E2 ~! C4 E& ]& F
 谢谢各位。
1 q6 Z: Z" Q7 j& D+ A5 Z( A3 _ 

Using WMI.rar

1.08 KB, 下载次数: 1703

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件" r! y7 v7 i# o) L5 z

# V: E* ?+ l' i$ U7 X9 Z// Using WMI.cpp : 定义应用程序的类行为。, [3 }3 ~0 ~; Q7 z2 G+ Z
//
9 R( D) E& L$ Z% b# \+ a1 j& R/ a
#include "stdafx.h"/ R1 g( ~% l. A# k: u% O
#include "Using WMI.h"* K! E! H( ]- t" V0 R( B0 Y9 ]5 B
#include "Using WMIDlg.h"
) S+ x5 d$ T! _" ?+ ^9 H" y3 t/ z/ ^; w+ M4 f/ X1 z( S1 g" |  c& \
#ifdef _DEBUG
5 k  F' L/ h) K" h3 @#define new DEBUG_NEW
+ L% T& @" u8 Q; Z9 T7 R4 h#endif
1 @' Y6 e  B, {" y% F1 {3 S; p8 W/ K

0 y1 I$ Q. Y) l- }/ q7 x% L3 b: e// CUsingWMIApp% m0 C# I& f9 s* D
4 W( M( s2 x$ P# j1 t* o$ K, \3 {
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)0 \8 Z+ m! Q: ?* W
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
- m9 f6 R2 ?: ]+ vEND_MESSAGE_MAP()
. {( u6 T/ u1 D; M3 a7 g' G4 w& M9 _9 _% }" |

; F8 N4 A& J0 n; n: k. [9 w$ {$ l// CUsingWMIApp 构造$ C* v9 L+ C2 i" s+ }' l

0 h- X! U2 q: _0 D7 |. TCUsingWMIApp::CUsingWMIApp()
4 m  U; Z! q0 y1 H  |{
0 G1 A& z' |, [) e        // TODO: 在此处添加构造代码,
! T+ R8 u8 E! m  B        // 将所有重要的初始化放置在 InitInstance 中# r1 R* i: F* a* R* V( e+ y' h$ r
}; S% X0 j0 Y) U/ a- w& b

) Y& r% X8 F2 ~+ Z$ K. Q, [# ]- Z2 Q5 u9 W7 S
// 唯一的一个 CUsingWMIApp 对象, |2 v: o/ o; h  h7 G

5 {4 x$ ]5 E- d6 @: J( @; J; kCUsingWMIApp theApp;+ d4 m" u! }7 i# ]' h% ]' [
, s* P3 P' @, P, c! z8 g" X
0 @3 O! f' W4 u' U" O) ?2 j- h
// CUsingWMIApp 初始化
3 |1 K" A. ~  q5 [. Z' L$ [
; ^5 g( |) ]: I1 N# z+ `BOOL CUsingWMIApp::InitInstance()3 E" A6 T* _7 X. x2 f
{9 G& V+ l7 Q, L+ z6 B' K
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
7 h6 ^+ P5 o/ s* D+ K( m. d        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
( C6 U/ a6 D, e. `6 d# O8 [        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。3 @  }: G- A4 X  r
        INITCOMMONCONTROLSEX InitCtrls;
, }% g7 x, V- j9 n2 ~8 T        InitCtrls.dwSize = sizeof(InitCtrls);/ ?- W" o1 C/ x! r
        // 将它设置为包括所有要在应用程序中使用的
: m& `! |8 i9 j7 x7 f        // 公共控件类。: l% p1 j8 T- S+ u# N, G
        InitCtrls.dwICC = ICC_WIN95_CLASSES;' \) O! ~; m+ i+ X) Q7 c- L
        InitCommonControlsEx(&InitCtrls);( B, q1 t0 i, k1 q* h8 v3 u- \5 a0 A

% S- m2 ?! r0 o( ~6 |% g        CWinApp::InitInstance();/ m& C9 E% R+ K  ~

: h5 ~9 u, K& G3 ~9 F9 c& k        AfxEnableControlContainer();! z! E, W& _/ w$ I
3 g% G8 U: D! b- }
        // 标准初始化; O7 D+ {6 A3 R, l% k
        // 如果未使用这些功能并希望减小1 G& `% r" g2 ?2 l$ i
        // 最终可执行文件的大小,则应移除下列
; v& P% r! K3 W' {/ j        // 不需要的特定初始化例程
+ L% Y: p* i- D8 V        // 更改用于存储设置的注册表项% \+ \: c" B. [7 \
        // TODO: 应适当修改该字符串,
8 f- G( b2 Y) A) @) r2 K. \        // 例如修改为公司或组织名/ m+ @7 _: }- c' |
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));" P4 _+ a1 A" X: |! G4 K
$ ^  |7 h* i* _! L
        CUsingWMIDlg dlg;
6 l2 k! [7 d) G0 a, M: K        m_pMainWnd = &dlg;
4 O) ~, T# P! m( Z5 E$ H        INT_PTR nResponse = dlg.DoModal();4 `4 X) v$ ~4 F5 i1 U3 U/ p
        if (nResponse == IDOK)' D8 V* r; `6 s; A
        {
8 ], v4 S/ ?8 b  |: e) H. @                // TODO: 在此放置处理何时用
( F! N1 r% N7 f: @7 [                //  “确定”来关闭对话框的代码
: K8 T2 w5 _! L! [  n        }! l% x) x+ }$ I8 }' ^% Z
        else if (nResponse == IDCANCEL)5 Z: S5 e$ q& @6 y, I
        {' t: M9 q$ U/ c! ^
                // TODO: 在此放置处理何时用. O; O- [* i( V1 s3 K, |
                //  “取消”来关闭对话框的代码* N, p% l$ L1 O, Q
        }
. J9 ^& ?( U  Q2 O3 x3 u0 X6 s% k/ O, a3 m0 m  q( x$ `  g
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
1 v2 r- V* q6 U1 u* E/ f# h        //  而不是启动应用程序的消息泵。: l* \4 B3 G; a( `- r& A0 Q5 `
        return FALSE;- h  r* i; U* |2 p" I" J- x( g
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 22:14 , Processed in 0.077583 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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