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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。, Q3 U$ V% ?- u) y, r
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备' d3 {0 v' G* M0 c- Q+ J) s  Z
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本, }0 [" Q0 z, X
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接3 c# M) }2 y; o' K
(4):重启执行VBS脚本,得到输出结果
, M4 k' {: m4 V2 j. d(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)1 C8 m4 C3 Q# j
  b) v/ h; Y* ]2 Q! |4 Y
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。; A  [; i, K6 C$ d) O; z6 \& l
   请高手指点一下如何通过这个acpimof.dll来获得控制权! H+ B) m5 o! ?; d
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 807

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
8 Y, r/ h. Q# [( v7 [& ?' N  w* {/ hpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
4 p% G9 e/ J. r* y0 R或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!# m  F# ~7 B( l
 谢谢各位。
" i4 g) c# a! k/ o3 n5 _ 

Using WMI.rar

1.08 KB, 下载次数: 845

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
' l( G- h0 f( Z4 w. F* D7 a& @! F
// Using WMI.cpp : 定义应用程序的类行为。
  I/ b9 J: `1 g1 n: R//
+ K/ f9 e0 r& f9 u- x$ w5 V  c7 L
7 \6 w7 ?* `' ]# t#include "stdafx.h"
7 r, t8 B( c! F: H; t#include "Using WMI.h"
) |0 h6 y" W$ s6 H#include "Using WMIDlg.h"
4 ?, W5 M' R/ Q! [/ b) r, U+ N
/ d: I( ~; r9 w6 ^. j6 E& s#ifdef _DEBUG
' n: Q7 Y/ t. Q* M! T#define new DEBUG_NEW
0 y# d# y* N0 i5 E5 n6 F#endif6 B. Y2 i9 T/ {% s
( F- a; B& d. `

/ w9 U4 K; n/ R7 D% V2 l// CUsingWMIApp
% s5 B( p. e& e, I, C4 y2 W$ [4 k0 }; I: L% g2 ^: Z
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)5 K4 ~; N8 u) X. Y  t( q5 {! B# z' _
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)1 X: c8 {  \& t( m+ F' u: U6 H
END_MESSAGE_MAP()
. |2 q% C  Y+ _4 E/ R4 {
* F3 G+ O* R- Q8 j) Z5 M% I& G+ e3 y6 _  C+ [( }2 L2 F
// CUsingWMIApp 构造
# J$ }% [/ `, }1 V
0 T# G  m! G$ [* ZCUsingWMIApp::CUsingWMIApp()
& \* l7 p" M# q; b: U7 ^% ?- b{
% o. h3 n/ V: ]4 w% c( E+ c0 n        // TODO: 在此处添加构造代码,8 N" y* y4 t- t+ l) y0 ]
        // 将所有重要的初始化放置在 InitInstance 中
" d6 @& k; n: X; y( l# H}
0 B8 P: j. t5 r4 z; A2 i5 U( e% z. ]- b. z8 v4 D6 `7 C: u

/ J- t) k: E; T; a. _// 唯一的一个 CUsingWMIApp 对象
& o( ^" I6 Q! k& K' p! W  y3 ^& r
: F) ~7 P# \( F3 S- F% A5 [/ eCUsingWMIApp theApp;# X) [: r; Y  {
2 ]  p" ?  M- f

( m6 p, I( S! f. Q" L. V3 K// CUsingWMIApp 初始化0 }3 a6 w. `$ X: R( e7 y
! w3 `& q& u( K/ a+ m4 L. u& D
BOOL CUsingWMIApp::InitInstance()7 H+ j1 _+ J; b: I7 U
{
% s4 C6 q; t/ k        // 如果一个运行在 Windows XP 上的应用程序清单指定要' N  q7 d; q" D! B
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
" ^6 s+ T2 {$ M, _( \        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
5 A3 K% U$ R" }- \/ O) f0 O        INITCOMMONCONTROLSEX InitCtrls;
# }" e' U! s$ R4 {7 C& L# a4 {  c        InitCtrls.dwSize = sizeof(InitCtrls);  I/ X. f( j- d' j  m% \  s
        // 将它设置为包括所有要在应用程序中使用的0 ~; H! ^) u; Z) y' B* f
        // 公共控件类。: j9 m5 \  ]" Z9 ^! N
        InitCtrls.dwICC = ICC_WIN95_CLASSES;* _) B, H. r; T3 Q+ O% u9 c
        InitCommonControlsEx(&InitCtrls);& b7 V. I% ^1 @; b  \: d/ f( O
5 q  C4 {- g/ r# G' q) J
        CWinApp::InitInstance();( }5 H0 \- G7 L4 V
4 A/ c! ?0 f  R* V
        AfxEnableControlContainer();9 ^: [  E+ d" j. K7 ~% m' B4 _
4 J: s5 q$ y3 a: ^2 v* s+ w; h
        // 标准初始化
" K6 A6 ?" w+ g$ g        // 如果未使用这些功能并希望减小
+ O% v3 F4 I' p6 ~8 j0 s/ A4 M        // 最终可执行文件的大小,则应移除下列- P7 l# l; {7 p9 P7 M
        // 不需要的特定初始化例程
# O3 N6 S, N" V& s        // 更改用于存储设置的注册表项& Z& c  d6 h- y( N2 Y. Y2 k) _
        // TODO: 应适当修改该字符串,% N4 T' ^! V( B3 o
        // 例如修改为公司或组织名  t/ i' x7 a% W" i0 ^, {
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
) W( L. k  x3 w3 r6 v$ i& p+ e& B" z( Z! N. Q9 ?' o
        CUsingWMIDlg dlg;7 P! k8 M# c9 |
        m_pMainWnd = &dlg;
% `4 r" L2 q/ r( l        INT_PTR nResponse = dlg.DoModal();  V  }9 q' c! j6 y
        if (nResponse == IDOK)2 i+ U- o# Q& b6 y1 T  E  o
        {
+ u8 R0 J, T4 x! G9 O                // TODO: 在此放置处理何时用$ q& r# K; h4 b7 ]% l( U  Z! n. P
                //  “确定”来关闭对话框的代码; _) h( j3 y8 T  I$ v6 N4 h
        }
; x& A* g/ p7 M/ n& [1 \        else if (nResponse == IDCANCEL)# Q* [9 o4 E2 T9 Y; U0 ~6 P
        {& P: {, J$ w8 [1 I; r: \
                // TODO: 在此放置处理何时用
- l4 L0 @" L$ X. q, I& r/ F( W                //  “取消”来关闭对话框的代码$ F. E) C( n6 O/ y$ p' Y0 S, C
        }
7 z3 |2 B: P: b2 V) ~: ?$ Z9 n0 b3 r; |' w- z
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,% t( ]* p* N0 j0 I* z4 J
        //  而不是启动应用程序的消息泵。7 Z$ V( S1 y: l/ d
        return FALSE;  z* a4 z; N' M3 b# z1 ?' n
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:49 , Processed in 0.027692 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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