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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。& W; s* f1 a  Z" D  F3 E
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
7 _' f/ E' y* A. v" Y(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
2 H" @- k3 v: w7 m5 D; }" m* X(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接' n0 V' m) n3 Z. V0 |
(4):重启执行VBS脚本,得到输出结果% `5 Y4 H. K  ?1 r: F: j- X) D9 H9 A4 J
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程). O' t$ s3 J" c+ x: A  Z
+ o8 J- P% k" m3 }+ z2 g) F
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。, D+ v2 d4 o* r: i
   请高手指点一下如何通过这个acpimof.dll来获得控制权
" X0 e& K; A: ]7 D4 z   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1525

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
5 e  Y- M! Q- R$ p* n6 lpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。4 [7 x+ ?) m7 g2 Q1 ~+ m. g
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
+ _- \- T; N0 x; Q6 g  z- X 谢谢各位。
8 ^  ^- Y. L( O9 e5 R 

Using WMI.rar

1.08 KB, 下载次数: 1574

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
( g; J) v9 v: N, K: _: ~
+ Q  x5 f% H6 X; E) T' W2 l// Using WMI.cpp : 定义应用程序的类行为。
4 \% k: m4 K) ~- j4 t/ Z3 d//- ?4 U3 b: B6 u* S& C! j
+ @4 X$ N+ [: K+ U
#include "stdafx.h"& {; s; _8 W7 U4 e7 N
#include "Using WMI.h"3 e7 L# u0 C8 v9 N+ o
#include "Using WMIDlg.h"6 [9 x0 h* \6 [4 W3 m# J
, J  x! K: d0 r  v
#ifdef _DEBUG
7 A+ N# a9 G& M& F4 L#define new DEBUG_NEW& v4 z8 G1 y3 s3 z4 x1 l, Q' B
#endif" l, M6 q& ~$ y7 `- A$ V/ N

0 X7 V. V" c! `* x+ z+ Z  d/ C2 g' ]4 s. v$ S9 ?" y
// CUsingWMIApp
) A# j; }/ W* ~" D1 g) a$ _
- M" w0 v$ j/ M; K5 CBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)6 J, J) C# {  o* E, z1 X
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)4 }4 u% q% a# V( r2 b
END_MESSAGE_MAP()9 f$ C" D' F. W! y9 {4 q
$ G5 v$ R6 C7 `* w
2 O5 S: _# l: w0 T5 }- l, b
// CUsingWMIApp 构造
+ d( K  ^/ a3 K, ~
  r9 B2 |9 ~8 v! UCUsingWMIApp::CUsingWMIApp()$ u4 u/ k+ Z: F: c. u
{
8 }5 Y4 C( S3 Z! e3 c9 H        // TODO: 在此处添加构造代码,
' M1 ^# F. q# h; K        // 将所有重要的初始化放置在 InitInstance 中/ B* n/ D& k7 n9 J% K* \: m% R/ j
}
( M% q3 Q6 h. P: r
' \) e$ n6 f$ G9 L2 B$ V4 o3 q3 E
0 E+ l$ c% Q9 w" ^0 `// 唯一的一个 CUsingWMIApp 对象
- o* c1 w- B$ m2 h' ^7 z( T) n
+ A4 `( x4 V9 N5 f0 PCUsingWMIApp theApp;
# i( g% `1 x3 Q1 w( o4 Z4 _( G9 @& B& U9 N% N: D
, y7 t1 g+ W1 u0 N- a1 s
// CUsingWMIApp 初始化/ |1 g8 ^! D! b5 {* |
2 X1 ]2 t* y2 P$ v/ [! F
BOOL CUsingWMIApp::InitInstance()4 L7 _  |7 ]" \
{
# d; P4 d2 w) u        // 如果一个运行在 Windows XP 上的应用程序清单指定要% ]! _, L% Y7 g6 C0 h
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,- k; L; @+ h7 ?% l
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
& e3 p; v; K/ M% Q, q5 _. d        INITCOMMONCONTROLSEX InitCtrls;5 O0 T6 X# Q7 p, K1 h
        InitCtrls.dwSize = sizeof(InitCtrls);
' l  G. F7 G* @6 r2 l8 l        // 将它设置为包括所有要在应用程序中使用的
0 I+ r" g% k8 P" v        // 公共控件类。
2 [# D9 c: k% R# E; J! O        InitCtrls.dwICC = ICC_WIN95_CLASSES;" b4 X8 P6 u& }
        InitCommonControlsEx(&InitCtrls);
5 U0 ^! }. g3 C& F5 ^4 o: ]6 z9 j! @5 b! L& z; v* m- I7 j
        CWinApp::InitInstance();$ r8 ?1 L7 l7 ]4 U# z
' e5 F8 q. z2 [9 {
        AfxEnableControlContainer();
) c9 k1 g8 Q. f! s( U
4 s) \2 _7 ~! X        // 标准初始化
3 [0 l' c6 {: o+ f$ z9 r  k        // 如果未使用这些功能并希望减小4 C8 B& }  I1 G9 S
        // 最终可执行文件的大小,则应移除下列
5 k9 h$ |0 S" \6 ]0 u' i- X2 O7 S        // 不需要的特定初始化例程
! J. c- T; Q& t        // 更改用于存储设置的注册表项
/ [& @+ P6 S7 H3 B9 z: n- I7 X+ F        // TODO: 应适当修改该字符串,; l* v+ d3 G- P
        // 例如修改为公司或组织名
( ]1 [- ]( i1 d, ~  H        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));/ b- p8 J$ l# K) n

" j9 S  r4 u, l) y' p1 j( y        CUsingWMIDlg dlg;
) A, i' `$ m' l/ Y( W% w' G        m_pMainWnd = &dlg;
! {( _  Q) i! F: B  r! G! {        INT_PTR nResponse = dlg.DoModal();# s: V$ e7 h* [
        if (nResponse == IDOK)" R/ G/ @  J& V& ?) X( y6 \/ C; @& e
        {
3 e$ o; [! @2 m+ m6 h5 I                // TODO: 在此放置处理何时用
; Y2 s- I% h0 B                //  “确定”来关闭对话框的代码
8 k4 y& x# Z0 O( ^; O        }7 G9 e. {# t* n
        else if (nResponse == IDCANCEL)& Z; B$ [& b2 F8 K- b" g0 p7 [
        {
6 r6 y6 n: z; V2 \. W                // TODO: 在此放置处理何时用
3 ]  z% H! w. s8 K                //  “取消”来关闭对话框的代码0 q7 l$ F8 U; \0 H0 U
        }
9 f0 T" o9 G% v1 v
6 e0 o. P! ]; _8 y; E        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,/ ~8 q  C6 G4 D
        //  而不是启动应用程序的消息泵。' M, R2 Q, |6 ^% t9 `( ~
        return FALSE;" g8 Q) k7 {3 V" c0 G) i3 R
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:17 , Processed in 0.161787 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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