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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
9 A0 `0 [0 u$ f3 u(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
2 I2 n+ D9 Z$ \4 q3 C(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本+ p4 B; ~0 i+ v/ |
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
$ W1 ^$ z! _7 N% N3 W" M* S1 l(4):重启执行VBS脚本,得到输出结果8 Q9 b" I: E! }  v6 F0 w
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)8 G2 M) }! s0 a$ W4 }

3 o8 L3 l, B4 h问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
7 d' X$ _8 x* O   请高手指点一下如何通过这个acpimof.dll来获得控制权
+ t, @* C: ]" R- \6 L- V8 z" z* `( C   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1554

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
3 B+ t. l# L; X  _4 k我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,& q7 t4 I2 j. ^: o; N7 g/ o  `
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
5 d8 z8 g+ j$ S  e1 A或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!9 {, g2 N1 e% L' [
 谢谢各位。
* m: [* `" a$ N  m2 g3 @" Z' y  K$ x( W& V 

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说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件5 K3 _$ U! M3 x0 I9 r6 z' @" g

  |1 s! o% o8 w0 o# p// Using WMI.cpp : 定义应用程序的类行为。) P, F0 n) {0 a# h5 I1 p# T
//
! X8 w# H5 }! D1 k; V4 ^4 `7 D5 ?7 i8 k! Z  P/ c# d1 G( W
#include "stdafx.h"
! Y8 c! u7 \9 J6 y* ]#include "Using WMI.h"% I+ x0 H. X/ U  p- M1 c5 s1 L
#include "Using WMIDlg.h"( k  O2 D' l% Z4 e- d) W
: Q- Y) B: n% A8 @, H: B
#ifdef _DEBUG1 @7 W# }+ u  q* @/ e
#define new DEBUG_NEW
8 K3 x) Z6 F  Y# A7 L, Z, p' h#endif0 A. k  l& j7 ~) B- _! f

" ?7 G3 C# i6 `" @6 p3 V2 t1 I6 G7 _
// CUsingWMIApp
8 a+ R) C  t+ ^7 r- ]( c: _
3 I8 k/ w: p0 Y& d( Y$ ABEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)9 M$ g5 {! ]9 _" u' Z/ m6 M
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
/ J! a" t' D* v# K  I5 BEND_MESSAGE_MAP()4 }2 F4 p" L  f, O% Y5 {* l6 g
* J3 P" c% E; ~/ a9 T9 I$ L

( o1 L( ]5 f+ R2 U- V6 E$ I// CUsingWMIApp 构造( z/ E2 R" J  ?1 r% h
: m5 |/ g; i& Y
CUsingWMIApp::CUsingWMIApp()5 x( A$ _! |+ E/ [
{
, p* A2 i% H1 m3 P; F. B        // TODO: 在此处添加构造代码,
2 i( C1 V* c5 ?1 |  X        // 将所有重要的初始化放置在 InitInstance 中+ e. ~7 L. J& Q5 ]% t
}/ w3 ^4 L/ i" [5 k
# A. ^5 y1 X/ u: w7 b

& o' e6 I- h# D5 E# C8 Q8 Z// 唯一的一个 CUsingWMIApp 对象
; ]$ |3 C0 C9 g0 c0 @; ^9 w; m! g( F! u6 `0 U! a
CUsingWMIApp theApp;
. R" m9 B8 z; ~  K4 Z5 c5 V* m0 x( M  `5 Q$ Y3 m

  t, D" A( T2 `6 M// CUsingWMIApp 初始化
  _* k9 m0 u6 L
3 |& Y! I7 A- g1 n6 S( M/ \  hBOOL CUsingWMIApp::InitInstance()
- d3 Y; M( z0 g3 a+ Q{
/ S. q# P+ a5 r, a% c        // 如果一个运行在 Windows XP 上的应用程序清单指定要; G$ h0 a( A& E) ]7 \- G$ y7 [' Q
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
7 l- `; n3 S9 _* U+ R        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。; R* {( W( \! T, s$ t7 ~
        INITCOMMONCONTROLSEX InitCtrls;
9 ~  o/ s( `2 a3 H        InitCtrls.dwSize = sizeof(InitCtrls);
6 ]+ }- J$ b5 j/ Z) e        // 将它设置为包括所有要在应用程序中使用的2 i/ t$ s6 I' U7 i* F
        // 公共控件类。
6 O3 X0 b, r" h, }1 s5 g8 E9 A        InitCtrls.dwICC = ICC_WIN95_CLASSES;: S! g# r. O4 ]) U& L+ N0 W
        InitCommonControlsEx(&InitCtrls);
0 g% X, `' o) V1 ], D3 ~
& V  J0 x- Z" d* G- Y5 r        CWinApp::InitInstance();
4 C" R! |# ~5 R7 {! r8 e" e: \: p: Q& O3 f
        AfxEnableControlContainer();
3 {8 _! r2 P+ B& n- I* E, x" B$ T6 K- [% n2 U4 ~
        // 标准初始化0 [1 ]) N$ F6 h5 z% ^, q. A1 U
        // 如果未使用这些功能并希望减小' b+ e/ a& a$ e% P0 d
        // 最终可执行文件的大小,则应移除下列
* d- k/ V0 o& f$ V        // 不需要的特定初始化例程5 G  j$ q: k! H: c% D
        // 更改用于存储设置的注册表项, Z6 ]( d. x& X2 q" Z0 C: H( [+ p8 h# k
        // TODO: 应适当修改该字符串,
' N: l* O* H, c7 h        // 例如修改为公司或组织名4 l. \( A+ H9 v2 @
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));1 u3 l8 j# i8 R8 ?; f

8 [! h$ f& n; s2 t        CUsingWMIDlg dlg;
3 W5 H, p" [  a+ c1 P- c, k        m_pMainWnd = &dlg;
  ^. M, T3 U0 q        INT_PTR nResponse = dlg.DoModal();
- d) E, R4 J& ^6 L$ ^        if (nResponse == IDOK)$ P1 t6 X- _- q& B- {
        {' L/ _9 `7 p  H8 ?
                // TODO: 在此放置处理何时用
! M& C/ f/ [4 p2 h% E- a( N6 H5 Y                //  “确定”来关闭对话框的代码# W; [9 |7 Y' i
        }3 t; s+ C& E# U8 I
        else if (nResponse == IDCANCEL)2 {! f; E: y( X7 b4 f1 m* Q
        {
$ j( H) q# b( ~                // TODO: 在此放置处理何时用
( {8 d, f3 ]2 J& x+ A                //  “取消”来关闭对话框的代码* k; @. q; T9 `
        }  a, C& S  P* e' {# b) ~
) m) @" c: z! ~
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,% O3 j9 v; [. G4 K
        //  而不是启动应用程序的消息泵。' Y& h0 b4 P# q+ E( a  O* _- q
        return FALSE;
& ?" ]4 r  k! G3 g7 [& q}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:58 , Processed in 0.190717 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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