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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。* w7 D. F/ i( }1 \3 O
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备4 H; ?0 C0 I. @. U
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本5 n5 E8 t! Z7 a  A( D! M( B
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接* R, w3 f9 {5 o6 k
(4):重启执行VBS脚本,得到输出结果
% Q' p2 I  D7 M0 G5 e) j' F1 R(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)6 d9 W% g( J. \9 [/ k3 C4 r
9 {, p( a- t( K
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。  F& C8 x" ]3 z# J5 Y* b) F
   请高手指点一下如何通过这个acpimof.dll来获得控制权
& `9 P) Q+ W. A8 F8 g   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 947

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.! }# |4 ]8 S2 y) H' ?
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
0 f+ D2 J( w5 q( Ppeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
" Y& J& r. X5 z) B或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!) l+ g0 B* O, o. [& \3 H
 谢谢各位。
% [( S, v0 `. ~+ b& F1 S4 J& S 

Using WMI.rar

1.08 KB, 下载次数: 972

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件0 C1 _9 M; f* R( l% _5 e* r

) ]) c) v, N4 K. P0 y; A1 |// Using WMI.cpp : 定义应用程序的类行为。
" m4 p& B% I+ h* A6 j' ?, _& Q//
# M! e, G. j% H$ ?2 w1 R# ?  u1 C3 T" ^8 [7 g( m
#include "stdafx.h"
8 v* b  V9 H. E0 t% Y( j6 x: f#include "Using WMI.h"2 }7 x) J; f) \5 K+ z2 Q
#include "Using WMIDlg.h"  R9 ]  J8 I* J8 @3 Z
, y: d# H# N/ ?$ q2 q, D
#ifdef _DEBUG/ W7 r# W# J: [# Y$ |7 a( k$ _
#define new DEBUG_NEW
* }& a: Q1 p+ U/ \7 N5 C3 w; v#endif
5 B  b- ]$ n- f( `& ]. |: P, ?: e/ z/ r7 V: u/ s

) u! z6 ^" K" R$ c6 Y, h// CUsingWMIApp
2 I4 j) ]! h( v! w+ |4 D) A0 N; c' W% w# E
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
  S! z. f+ I5 j* C) ~2 |6 b        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
" a' X$ `$ E1 qEND_MESSAGE_MAP()
1 b0 G6 F! g( z9 W5 B* i* k, ?' d1 r& P$ \; v$ f6 g0 \$ c" Z
# i4 V+ U% Y2 _: H- X
// CUsingWMIApp 构造% p: @& S1 @/ i5 n8 O7 \
) M$ U5 J3 A0 i2 Z
CUsingWMIApp::CUsingWMIApp()3 x2 g, j- K& ^8 s! k7 p
{& ^$ T8 A7 c  ^9 T9 _5 ]  L
        // TODO: 在此处添加构造代码,
+ `1 o2 C% o7 f2 {5 p& C        // 将所有重要的初始化放置在 InitInstance 中. l& D/ |& X# I& ?. a
}( Q& Q5 l: N. s' r0 I
0 x1 u$ I. I( o0 G

3 y! u7 t# c5 N. ~// 唯一的一个 CUsingWMIApp 对象. J. t1 P" o  q( r2 u% v2 A
+ q5 _: s  a9 C+ y8 k+ H' I
CUsingWMIApp theApp;  u3 l, U6 L1 J

8 h+ k% Z. J2 C0 j& z% _& Y; d; \+ a2 ]: g) v% Z# K( E' b4 ~
// CUsingWMIApp 初始化6 R7 }' p' p9 E5 r! }

# |" |4 N2 _$ {, w9 b4 ?3 oBOOL CUsingWMIApp::InitInstance()
* p$ l  D  ~7 p& h4 s* D  S. e{
7 ]( _8 Z' j( S$ \) |- P" @        // 如果一个运行在 Windows XP 上的应用程序清单指定要% ?* r- \" |3 T# b- o- j6 R' O
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
5 U- ?. u% r3 `: A! e        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。- ?! k. o- S. A' `' H
        INITCOMMONCONTROLSEX InitCtrls;
8 f0 |; ^% U! X9 R4 \. X        InitCtrls.dwSize = sizeof(InitCtrls);
. s" P2 s( s% ]% z8 r! B7 }        // 将它设置为包括所有要在应用程序中使用的
% |3 V+ o9 E/ V+ k  _2 N        // 公共控件类。
9 r& g  ^( b3 [4 f        InitCtrls.dwICC = ICC_WIN95_CLASSES;
- D' ^6 v% p( c) [$ t* n, ~! s        InitCommonControlsEx(&InitCtrls);
% b/ R2 S& u+ d2 O  @/ |
0 D/ H4 H: _$ t" \+ V7 j/ P        CWinApp::InitInstance();  C4 j; [# s4 d3 X
5 }' {& c1 h7 ?
        AfxEnableControlContainer();
8 d- W! y, g" d: L  q
; d. t+ V4 e0 S- V  n' E        // 标准初始化
1 u. r7 K6 C" u' a        // 如果未使用这些功能并希望减小
* H+ \  L( t' p2 s0 f  s        // 最终可执行文件的大小,则应移除下列
* ^% Y5 X# ~! b4 S' ]  k        // 不需要的特定初始化例程) E/ D6 z: ]( j, Q6 i. y0 c
        // 更改用于存储设置的注册表项% r: g8 j( O; `) _& T, K' P
        // TODO: 应适当修改该字符串,
1 x7 _0 b5 t1 o; `        // 例如修改为公司或组织名
* m5 U) {8 l! w# O& [+ b8 _        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));) o0 I( U6 w( W& Y: G

; f2 i: D) D! H8 \6 U1 W5 u* u        CUsingWMIDlg dlg;4 X5 t+ i2 u! O" v/ G; _- a" N
        m_pMainWnd = &dlg;; F+ ]+ o$ Z7 h: I* R9 U* p! I
        INT_PTR nResponse = dlg.DoModal();% |& ~5 ^/ L9 x  s  _. ]
        if (nResponse == IDOK)
6 |* @2 h7 G5 k4 W* \* E  k        {! n0 a4 C: i) B- j. w3 @
                // TODO: 在此放置处理何时用
7 p* y  j; m4 }2 i. P" y, q8 Y& |                //  “确定”来关闭对话框的代码
2 o( J" y9 W% ]' Y! n# O        }( p6 b  S- A' O  E6 k! g
        else if (nResponse == IDCANCEL). m4 D7 g% N# u+ y* R# C  c
        {
8 v0 }( ^3 ]: B                // TODO: 在此放置处理何时用# t! T2 k- P1 W9 ^( f5 y! t2 o
                //  “取消”来关闭对话框的代码  i3 m/ A* v! ~
        }6 r6 f) N4 P& D/ i- `# s% V, d

0 x9 b3 g9 V5 t  x# `; w* c        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
# E/ J& c% [! J        //  而不是启动应用程序的消息泵。- w, y) r8 E) N3 J1 f& G2 }
        return FALSE;* c6 M$ r# v9 Q! B, \+ Y% e1 ~
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-21 17:10 , Processed in 3.164099 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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