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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
7 A2 Q- x+ O( r(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
+ @1 w0 p$ L% ]# {( {(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本+ y, ?$ u4 m7 f% U
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
$ U" @( z/ F: Z  C# d6 w(4):重启执行VBS脚本,得到输出结果
9 ?( Z" W2 R" V. L- `(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)) K* R6 _! P1 M+ j% u4 _

* N- T; l. W  w$ F! ]3 {问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。- C3 E: F. b5 L9 J: F! _
   请高手指点一下如何通过这个acpimof.dll来获得控制权5 S. G$ k! B( }/ @( U" ?
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1613

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,0 d( L# ~9 J/ S1 h9 m3 C
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
- q8 E& c7 a, s: W: i或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
6 K/ ]6 a8 S* T$ j: s1 N5 ] 谢谢各位。) W: z. A' Q" G. O' B) R( \
 

Using WMI.rar

1.08 KB, 下载次数: 1673

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
% r5 o" |% t% @. g; y0 N
; l* t6 o/ W) k) \// Using WMI.cpp : 定义应用程序的类行为。
% ?4 V+ T# |: H) M4 Z. |- I//& c1 y5 O7 s8 E% n. j
, w3 e; U/ p, s( h- o8 b8 G
#include "stdafx.h"& q+ H6 }+ ^: o& j, V
#include "Using WMI.h"$ I1 {* Z$ g. j2 R1 j
#include "Using WMIDlg.h"( ?' _. H1 Z" L9 U

* B6 ^: L; f6 V4 l& I6 N8 c# F#ifdef _DEBUG
" }/ f9 I/ M3 [: i#define new DEBUG_NEW
* R- G- P: U8 i#endif
' r9 m! C. r0 z! D8 h" D
; e4 z: m, q6 b8 r+ y; _8 F4 ]1 C6 n! _
// CUsingWMIApp
1 K. }" k+ p2 L% E7 }
1 N1 x) s6 U/ \$ SBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)# j2 {# v: R, o( L" t" l+ k( s
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)9 D& n0 o: a, o- N3 q; {
END_MESSAGE_MAP()6 ]1 Z+ u9 q4 k: m1 g

, {/ q3 M) q8 R4 g! E8 B& y: l5 n9 m4 c
// CUsingWMIApp 构造
3 |' W! w& _& w' L0 Q
8 g& D" p) [* W$ |4 ?8 {CUsingWMIApp::CUsingWMIApp()0 R- _  ^  P2 C
{
5 ?" n8 G5 o7 z/ j        // TODO: 在此处添加构造代码,. R+ r, t, q4 z9 N9 J6 s8 f
        // 将所有重要的初始化放置在 InitInstance 中
) v6 d! C+ l) }; \! s1 X) |# G$ c}
, T4 i- M2 @2 S% q$ V" J( }7 l  \- o0 E# d3 c0 J% w% o# ^- q* E
7 U" ~* z$ m; h1 A8 V- V$ R
// 唯一的一个 CUsingWMIApp 对象& H& a) f" r' T4 c) k5 s/ s2 a; i
* s# i! B9 D9 f# m) }1 K2 b) `9 F/ p
CUsingWMIApp theApp;4 r9 }% ^1 u/ B8 R2 W/ M
' y* [) L! v; \

6 G$ A3 w) w6 x// CUsingWMIApp 初始化
& p3 U% M- I5 u" |9 O5 F2 g2 R, X& T# \
BOOL CUsingWMIApp::InitInstance()
2 B2 q; I. H4 Q" Z: ~2 G5 K6 [1 n) l{! d/ I4 c, _3 `4 i) T* X. U
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
* `5 z/ _! Q) b# \8 d        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
" w& k( n6 K4 D7 A# S' r2 Y4 P        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。" I; B9 d+ R" R; s6 s; E4 ~
        INITCOMMONCONTROLSEX InitCtrls;
" j/ H. s) K) I- [9 F3 Y- p) E6 }        InitCtrls.dwSize = sizeof(InitCtrls);
) T& Y" a) O* ^' H0 L# H. P        // 将它设置为包括所有要在应用程序中使用的/ n4 {& }! `' R* R  q5 U( ~* F
        // 公共控件类。
3 |' u/ f; k! \! @/ }- _( T        InitCtrls.dwICC = ICC_WIN95_CLASSES;
/ c8 o8 h# c  I) }$ I, {( W8 _4 b        InitCommonControlsEx(&InitCtrls);( X. L# }# r% b4 E0 w$ t4 N3 O0 o9 n
" L9 `, J6 |! @$ H( \$ m* G- K
        CWinApp::InitInstance();; O& _4 Z2 X1 z
( ]" `- [8 A0 s+ S
        AfxEnableControlContainer();
% p1 u6 {; _! E3 A# Q* C0 l5 Z  q6 i5 y, l$ O6 a2 G  ?* i
        // 标准初始化
# m- S- {  q7 n        // 如果未使用这些功能并希望减小
0 w) @1 P: p+ V1 M- K; d7 ?        // 最终可执行文件的大小,则应移除下列
0 u4 ]+ u2 t+ o9 A. g9 n        // 不需要的特定初始化例程
2 R6 ?. Q; x, t0 ]        // 更改用于存储设置的注册表项6 C# A+ O  y& G3 g) r3 h5 i
        // TODO: 应适当修改该字符串,
1 z# V  p4 ?+ |) {$ D  x$ x        // 例如修改为公司或组织名9 T8 |- W% n- @, T' g4 T4 E' g
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));5 w4 ~0 \! w# n8 B# a- [3 L+ G5 I

, z4 }& Q( G$ E8 F, N0 z4 w        CUsingWMIDlg dlg;6 _3 w) H1 f  G0 X" R; B6 ?
        m_pMainWnd = &dlg;
$ A7 m) S6 K" m        INT_PTR nResponse = dlg.DoModal();
' d% U3 y9 `4 w3 ~' `        if (nResponse == IDOK)( f1 b! w( H$ [% u. J
        {4 O4 \" q1 k5 p' A4 k
                // TODO: 在此放置处理何时用6 u5 P0 k9 z1 I% z+ v
                //  “确定”来关闭对话框的代码
9 b/ w+ q1 C+ F* o# ^7 Q        }
% z6 u4 ]9 d% Q, {0 S4 a3 o: M        else if (nResponse == IDCANCEL)
) O+ y3 l. c3 |* m3 X7 u. Q! i        {: w4 Q: R  k! J8 Y5 {! a$ ]
                // TODO: 在此放置处理何时用6 K0 S% w# G2 U% c
                //  “取消”来关闭对话框的代码
+ S. p5 }3 p0 ?) t& s) [        }
4 {& s3 v2 [6 n9 J' V) N. X! B5 R. j9 M8 y
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,: U4 I2 z' x( _! K  n. r
        //  而不是启动应用程序的消息泵。
. _6 b% t$ L; m. \8 m4 S        return FALSE;
1 C' j% W4 I4 d! y1 V}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:14 , Processed in 0.160633 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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