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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
, z! r4 ~, w  C9 D9 w  m& ~(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
5 i* F4 o1 `$ u: n" \1 S(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本8 r1 \  g0 o& ]* H! R  p' k
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
* u6 ]7 Q9 Q& c$ F4 t(4):重启执行VBS脚本,得到输出结果% E  |, H- L- K1 S" H
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)# a, z+ F) C$ ^

6 c9 ^6 m- J+ e/ C  v问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。7 T' u/ c2 j% m4 K
   请高手指点一下如何通过这个acpimof.dll来获得控制权
: p; t& ]9 U& ?7 U- _   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1556

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,# Y# t: M/ e* X3 P/ N
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。0 y1 O: P% V- M  D, a
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
3 V) m) O0 e9 K' R" t$ X9 t4 e1 p 谢谢各位。! D5 ~$ {+ h% G- X) {0 `) l
 

Using WMI.rar

1.08 KB, 下载次数: 1612

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
( S& R% a* g- e9 x4 v9 P( R1 S2 B( I5 x1 S. p' q
// Using WMI.cpp : 定义应用程序的类行为。
, |+ f  \. Y0 b7 F  ?2 h( }//6 p/ k) Q3 t. L, R3 r

/ w7 _! j* a" C& \, f#include "stdafx.h"
! s% F/ z2 t4 F#include "Using WMI.h"7 I* R* Z0 l4 b7 W0 s! ~
#include "Using WMIDlg.h"
# A4 s- d" \8 B1 T9 f% F
! O9 T9 m2 S# {9 J8 t#ifdef _DEBUG
- U/ R  W& }4 U) v1 w#define new DEBUG_NEW
9 u& M$ C2 L' F' W#endif
' @% C9 ?/ o  D% O& c; n8 E) D: R4 f1 r5 r) ^
1 z7 `7 m3 o' ~+ n9 h9 U+ S
// CUsingWMIApp; R7 e4 N+ T6 [; H2 S

0 n- g& T& P/ DBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)4 ~( o! Q2 U+ @: e* `0 e+ N
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp): a- _. @( {0 x. R2 V
END_MESSAGE_MAP()& i  o5 ]) F7 A8 c7 D
; ]) V, p( P4 K- X/ e, I
; ^: r, q8 ~& G: Q' |
// CUsingWMIApp 构造
- u2 K: M, g$ V8 ^' n9 ^, i" a
' w$ h; s% v9 sCUsingWMIApp::CUsingWMIApp()
. W9 j6 \  m( m  G8 f3 s{" U# j* x3 _! S" P4 k
        // TODO: 在此处添加构造代码,
1 _# l/ @% K" `9 ^" v- s        // 将所有重要的初始化放置在 InitInstance 中8 P) E, J3 `" b2 f9 g( c2 ^
}$ q' A/ a1 y/ ?. z8 u

. T% Y$ \; q- c8 h1 I0 a# Z& B  N) z7 b% a" F
// 唯一的一个 CUsingWMIApp 对象; q6 W2 Y) a1 X; S: O  Q. B* v3 T
% ?6 T( ?4 O+ n) M. g" R
CUsingWMIApp theApp;
( ~- l1 F$ G& d) C
  _, U% l  W6 P% m- y+ x: l( m1 f! e
// CUsingWMIApp 初始化5 d& I) Y( E& t/ p+ r' w6 K9 x

9 K( ]1 Z% `6 O- P. N0 \" \; J1 S2 A. \BOOL CUsingWMIApp::InitInstance()# J; C  M( W- p) p2 O+ x
{- X) N8 f. o3 S0 Y+ f6 \9 `) \
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
1 H( N' @5 h, ?/ F5 E. W: [/ H        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,0 @2 S9 I6 G' Q+ f. g
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。$ G% `; K& J7 n: }$ e3 [  r5 q
        INITCOMMONCONTROLSEX InitCtrls;
7 q, U, A$ c& N" H3 E% O        InitCtrls.dwSize = sizeof(InitCtrls);* M" [+ i  G, X/ E6 u1 u
        // 将它设置为包括所有要在应用程序中使用的# Y0 Y. F; `$ S/ X$ q) l+ @
        // 公共控件类。
2 z7 a# P6 M2 M7 s: ~        InitCtrls.dwICC = ICC_WIN95_CLASSES;
0 I7 I7 L+ r4 J$ d7 k; T# k        InitCommonControlsEx(&InitCtrls);" i- L% b/ f* m5 O/ R

* c) q2 j3 P; S3 z/ p        CWinApp::InitInstance();5 ]; M+ F2 E: @$ K
- h* j% R; x# q0 _! @6 Y* d6 B
        AfxEnableControlContainer();
: H+ o$ o9 I$ d" E! T8 V
& b. s7 `: T/ ?1 \- y        // 标准初始化
% C; z% j: n3 |7 M  m& t        // 如果未使用这些功能并希望减小  s" g/ g1 s2 l8 [2 q0 S' m! X! N' P0 W
        // 最终可执行文件的大小,则应移除下列
# |& [- s% p  l: J7 z! W( D        // 不需要的特定初始化例程" w7 C8 W, S/ W! r: Y
        // 更改用于存储设置的注册表项
4 ?8 z$ M5 M) @, ^9 c        // TODO: 应适当修改该字符串,0 X) R; |. g% a  g2 x3 X
        // 例如修改为公司或组织名4 l& V& s) c% A$ {
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));' a- E* `4 [2 H+ a4 ?: N

( s: W2 N9 f7 f7 r; Y. t+ M        CUsingWMIDlg dlg;7 G) r% y1 M+ |0 }3 I. _+ M6 J
        m_pMainWnd = &dlg;
0 {! i4 N2 C/ Z! `- Y* h, A1 D        INT_PTR nResponse = dlg.DoModal();7 x/ |  ?& Q8 m& c
        if (nResponse == IDOK)
" Q, Q( g0 N5 Z& F        {! L5 U9 _+ f/ R5 P; T
                // TODO: 在此放置处理何时用
) {4 N& u0 P! Y# U& ]                //  “确定”来关闭对话框的代码$ u. ~2 T' A% }& z
        }, ^9 [% W0 l7 x4 ]9 v, Q: Z1 d/ m
        else if (nResponse == IDCANCEL)
) ^0 v, x* J1 `* Z6 d/ e4 ^        {: V# N% Z' p0 V5 E1 i/ u# O' U
                // TODO: 在此放置处理何时用/ t& {, U9 |" a( |8 p! T' Y2 O
                //  “取消”来关闭对话框的代码
+ z) I1 Z$ _2 ~        }
1 n& `1 h( g9 j0 D9 \. i5 g& M# k* {( I- @4 J
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
+ P% x2 p! S& \' g4 d2 e        //  而不是启动应用程序的消息泵。4 g) s# W4 l/ H2 D+ b5 z8 S
        return FALSE;& M2 S2 _- w" G
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 21:57 , Processed in 0.617123 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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