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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
+ G7 S+ \. X# o! |4 ]% j(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备1 R8 O0 p* j' V% L' R) p$ y! ]
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
" o8 @' ]* W$ @1 d: ]! ?(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接# v0 Y) Y  \" C* k
(4):重启执行VBS脚本,得到输出结果4 f5 I; w# h' J, q8 P5 Q7 G
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)& T" v" y' w3 ~
! `9 t+ Y2 Q" }( y7 `, N+ o" [" }
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
9 y; P% s7 U; U5 L( b. n" J) h   请高手指点一下如何通过这个acpimof.dll来获得控制权
  k& t; ^" A5 M0 M& P   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 934

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.0 H3 O; b- u+ a( U# h5 S4 m
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
& N5 D& \7 y6 Gpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。4 d+ ~' j3 x) D( J% X# {5 p
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!2 x4 D+ H1 t- P7 i+ K0 [
 谢谢各位。
! p: G6 ]0 s8 C2 a 

Using WMI.rar

1.08 KB, 下载次数: 955

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件* S( P! _- v2 V! Y- L6 w" U
0 a1 N% w0 D. C6 E5 y, F. R
// Using WMI.cpp : 定义应用程序的类行为。8 b1 j; F& z$ c! x% m8 j& }' W9 X3 [
//
# \' s! u% Y4 m  r6 v" M0 ?0 u' Q$ f6 a/ G7 a
#include "stdafx.h"! r+ D2 C5 Z1 O- r/ @4 j$ `! P
#include "Using WMI.h"
% A# A! X' O; o6 ?% j#include "Using WMIDlg.h"
" }5 k! v4 }- D) Q7 B' Z' F3 Y% d, P3 V
#ifdef _DEBUG
0 c4 y3 t: m2 u% S#define new DEBUG_NEW2 z# H2 x' [0 ?
#endif
5 e" o: N; h/ U
9 F& s* C& [# B( v' H; m9 X
  _+ b  p* @! i0 r! S. f9 M// CUsingWMIApp
4 K3 e) c  o8 Q$ x- C, Q; D
. R" K7 q& [6 LBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
$ K+ `- ~, ^* y! L7 t# m+ A8 S+ C        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
- o  j. Z* ~3 y+ E4 @- P0 eEND_MESSAGE_MAP()9 Q7 z9 K7 S5 L0 \3 k6 n

5 K6 N0 h- @3 f$ {. Q! O9 \4 z, U( b8 B3 w% [" n$ z
// CUsingWMIApp 构造, I% ]3 E3 F% W5 ^
0 V" o1 j3 G5 H& j% J* d
CUsingWMIApp::CUsingWMIApp()! g$ B- ?: k" H/ y- i, x
{1 F9 _1 N+ t+ Y: F- h; v0 u
        // TODO: 在此处添加构造代码,) d9 h- K/ W6 x- s# S2 @
        // 将所有重要的初始化放置在 InitInstance 中! q7 b9 t' X' U9 p5 c8 p# a" U# |0 s
}+ f. a6 p% q* O0 o
% I) E5 |& q) m6 e  S$ e, v
1 s, j- Z) M0 `" V, V" p
// 唯一的一个 CUsingWMIApp 对象
" d8 ^5 A7 A4 x. o" X' G. B! ]( A' [4 O8 T$ A+ B
CUsingWMIApp theApp;" m6 U9 B/ a' {+ O7 g. d" f7 S" U
  G% R8 U7 x3 b' p; C

0 X8 D( O) Y8 x2 d7 A// CUsingWMIApp 初始化
7 r# f9 ]( V- z8 K, Z% v0 e' X5 z
& F9 j7 A* _! GBOOL CUsingWMIApp::InitInstance()7 r4 r$ b# e  |) }5 A/ G
{
" p) z3 C9 ^# x" |+ w$ Y5 o        // 如果一个运行在 Windows XP 上的应用程序清单指定要
4 S7 Y' W" P, V0 `        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,0 S& G$ v! g: i2 d9 W
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。3 T; |3 _( }& S# P! `! w
        INITCOMMONCONTROLSEX InitCtrls;
: }0 M3 S' s5 J' c7 ]5 b5 h        InitCtrls.dwSize = sizeof(InitCtrls);7 r3 j! ]# y8 {5 q! c
        // 将它设置为包括所有要在应用程序中使用的
, M+ y& u4 K$ Y- s: }$ O        // 公共控件类。
6 u9 _  U, U8 m+ a; Q) z* s/ ^        InitCtrls.dwICC = ICC_WIN95_CLASSES;
! x: V% g" t0 w9 l% K        InitCommonControlsEx(&InitCtrls);) e% V& Q5 L, e) O4 N

; [9 P& H9 |# g+ P        CWinApp::InitInstance();
' d" X+ H/ Q1 h, Z! |. _* ]4 ]6 J* |1 U+ |
        AfxEnableControlContainer();
9 P* }. B$ j/ z0 ?2 ~$ Y# F+ A' \
        // 标准初始化
& P; N* F, Z. E% D7 n1 O( W        // 如果未使用这些功能并希望减小; e5 u% I! e0 o# ^  Q- B
        // 最终可执行文件的大小,则应移除下列, H2 S" }2 _. ]9 I+ _. t% Z% k
        // 不需要的特定初始化例程
$ X/ f- r0 S0 e# m8 {        // 更改用于存储设置的注册表项- u4 _: ~4 d% p0 e6 l; o
        // TODO: 应适当修改该字符串,0 W6 P- b( f. R. |
        // 例如修改为公司或组织名
: _3 G5 b' @& H! U        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
( t% \, r+ @( J+ ^6 @
5 Z! [; W& p8 [  ^5 m$ k5 s* J; H        CUsingWMIDlg dlg;7 d3 G3 A" I+ ?. f' _5 T6 ]
        m_pMainWnd = &dlg;
! W2 l& ]$ R# r4 }8 I; A        INT_PTR nResponse = dlg.DoModal();
  w# l3 M7 Q. x! e& p        if (nResponse == IDOK)
5 c1 W. m. x- I/ f+ c8 F        {7 V# i: Y# o! Z3 ?6 V
                // TODO: 在此放置处理何时用' y* |- V% X% ^9 D1 ?8 i) J7 o
                //  “确定”来关闭对话框的代码2 P  r3 ^* s) F
        }
# o9 ~8 o$ }# P4 y9 v; Y* _        else if (nResponse == IDCANCEL)  u8 X/ `- M- W- X' c, ?
        {
& V/ s0 f& y" i+ ]                // TODO: 在此放置处理何时用2 s8 Q' o7 W2 y' c' \+ I3 c7 A
                //  “取消”来关闭对话框的代码
- e6 s" X) f  }% B        }& y+ r4 [0 ]$ a7 y* S

# v2 P$ l1 {: n$ r3 N& q1 m* S6 K  d        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,+ n$ r  f, k2 b0 _) T0 E) U6 c
        //  而不是启动应用程序的消息泵。: o1 p# y8 U) p  N$ I
        return FALSE;
- ?) t3 ?" f, d- r}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 02:46 , Processed in 0.116482 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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