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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。4 _8 h3 w9 k- }9 H* Z* p! _
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备& t: Y' Y9 h$ ~0 v7 K% `2 Y
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
$ N7 h; U' {& j% C6 E$ S4 E. }+ |(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
' G2 N0 _$ \, h, D(4):重启执行VBS脚本,得到输出结果8 Q! S: G' t; P* u4 B
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
0 r% B, o; n( N3 b4 D
  M# j# _" x8 T6 A问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
' S2 D* l' t( c6 b) g0 V+ Y& [   请高手指点一下如何通过这个acpimof.dll来获得控制权2 C  k: Y: c: `: {# U
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 821

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.4 K+ p( ^* g2 g' `7 }& r1 K! q1 ]
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
* l! F, g* a8 `+ S% A! @peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。0 A' G$ x, C% y/ V3 p
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
2 D% q/ X) v' ?% v- I1 b 谢谢各位。
  T3 H) Z# g5 P) @/ ] 

Using WMI.rar

1.08 KB, 下载次数: 860

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件  {5 n: z/ {. k# f2 y
) {5 C" s  c/ ]/ h& n& H
// Using WMI.cpp : 定义应用程序的类行为。. f( ?: ?( d! H0 |" r2 f
//2 c0 J. `. K6 i$ \! X$ _  c! B
* O, O9 d; r, O8 e5 K. A7 z
#include "stdafx.h"9 A! P$ I  v! G6 p3 F+ ~& l
#include "Using WMI.h"- L& _0 |% @$ q& n( H2 C& f
#include "Using WMIDlg.h"* ~' P! S( Y* b2 p% E

8 W4 H$ R' i" o8 G; B* ]#ifdef _DEBUG
3 d; ~$ Q0 V8 ]. U#define new DEBUG_NEW
; G' \0 U) o; S5 B#endif
' t5 o! Q# o. i$ x: ^4 r; b% t( u

& @5 ]7 c/ I5 j6 x/ ^' y' Q// CUsingWMIApp8 a: J7 g* H- }* P3 o- ^2 |

# q% E' o2 _) p. Y9 M3 D+ ?BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
# w$ G2 h9 f. d1 u! _        ON_COMMAND(ID_HELP, &CWinApp::OnHelp), E  a8 D( I6 W: @3 s6 }
END_MESSAGE_MAP()
( p5 a9 K& [0 K0 e3 M* p
0 H2 i$ h+ W% G3 m
' M" D* b* E+ t0 N: P4 L; h// CUsingWMIApp 构造7 [& m; M7 T  D. i/ `1 u. J5 G

+ \' x- w% [; ^/ A8 s0 \6 t# f7 PCUsingWMIApp::CUsingWMIApp()
1 y0 u% G) s: G{
/ ~1 j( ?2 u# d5 p8 u1 A: |+ Q( p        // TODO: 在此处添加构造代码,
' H& O0 U& {6 C" H2 n        // 将所有重要的初始化放置在 InitInstance 中
% J1 A" w* x8 U% Y}% h4 C% K2 l6 @& F

- N, h8 y- f  G1 c+ Y0 C/ h) j8 u1 `
// 唯一的一个 CUsingWMIApp 对象
, A9 ^' M1 l! V0 q
* s& e: b; T7 |, ]* W" BCUsingWMIApp theApp;' }4 u0 b% V/ f0 `3 v4 e) C9 J/ ]/ s
. V: ^5 P+ }% o+ ~. G
4 I  j' e; j4 B3 u! u( |( l' R
// CUsingWMIApp 初始化
+ J8 ?& O* Q( y% u- |% }+ _
  o- ]: W8 ^5 V1 O/ SBOOL CUsingWMIApp::InitInstance()& M& e2 b+ l" L1 A# n' ]
{
: b6 c, _  q9 R" c        // 如果一个运行在 Windows XP 上的应用程序清单指定要
; k% [2 H& M9 n6 N        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
; s' B7 V0 a# P. q: v" U        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。- a3 F- R2 {' W" b
        INITCOMMONCONTROLSEX InitCtrls;1 n3 }: G( ?9 d* U0 H6 n: e8 \
        InitCtrls.dwSize = sizeof(InitCtrls);
; H( d- ~9 b6 C7 a, R1 m% w        // 将它设置为包括所有要在应用程序中使用的
; e; P" m) z0 P. }        // 公共控件类。
: S. P( N; r( H) A; t2 ?        InitCtrls.dwICC = ICC_WIN95_CLASSES;" t  f+ W+ p. s# Q/ M
        InitCommonControlsEx(&InitCtrls);3 s3 F7 O. G4 o0 d2 J

$ S* F/ J7 X' S& }% t7 g/ e0 d* Y7 G        CWinApp::InitInstance();
1 G7 ^+ i& [, s; |! L) ]& _
7 s2 H6 A" K6 o        AfxEnableControlContainer();
+ z- t  ^4 G4 m
# e/ D/ |- `$ V5 C' \: Q        // 标准初始化
. y+ p0 L" R8 c3 X' O/ E        // 如果未使用这些功能并希望减小
- C5 [) i3 Y6 `! t        // 最终可执行文件的大小,则应移除下列: I* i+ F7 @. y
        // 不需要的特定初始化例程
1 k8 ~, \% N! U1 s5 C        // 更改用于存储设置的注册表项5 F  ?( C" O3 w! I% u
        // TODO: 应适当修改该字符串,
  u9 T2 m) F6 w        // 例如修改为公司或组织名
/ [* x! c& k* f- D- [; `        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));  n6 @. m0 B1 n

5 i! f+ G' \; h4 ^/ {        CUsingWMIDlg dlg;
$ @- B$ e) [  i3 [# k. h, Y        m_pMainWnd = &dlg;
' i2 y" W5 L4 j% D, I! _        INT_PTR nResponse = dlg.DoModal();
( g9 ?" H+ D) _7 M: }7 o5 U! @        if (nResponse == IDOK)
) Q( a: L1 H# \) p8 v1 Z: F0 e        {
$ A5 k# c+ F; {9 W8 V% x; @# h                // TODO: 在此放置处理何时用
* c: T. v8 R  S) f) S. [/ g                //  “确定”来关闭对话框的代码, u- u- W5 }4 n3 V, ~8 U) T- z& u
        }
  n8 O0 B5 H+ J9 Q) Z/ n) ^# \        else if (nResponse == IDCANCEL): `) z/ H4 D3 }& r7 O
        {
# ^8 q9 H8 ]: K5 D+ U3 J1 h                // TODO: 在此放置处理何时用4 |0 N# \! a) x7 [
                //  “取消”来关闭对话框的代码
5 ]5 j" G. O3 y        }
! K/ D5 l: w5 d/ K  U+ N8 `% q2 E6 g% K2 q1 z' s& S- P' x7 c
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,5 s5 |! R" }: ?1 ^. K+ i( X$ y
        //  而不是启动应用程序的消息泵。) w- I, f2 J( H% s; ~/ m
        return FALSE;
6 }: h" y0 U2 ^* M: W}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 02:11 , Processed in 0.056637 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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