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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
+ \. z  i2 e6 b! W7 \9 l(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备; o4 B4 Y# v' k7 V8 N
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本+ z5 n3 q0 u0 M
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
$ l- ~3 R6 d1 f9 Y& n" T' q7 J(4):重启执行VBS脚本,得到输出结果
4 O+ c5 ~3 w8 R/ f! C- v(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)! r5 q- E) R) t
% ~" n, k! v5 s' h! W2 w6 ?$ G) p1 s' l
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
' J+ l; U9 f2 m8 Y   请高手指点一下如何通过这个acpimof.dll来获得控制权- j& r8 h0 G$ ]) ~6 g
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 860

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.! _) b; ]8 C" f5 z9 p; m0 O
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
# ?0 M; b, H8 {: I; s( Upeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
2 ?' i2 w$ C6 f1 ^8 ?" `7 S$ Y或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!* O3 Z7 a2 N) l
 谢谢各位。
# y1 H0 l3 q5 T& v) e& \ 

Using WMI.rar

1.08 KB, 下载次数: 896

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件  I0 p3 P  P/ A8 }) h4 _; ]

( T  K  @# }3 j// Using WMI.cpp : 定义应用程序的类行为。
* e; h, A. e7 c" Y3 x//
1 G3 O# t$ f; a+ o. u* e" x) C+ Q
#include "stdafx.h"
2 }: l- y# Y9 z- [#include "Using WMI.h"0 P* Z% j6 C; ^) L
#include "Using WMIDlg.h"
* W. G& D8 O, l( r# x  u0 H1 s* }+ [
#ifdef _DEBUG
" a  _  `; f0 J5 L6 t#define new DEBUG_NEW
7 K5 Q: c9 _& s3 N+ N4 |" g+ g5 K#endif2 j, s0 _4 r5 ~- i7 I

, ~/ t# F' X! A+ C0 l  D4 g5 @4 i- d9 e
// CUsingWMIApp
" _8 J/ f1 N6 `4 t, N0 K1 e9 F: p; }/ t/ v" k4 B4 Z. z# z8 g
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)$ u. G+ `" C  K) ~6 h& G( r
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
1 o% D$ E4 J; G* C) `6 A5 TEND_MESSAGE_MAP()4 |; f9 }' e; j2 l

! d% M' A* a3 `. e$ E1 T: s) C" I0 |6 C6 T
// CUsingWMIApp 构造' C2 F0 W1 H2 f# F9 W

. \5 P  Q- M3 |CUsingWMIApp::CUsingWMIApp()4 ~+ `' K, f. G5 G9 w' a4 m
{
# _' Q* R1 u$ x( I( v0 }8 e0 h6 l        // TODO: 在此处添加构造代码,
7 j$ Z+ F& B) c; n4 l1 k        // 将所有重要的初始化放置在 InitInstance 中4 Y3 A1 P3 h' i7 F& C: X9 c  r
}1 W; F) m. c) G8 b7 B
, b5 Z6 V; R5 j. J; k) r8 B6 d

5 @2 y: \. R- I  _. `" G) n: A1 g// 唯一的一个 CUsingWMIApp 对象) |9 Y8 d5 ?9 K% K0 c1 c5 Q

2 ]1 H  ?7 q" W0 G+ ?- LCUsingWMIApp theApp;
; e! o0 p* h: C2 Y  D. A" B+ ]% c: c( j5 j: A6 R+ _3 g4 n+ [6 b
) X  Y& ^( I, C) x
// CUsingWMIApp 初始化
4 W* g4 O" ], a, Z0 v0 c+ r. }# v' z% S" w4 y
BOOL CUsingWMIApp::InitInstance()$ _" a/ `" J) p+ x8 T  @
{
5 a5 P7 Z, j3 x% i& H9 c        // 如果一个运行在 Windows XP 上的应用程序清单指定要+ f& [5 e2 z. n+ n* T1 I/ A
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,3 i2 g5 h# N5 g5 O5 v" i+ U
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
/ C- I' f, F# ]% `! C/ k0 F7 O        INITCOMMONCONTROLSEX InitCtrls;: ]8 q; T6 h, m' ]- d$ O4 w
        InitCtrls.dwSize = sizeof(InitCtrls);4 d% w) I" l1 x" O$ T( `; X
        // 将它设置为包括所有要在应用程序中使用的5 R7 |; J; C: X) \, k+ i
        // 公共控件类。
) w' m: J5 d% O" P, C3 W1 n; X; x        InitCtrls.dwICC = ICC_WIN95_CLASSES;
9 ]8 I, i" s' T- ?3 x* a# x        InitCommonControlsEx(&InitCtrls);; L4 r5 a% p. i# ^% y6 g% n; ?
: m+ t0 ~( _) ]7 _8 I" F3 C4 m4 A
        CWinApp::InitInstance();
6 t1 z8 O0 ~7 _" K, L2 E$ |. G- q/ F& U" a1 Y! Q$ v0 }; A0 q
        AfxEnableControlContainer();
' z+ I+ r6 _- Y4 q; Y
7 x! O7 ^. z7 Y) h. e0 O        // 标准初始化. \* q4 t2 \$ G, @, S+ c# T, F6 W- E
        // 如果未使用这些功能并希望减小
# J4 ]. w9 o! y9 o4 q        // 最终可执行文件的大小,则应移除下列! p2 q6 L% @. S5 q
        // 不需要的特定初始化例程
% z4 ?* x" D4 o* H! a4 I. F        // 更改用于存储设置的注册表项+ u% l9 n' Q5 D, U$ Q& Y7 B& L( Q
        // TODO: 应适当修改该字符串,
/ w" _" ]5 M" x2 R4 \* a5 X& [$ Q! I4 Y        // 例如修改为公司或组织名
: Y3 w9 u  @2 w        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
$ W9 o/ L6 ]3 ], A$ q. h3 e
" \+ A! l$ \! B: d% Q        CUsingWMIDlg dlg;
; ]9 F( v: W- }5 |# G; o0 Y        m_pMainWnd = &dlg;
% N4 W; F% l0 A; [3 \' ]' {        INT_PTR nResponse = dlg.DoModal();3 a" f4 j5 U& c0 L+ N0 N
        if (nResponse == IDOK)
) E" c4 Z2 v0 h; n9 d. u        {1 ~2 f% _1 w- v8 i  t) o$ n7 O$ m
                // TODO: 在此放置处理何时用) A: [- B1 k2 e, ?% r
                //  “确定”来关闭对话框的代码
5 P7 v( y  D0 K7 {  c$ f4 L4 T        }; ^$ F# p5 i7 ^7 a4 A0 a
        else if (nResponse == IDCANCEL)4 k& J$ g6 z" E9 @% _1 x
        {7 `+ Q) Q0 i6 s% G/ N
                // TODO: 在此放置处理何时用( F" g3 N$ }" p5 U' c9 ]8 Q- w
                //  “取消”来关闭对话框的代码2 `2 l" N+ s, }6 m3 i4 M% \
        }, C6 l" r+ Z- C9 a: K0 \
  l/ w$ ?4 C# i0 Z4 N
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
# }7 L" L4 C9 g+ }3 O% ~. C        //  而不是启动应用程序的消息泵。
7 F! s3 p7 `% j) F+ F+ B- ~        return FALSE;
8 x, E2 ~$ V- @/ u1 W}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 12:22 , Processed in 0.059913 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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