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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。, E) Y7 K, F+ L/ W6 l" j1 i. x
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备! a4 Y0 o# ?. m! B7 d
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
9 r" G) O6 E) T(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
: d, ?6 i3 V6 d$ s* B+ n8 B, e(4):重启执行VBS脚本,得到输出结果& ^# f* e3 D+ w! G8 ]5 S' p% [
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)1 O" u2 P+ Q( ^$ h6 ?" Z
$ H3 a# V3 o- `* _, }7 H# W
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。1 j/ r+ m: K1 q8 o7 A
   请高手指点一下如何通过这个acpimof.dll来获得控制权! F9 f6 i2 U$ R& {- u
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1554

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
( O$ L' v, z7 N* |7 I6 [6 O我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,5 t9 D- ]4 W, Y5 j
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。2 s6 p- {2 c5 e. x: [4 O0 ?
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
2 ^2 a1 Q5 i* E 谢谢各位。" \/ Q9 {  e- ~9 u' n* h
 

Using WMI.rar

1.08 KB, 下载次数: 1608

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
7 l, _4 b( R4 n% p% q7 P" W% ^$ J$ @: Q5 ?2 @0 V; w
// Using WMI.cpp : 定义应用程序的类行为。
6 L- x$ f1 C2 q6 a) }8 n//+ E& l) i+ r/ V

" m, n7 v+ K. i0 a8 q#include "stdafx.h") R: m0 p) U3 Q
#include "Using WMI.h"7 w( ^5 t) L" t+ \
#include "Using WMIDlg.h"1 `2 W4 ^7 @4 M- ]- b6 U( y. S+ }
/ I0 t; B1 ^: w/ R( k9 n
#ifdef _DEBUG
* `3 L4 d/ K; T: V6 ?/ u: W#define new DEBUG_NEW
8 C  F3 `' F( T9 ]% J#endif
7 i$ ?- d  {1 E" T8 ~6 m, [9 ?  D" u6 m1 b$ Q. q5 f' l$ W* G
" u  u6 ]* ~+ q1 a$ a
// CUsingWMIApp) V$ r9 i1 w  S5 X/ _" Q$ i  O# D: I

$ |- W) l. {% p6 {4 _, OBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
+ @/ [9 v: `& H$ _) v        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
  C( f; O& ]$ c" t0 @& @; |7 wEND_MESSAGE_MAP()
& b4 T, u' A( m8 z$ p$ T2 b# z* p  \! j& ]& d7 d

+ H  ]7 Y; @* C% E, g  M% o, j// CUsingWMIApp 构造( i$ g) ~  u9 ~- {( ]

' V" d6 O2 v( d2 uCUsingWMIApp::CUsingWMIApp()
0 F" m* ~! A1 g! ~: i: _. d9 B{6 G9 r" A; h4 f
        // TODO: 在此处添加构造代码,: b9 t$ C/ \: o' O  W  Z8 n& c# I; G& s
        // 将所有重要的初始化放置在 InitInstance 中8 m8 _$ ^  Z, [* l
}/ X1 \$ y. T1 R# Q

# {5 E  Q4 B$ G" ~
2 F7 X  W, l. D3 ~$ l. ~' {4 x// 唯一的一个 CUsingWMIApp 对象4 T- r4 m$ H5 Y5 s0 ~1 W5 `
& J! }! g6 {1 Y4 ~! j0 S/ g
CUsingWMIApp theApp;
, z( f) Y9 S+ O0 @
/ Y) y5 g: X# f- Z" u* `( `5 Q4 v# S  L$ W# Q2 p( H
// CUsingWMIApp 初始化3 A3 s# f, ?. l# x2 N
: ?2 H) \* B% [  C" \
BOOL CUsingWMIApp::InitInstance()
2 g9 g+ }6 R/ w; g3 L' K% j" q{
9 P* p/ I: x9 L7 {9 W        // 如果一个运行在 Windows XP 上的应用程序清单指定要
, Y0 C9 Y, D/ l4 \$ u1 W% Z        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,% H( i! |7 q& C) r
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。1 b# s. k/ S; e. z+ l7 g1 F# i: F
        INITCOMMONCONTROLSEX InitCtrls;2 z9 ?% d  Y) }4 V+ i6 I, `
        InitCtrls.dwSize = sizeof(InitCtrls);
8 _3 g0 O. m$ F        // 将它设置为包括所有要在应用程序中使用的
# d- Z7 U2 P0 m+ ]        // 公共控件类。
' K2 ^* C4 j! s% @3 ]        InitCtrls.dwICC = ICC_WIN95_CLASSES;, z9 i. j0 d0 S/ k; ?" J
        InitCommonControlsEx(&InitCtrls);
5 x% G$ ~3 j  V. H+ r, y3 i. O5 p7 M+ D4 J* F5 o' r/ v  i
        CWinApp::InitInstance();
5 r4 Q- Q) c- I% ~, a% x
+ h0 @1 O. N$ K2 k3 Z        AfxEnableControlContainer();
7 y1 b0 a* e' g; K' P5 j5 J, D& b6 r% A- w+ L' O8 w8 E
        // 标准初始化
) }& U4 V$ k- m2 Q        // 如果未使用这些功能并希望减小
! l5 h' [1 O& E& l: w        // 最终可执行文件的大小,则应移除下列# i5 f: y) v- X# ]
        // 不需要的特定初始化例程/ c/ _/ z5 d% R* w  ]
        // 更改用于存储设置的注册表项
- q4 I9 b3 a) m7 t        // TODO: 应适当修改该字符串,9 y: z) x5 I6 i. l7 z
        // 例如修改为公司或组织名
* N) r6 j4 v! Y) W5 K9 n% N        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
0 b: T& U9 Q' ~
( Y" Y9 ^* c! }9 c        CUsingWMIDlg dlg;
; P9 i; ^/ l! a        m_pMainWnd = &dlg;
6 ^/ }+ m, U! K) J/ W* H        INT_PTR nResponse = dlg.DoModal();
+ w3 ^7 u% j7 A6 h" u        if (nResponse == IDOK)# c5 [5 J5 n4 u: R3 J
        {
; l  {! [; B' z: v- v  k                // TODO: 在此放置处理何时用0 G0 ^% j/ ]/ s" D+ B( Q" X
                //  “确定”来关闭对话框的代码- V5 a% u8 D/ S0 h9 C( x+ K2 i- C
        }
) M& t; J# q! |3 _        else if (nResponse == IDCANCEL)
$ ^" E3 p: Q0 j% m3 d1 _. {        {
4 A9 ^2 r. G+ o# z/ l, e1 u; [                // TODO: 在此放置处理何时用$ k8 Y" h( _9 X1 U/ V
                //  “取消”来关闭对话框的代码0 t  x: O$ W$ s3 _% h
        }
( t( K& E- r$ U; S) R! t, x2 n1 \
' d1 i2 j6 C8 b; I( x        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,! S" x2 k" U: G/ `
        //  而不是启动应用程序的消息泵。  o# V1 O  G* I, V9 ~
        return FALSE;
. `( N# Z( ?+ G( ]7 d" ]) X}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:10 , Processed in 0.151856 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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