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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。/ ~- o5 J& l/ l. Z( W! Y
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备6 }; m, m1 `& A: C  _4 V. k  q2 d
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
: _, F! w, m6 P% U. s& {(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
' ^! v% T1 P4 M(4):重启执行VBS脚本,得到输出结果
* p. X) l% L6 I2 i$ n2 ~! R& u(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)4 a4 G' x! |: h4 _) U

% r8 S& F$ F, F问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。( G/ [# N1 b# N4 ~& W) I$ @
   请高手指点一下如何通过这个acpimof.dll来获得控制权
3 z% o; z) ]0 V5 H6 L   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1673

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
/ y  S3 ?; u' C* c$ Zpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。8 _9 M: b$ G5 t1 h9 E+ ?
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!9 q$ N4 y6 K6 M- t% K
 谢谢各位。% |! n) v" i% u5 h; @
 

Using WMI.rar

1.08 KB, 下载次数: 1722

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件9 ]7 g: B( Q7 o6 I+ {

5 e: j  m  p" W: E9 |// Using WMI.cpp : 定义应用程序的类行为。
6 C8 \  X' O. M! D//8 @9 ]0 S  L0 N  g$ k

' p" o" a* ], j- Y' I1 l! }* l#include "stdafx.h"
% E, b, R; P( O: @/ F#include "Using WMI.h"' r& W; r$ W9 W; \6 w, g
#include "Using WMIDlg.h"( y) M/ s& [- }0 `  p

$ [( F! Y' z0 Q/ d#ifdef _DEBUG
1 x# g- C5 d9 K, l/ n- Z2 v  ~#define new DEBUG_NEW
' w& m/ x- L, `: A* J& s#endif8 J7 ]9 f7 r$ f6 E5 B% i3 S* Q. V
0 D# J: u' r4 [* Z

- L5 H) i+ N4 A3 |2 k& N6 M// CUsingWMIApp
( d8 z% T* {. U9 r" h
: {  a% ^2 U5 j/ ~BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)# I. y* \# T% H7 f! H% N
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
$ H; U3 o. h# }. F. Y( j  r6 p  kEND_MESSAGE_MAP(): F; s+ d' i$ y! I  M( o( D& W7 P
& [; l7 C! `3 y4 y9 E. n
+ S! E- x3 H5 s( W/ i; h# @5 n
// CUsingWMIApp 构造9 @4 k4 e( k0 c+ B' ]. H: K+ p1 d
/ n0 j2 F4 Y! r1 D+ k8 L
CUsingWMIApp::CUsingWMIApp()
4 @8 y! H% L4 s& ^. d" \+ ~/ S% p1 N{, @3 Y. u) K; u6 X4 `
        // TODO: 在此处添加构造代码,/ a- g% A+ r' C  U" [
        // 将所有重要的初始化放置在 InitInstance 中
4 }" M9 Z' W: h' |}/ `) j6 x( q) L" W
& b# g& Y3 t: G) h4 n
$ }. p1 b% e1 K+ [* q  ^
// 唯一的一个 CUsingWMIApp 对象. G: W: o* @1 `6 o% R7 m
0 G1 ~- T/ H: i2 {8 |- k
CUsingWMIApp theApp;
& W+ X( k+ X9 \" d% g. l# z
. Z1 C' y. ^. S; {# I
; m6 W/ y9 C" A// CUsingWMIApp 初始化/ h. z8 L, o, E! k1 {

+ m2 I/ ~: w6 q& B. X6 ^BOOL CUsingWMIApp::InitInstance()* [, H* h/ B" g& K3 t( M
{/ A: O' j9 p) @4 N5 }4 ~! A( [, n
        // 如果一个运行在 Windows XP 上的应用程序清单指定要6 s/ G0 W; D9 q: l, a
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
8 W  k! h, H9 n        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。4 ~3 |( C0 B* w- Z1 ^' b. a
        INITCOMMONCONTROLSEX InitCtrls;
8 y" P4 k' a0 B. j/ U        InitCtrls.dwSize = sizeof(InitCtrls);
$ K4 r9 h+ A2 z. I4 j        // 将它设置为包括所有要在应用程序中使用的
  t  U7 N, v& _, K0 X        // 公共控件类。! x: [& C1 a3 u4 z
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
8 Y# O" J; E& L" H: d) `: x        InitCommonControlsEx(&InitCtrls);
! k0 h0 f+ h, f. T4 i. s0 l4 F! F! h6 ^
        CWinApp::InitInstance();
+ W% g2 |. h5 [+ ~: }) n
9 u: I) r$ }2 f, K) p  Z        AfxEnableControlContainer();
8 p5 `+ L6 W0 c" k/ C1 [8 V) S3 B) D; `6 N
        // 标准初始化
6 q. \) H$ J6 X& U        // 如果未使用这些功能并希望减小+ \8 u+ f* E2 D/ P. k
        // 最终可执行文件的大小,则应移除下列0 ?* m5 y; g6 k; P) x5 G
        // 不需要的特定初始化例程& m1 S1 j8 {7 q& J4 a
        // 更改用于存储设置的注册表项8 L6 I5 A$ r8 g' d0 O6 z' N
        // TODO: 应适当修改该字符串,  j9 b2 j7 Z/ C( j1 \2 A2 b
        // 例如修改为公司或组织名# l+ @, ^8 _% G. j
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));, O$ z9 c3 m% X* S7 r; y2 h
0 H+ O- p- R& `3 F
        CUsingWMIDlg dlg;
. F, F4 ]) x) O/ v+ ^        m_pMainWnd = &dlg;
5 h0 c- b4 w0 D' C6 H9 y) [) [9 x        INT_PTR nResponse = dlg.DoModal();
; I( m7 C( D) F5 ]: W. e) [! `% X        if (nResponse == IDOK)4 `2 S" h+ Y% `0 w
        {( C( C+ ^# Y) b. G; X5 d" l! t+ N
                // TODO: 在此放置处理何时用
. w3 A) c$ u+ r! ?( N9 d4 H                //  “确定”来关闭对话框的代码
' K+ `7 M* _1 a        }
9 f+ K" a# O+ O& r2 ?. g        else if (nResponse == IDCANCEL)
1 b9 Q+ m/ B0 u        {% j, [" x# G  E% j" ^8 G# T1 O0 X
                // TODO: 在此放置处理何时用8 ]% ?# {0 v7 a: P1 d, i
                //  “取消”来关闭对话框的代码0 W6 p) X! P% B4 K
        }
* Z9 g) M) z" c+ u. L, n2 L: @9 R5 r$ e: G% l9 t  @6 ~/ f
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,( B& m+ V- A. F# M( C
        //  而不是启动应用程序的消息泵。
1 j# e: v5 K- h" Z5 i6 A% c9 v' ^% x        return FALSE;
% Z% ~2 L8 ^+ p0 T}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-1 21:35 , Processed in 0.115579 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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