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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
9 w7 w+ P8 M. a" L# I# M7 f! n(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备2 z3 K/ l( V6 V; M) p2 }
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
( v2 }( }" b% ]; j(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接+ P. A8 i" O% o) `5 Z$ @2 x9 i
(4):重启执行VBS脚本,得到输出结果; P8 Q5 R3 q  {$ s5 U& L! b
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
! O7 R  p$ F. l8 |: |8 v) x# P2 T9 ]3 }, s) }
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
. O- _& b6 V6 i/ S   请高手指点一下如何通过这个acpimof.dll来获得控制权: H0 U, u# {# w* q
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 421

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
6 f: `6 y$ j6 w" Jpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
2 q9 ?( Q9 T# j或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
1 @7 E0 o0 Y$ {7 z! d3 Y: x 谢谢各位。' q3 ]" D. J; d" {
 

Using WMI.rar

1.08 KB, 下载次数: 458

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件, [3 _% a& U* q; D1 M. g' O7 P

+ W3 \6 s7 O; Z9 O// Using WMI.cpp : 定义应用程序的类行为。
5 w' }- e) u2 X+ u//% w) G% P  K4 d" A* E& B- k

' X$ k; H" R# H' k4 z/ _5 V4 @' r#include "stdafx.h"4 K& c3 j; T7 ]5 Q* i" `. B
#include "Using WMI.h"/ T  J- r% i& D  y( n) e& b0 Q
#include "Using WMIDlg.h"
$ _9 W/ U: }+ T' \+ N7 f( q2 y8 J- S  N9 d
#ifdef _DEBUG
( E4 M! x  T) m) {3 G/ S! R#define new DEBUG_NEW
% N  o! Z. F' m) F, {# Y#endif
: m0 u- ]- l; q) _. C3 q/ x$ |4 R: n3 |
1 P3 v! p6 T  p% `6 v3 W
// CUsingWMIApp
* K& ^/ w( s- j" v) n! t, `; p
) ]$ ~8 [3 n! }5 LBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)2 I: d0 u# Z+ c, _8 W
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
( A, ~2 [$ Z2 k/ X% a: ^3 \END_MESSAGE_MAP()6 v2 S2 K6 {3 h

/ f, x/ o5 W- A- P% ~! U& d
/ T9 V' q; R) r8 s// CUsingWMIApp 构造, u* }$ I5 p. P# C9 O
9 m. Z- L2 E+ A8 P& g) u
CUsingWMIApp::CUsingWMIApp()
( l: f% E9 O7 x{  z! |( `% N4 ]- n
        // TODO: 在此处添加构造代码,% T/ V, w4 N2 ~
        // 将所有重要的初始化放置在 InitInstance 中
) p/ W3 F  H5 _. L}1 }) |+ u! P% a; [  R3 n
: Z0 ~; w3 Z' s
" p- Z! {' N- z/ P/ s; O
// 唯一的一个 CUsingWMIApp 对象6 i3 U, _. L1 D9 s) b# f
1 B0 E; N7 H* y. t3 k* D
CUsingWMIApp theApp;
& h6 i; H. D3 ]* q0 E9 a7 A3 B% o4 {8 Q9 D' Q7 X& A
% R5 t+ ]1 t5 Z! O3 x
// CUsingWMIApp 初始化( ]3 J1 Z0 y5 x0 z7 K1 O. ~1 w6 ]

* e1 W9 f$ l: E4 JBOOL CUsingWMIApp::InitInstance()
* W4 K) h* |- m( k{
# j5 u- E/ n: l5 l        // 如果一个运行在 Windows XP 上的应用程序清单指定要
: w+ R2 |& R$ Q% O7 a# ]$ c" F. W        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
5 W: [! b5 r/ r$ N. u        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。1 S: e  c0 H1 K  i4 [
        INITCOMMONCONTROLSEX InitCtrls;
, @5 w  x( k- s, c        InitCtrls.dwSize = sizeof(InitCtrls);
  G0 O/ P2 ?; Z' O        // 将它设置为包括所有要在应用程序中使用的9 A. J, q* ]( R) N* G
        // 公共控件类。* A8 ~0 L' Y) y  T
        InitCtrls.dwICC = ICC_WIN95_CLASSES;+ ^" I9 {8 b) a# x6 I
        InitCommonControlsEx(&InitCtrls);. A5 {" G2 S+ A% w' I* P
) l' s; }* N) {$ Q; Z" t( F
        CWinApp::InitInstance();! e, Z$ r' w) g+ Y

, y) w; E0 f) d2 O: D$ \# N        AfxEnableControlContainer();
7 I* d6 M6 s" |3 p, K8 _1 c
4 v3 H+ q( A: M0 ]5 L* Y/ l1 A% f        // 标准初始化4 g3 [: h6 S" ]; x
        // 如果未使用这些功能并希望减小7 T8 M! V& S; C# z8 ^# T  _
        // 最终可执行文件的大小,则应移除下列
! D4 q; F' M6 W! O& K5 O) Y( B        // 不需要的特定初始化例程: T1 ]+ O3 {  z) l$ V
        // 更改用于存储设置的注册表项
  f3 k, n/ B. H# d6 a2 a        // TODO: 应适当修改该字符串,
3 S/ w( I% |1 c: s  P) X) d! u9 d) G        // 例如修改为公司或组织名
) ^" B: a( J, R$ P7 |. M        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
2 ~$ |3 ~/ s0 P* X
" f$ [4 y6 E8 Z, X/ O. |! s5 P        CUsingWMIDlg dlg;9 n, W# Q% ^& I
        m_pMainWnd = &dlg;9 v+ _4 ~) g; m, \
        INT_PTR nResponse = dlg.DoModal();
4 {- Q  m5 X* O; F4 d$ i9 S/ ~% I        if (nResponse == IDOK)$ [$ a: U, N% f, K% `
        {
0 n6 Q$ M  X8 ?2 }9 _                // TODO: 在此放置处理何时用$ z/ @, k' _3 T- W; o! Y& t3 I
                //  “确定”来关闭对话框的代码: ]' E0 ]/ {1 r5 d
        }
  M+ D  Z# Z) o        else if (nResponse == IDCANCEL)
" N1 ]/ X' @1 q# f3 {: D        {
; |# `0 d( ]; C: G                // TODO: 在此放置处理何时用2 h5 \1 C" E$ f8 b( N- z
                //  “取消”来关闭对话框的代码; S) V3 R0 N. Z/ }
        }0 ^7 {1 X; \" y  Z; v$ K- g7 u

' c& L# \- m/ s        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,' A2 I$ T+ ?' p0 b. P$ L
        //  而不是启动应用程序的消息泵。0 G9 c# F3 Z9 J
        return FALSE;9 ?: Z! `8 u! o  Q
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 09:27 , Processed in 0.036650 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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