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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。5 X- ?% @7 e  q0 @4 [
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
1 E* k  O$ W% X. d5 u5 k: F: r# o1 P(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本+ H$ h9 f+ W% v8 d
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接5 @+ |5 D* |" ^8 W8 t4 q
(4):重启执行VBS脚本,得到输出结果6 N* J! q: G1 W1 T/ a$ z# I2 N
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
1 I, R1 y# K7 `+ ~/ n& w* }+ b$ A. t$ D( e' A; B/ G
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
2 T6 w1 d! z8 ~" u# s8 e& v% s   请高手指点一下如何通过这个acpimof.dll来获得控制权9 @; m" G; H' ^2 T
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1556

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
; x1 z' j) E1 Hpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。0 ~6 }- N" h: u/ N& L
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
* C6 r( h, M8 o. { 谢谢各位。; t9 P$ L4 Q: Y1 K
 

Using WMI.rar

1.08 KB, 下载次数: 1610

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件4 V8 t4 R6 h- V& B& l0 P
/ s8 l# _$ h( O6 {) _& ~* o0 q
// Using WMI.cpp : 定义应用程序的类行为。* B9 Z, K2 r* T+ |- w* S. `
//
9 R/ |# `7 h3 j; U
- C+ V) y3 V% j$ u+ I7 Y3 q#include "stdafx.h"
1 b1 w. F1 F9 m) |+ S% r#include "Using WMI.h"0 D% E2 b. k4 x( _- S7 w8 d
#include "Using WMIDlg.h"7 E4 V: \2 B5 [/ ]3 w( `
. e; `( e! t% j/ J. M3 R; x
#ifdef _DEBUG
8 m7 L& x) ~. B( c#define new DEBUG_NEW8 c0 A2 k5 ~& K4 a" i  E
#endif
& J( F: g, V# z6 J7 z$ w. _7 Q. ?1 g9 Z( u' ~* h% h
2 `5 P6 p) Q1 q9 J: D
// CUsingWMIApp/ e. x# X% i4 S: o% E
8 ]5 \! I( r1 {8 a; d* Y! P, d7 M
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
+ O" |/ G- m: L, L        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
* j) `! u8 j6 ]1 L% E+ I- EEND_MESSAGE_MAP()* ~, E7 P: Q  I! J2 E

' ~% i: C: O4 j; {' E* Q, ~1 u' B  G
// CUsingWMIApp 构造
$ J2 `# N5 w) x$ g! o( L9 i4 b$ ]
0 p$ Z8 \; G7 V4 w. O7 m5 ICUsingWMIApp::CUsingWMIApp()' p$ X8 _2 ]( m% P* T/ I& S8 O
{
, f8 w0 P5 E& h+ B6 n        // TODO: 在此处添加构造代码,
0 K1 J0 d5 m4 U, m6 `' @        // 将所有重要的初始化放置在 InitInstance 中
/ g7 V% O7 x2 g! J0 x! k}1 \2 ]6 D0 T8 a1 e& D
  I1 `5 h4 q1 i! s

, n+ `3 c; `$ D3 O2 [$ Y// 唯一的一个 CUsingWMIApp 对象
& N& [5 r8 V" ^$ E, @  I& o7 k
# X- ?9 I9 [7 G9 v0 H. ~CUsingWMIApp theApp;
! w+ m% N+ s5 l5 q( @4 v* _6 H
* p7 B7 y; a! z6 z) B. _. h
% _0 l/ {* j) U) ^' b4 e// CUsingWMIApp 初始化
, u) \  Q9 a, |! g
( N' ~2 n# ], qBOOL CUsingWMIApp::InitInstance()
9 u. _* M8 I$ U" ~" b: i: s{
# _6 ?- d% s1 }' w        // 如果一个运行在 Windows XP 上的应用程序清单指定要8 ~/ ?9 C0 H# B' B$ A3 ?: W  Q  I
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
' H/ z7 N. f" R  _$ u" U2 ^- _        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
7 R1 H  Q6 q0 @% q) m        INITCOMMONCONTROLSEX InitCtrls;# c% p, \* m8 a! x; q
        InitCtrls.dwSize = sizeof(InitCtrls);
, k) v9 A; H" P        // 将它设置为包括所有要在应用程序中使用的
) H% b9 S. |( V        // 公共控件类。
: `+ {) q( C( U/ q! I9 T        InitCtrls.dwICC = ICC_WIN95_CLASSES;. L7 m0 m( x8 U
        InitCommonControlsEx(&InitCtrls);
* O' ?; v- h% J& W3 E6 U
# b( w2 N7 j  m0 ]1 G2 s        CWinApp::InitInstance();' M, X4 T/ B- I8 T) g: y" z
/ W0 \& x6 m& K! Z& ?+ m. X
        AfxEnableControlContainer();; Y' V$ i! t8 q7 V
; F! E$ o( Y, ?2 F! W
        // 标准初始化
) T# P  B' ^( m% J7 J# u) Q        // 如果未使用这些功能并希望减小
$ z8 ^5 v+ W: g1 n6 g( U. ]8 G        // 最终可执行文件的大小,则应移除下列
( v" K: w2 |- N# [' U8 j: q        // 不需要的特定初始化例程; N$ {  [, F+ M4 v% p5 i
        // 更改用于存储设置的注册表项
, q$ i# w+ h3 ?9 Y        // TODO: 应适当修改该字符串,
" I' H. m" T+ K$ ]        // 例如修改为公司或组织名
/ G1 d+ R" R* @' g% M6 D; m- X! C        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
- W2 W: t* m( D, |% s5 K; N0 I7 F3 W$ u' R
        CUsingWMIDlg dlg;
7 W8 s6 K, S. x        m_pMainWnd = &dlg;
) H- Q2 z' @. L  Q% @8 T        INT_PTR nResponse = dlg.DoModal();
9 C( r5 b3 g0 h) P& A        if (nResponse == IDOK)$ o1 ~( O8 W- _% f( a) E7 O1 _; @% f
        {
/ x: y+ k" g, |1 C% v                // TODO: 在此放置处理何时用# Z7 z$ q. x( [9 I! W/ }8 ?4 ^5 }+ u
                //  “确定”来关闭对话框的代码1 y0 h; B# Z# s0 x- U
        }) `  r) H/ ~  O6 Z) L
        else if (nResponse == IDCANCEL)
) Y& p2 k% g7 u. R9 w6 G; [        {, S' c. T4 C; B- z7 ?: t" r& A/ ~
                // TODO: 在此放置处理何时用* ^& \. L8 }# w4 b- q4 o, S
                //  “取消”来关闭对话框的代码, n" n1 h$ u# ~5 u- q& {  D
        }- S. a3 P% M0 f8 ^0 ?2 @

" _$ V) r+ C# b! N        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,# T# L( y/ q# P6 l
        //  而不是启动应用程序的消息泵。
" ]8 j( Z  s' n8 S+ P, \" H        return FALSE;
4 `+ ~' v9 L6 S1 |) C4 a0 u}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:42 , Processed in 0.043919 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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