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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。' X2 _  m+ n* L( J2 `. G. Y& D
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
7 |% ?$ j' L2 {' O(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
4 c% h& Z! g& S% C! I(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
+ M8 y3 g/ [( H, f/ S- P* C0 x: I(4):重启执行VBS脚本,得到输出结果; i" Z. J, A! K, p0 l. p; [
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)0 M3 \0 I2 Q% {# q
! P* E* P& d; i; b5 J  k4 d
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。* N& g6 Q. y2 g; G! w" H$ E( {* D+ V& S
   请高手指点一下如何通过这个acpimof.dll来获得控制权1 ~8 ~9 y2 T! v" w5 |3 \/ P0 v
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1406

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.; i5 }* q6 q- \7 z. g# Y4 T
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,# O4 z, @: ]9 a( e
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。; r3 a) C% F0 g3 L6 E  l
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
7 S  p5 f# K) x8 B$ i& x0 Z$ B 谢谢各位。
* a- I: K1 O) y7 M8 } 

Using WMI.rar

1.08 KB, 下载次数: 1476

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件& @8 P+ C4 G7 x( y8 g

8 K1 z+ ~1 C. |" Q! ]6 c3 d% P// Using WMI.cpp : 定义应用程序的类行为。
) |( n1 S; S0 x1 N  }# ]% L//3 y: ^' r; ^# F: k' b" S

7 {  Y8 F/ r* M% X1 n# `#include "stdafx.h"
& N5 X! V6 Q4 z/ W+ t8 H4 z# C1 p) \#include "Using WMI.h"3 E1 x6 }" A) E! }
#include "Using WMIDlg.h"+ _0 Z: ~6 i, v. [' d
! ~6 g* y+ v/ C! o* c$ v2 u
#ifdef _DEBUG
/ z$ I7 Y; e2 K5 o#define new DEBUG_NEW
  t3 R( U9 T& p& K+ Z) n#endif0 `) S0 u' ]3 ?

- U3 ?  m6 A$ L$ E" j9 u, M& l" U( E6 c3 ~. ^( W4 C
// CUsingWMIApp, F' P9 q( n/ {; I  I

, \0 g' s/ c4 c! h9 ~) S6 `BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)3 [5 x% D7 U5 X4 S3 N
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
+ G  v3 Y: ?+ E2 O' lEND_MESSAGE_MAP()8 U& d, f3 P0 Z1 C9 d1 B& [9 g

* S4 A& R6 V8 i# v( ~6 c; w6 U# I  Z- H6 N0 P
// CUsingWMIApp 构造
8 g0 s) ?2 d+ J9 y/ {3 F4 E% p9 w! s7 B# Z4 |7 \
CUsingWMIApp::CUsingWMIApp()) n! S' y, r6 X; t7 O$ P# _2 M% c
{
% m1 X# t/ s+ M        // TODO: 在此处添加构造代码,
2 x/ E2 E  R6 e, [# N5 M        // 将所有重要的初始化放置在 InitInstance 中
+ y+ Y& L* U* d! W- N% B}+ s0 |2 x* _( _+ {

$ T- J4 o8 Q- U! ]+ `
$ o. a8 n: [7 X: S// 唯一的一个 CUsingWMIApp 对象5 m# i" ^3 U; [6 h2 Q
5 T! w9 o! k6 y2 e3 a
CUsingWMIApp theApp;
+ S. I! U& [; A8 y' i7 e$ W# ~9 `5 A2 Q+ a' l& b# E' N
' ^# G% ]$ L% F* Y' ?, }# G
// CUsingWMIApp 初始化; R( \) y. [0 @" U5 s* n1 q

2 H5 J2 k0 s# N7 K. ~- k5 h4 yBOOL CUsingWMIApp::InitInstance(): K  X# R1 H0 `1 j. X7 k
{
; K: ?- q/ z8 _- ]. y7 U& D        // 如果一个运行在 Windows XP 上的应用程序清单指定要4 z$ f7 Z& v3 G. M/ \* J+ G' F
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,- J+ G6 E3 X9 s" d* S# s5 k
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。2 B. y* `5 N: e- F$ b$ e
        INITCOMMONCONTROLSEX InitCtrls;
* f0 Y6 J" D2 }" P        InitCtrls.dwSize = sizeof(InitCtrls);
, n7 `, @% E( g) o. t        // 将它设置为包括所有要在应用程序中使用的6 n8 E6 _/ g5 m4 r
        // 公共控件类。4 Z7 w9 d* S, k' ?, |% w5 N- q
        InitCtrls.dwICC = ICC_WIN95_CLASSES;+ J( A6 H4 \' b9 ~. \- z. q: m
        InitCommonControlsEx(&InitCtrls);: D: S: L# K$ d" H

+ i* C$ b+ r, u) r        CWinApp::InitInstance();
2 l$ ~: F; U+ ~6 u# x& h; A+ I& u! P* k
        AfxEnableControlContainer();
# p+ x5 L' e# L7 R# L0 X0 e5 X- K4 n  h; d' x
        // 标准初始化
2 Q, d8 @  M% ]$ F; _! y& O9 P7 o        // 如果未使用这些功能并希望减小4 u  W9 G$ Y/ w: R. I9 p+ v
        // 最终可执行文件的大小,则应移除下列
# C$ H  c# E! Y$ @        // 不需要的特定初始化例程: _4 S3 x& v( B7 i
        // 更改用于存储设置的注册表项% V! x: W" ^' ~; b( O
        // TODO: 应适当修改该字符串,
  s( s% F$ B4 X- G. B# R: r7 `" q8 k        // 例如修改为公司或组织名( Q9 @) D% ~4 R
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
+ W; j; U# {1 H: M- \9 _5 ~2 K0 ]: {7 B$ {
        CUsingWMIDlg dlg;' ~: c* o" _+ K' h( a; n- Q# B
        m_pMainWnd = &dlg;  E1 ~  t9 N$ q( {* W8 S4 q5 h
        INT_PTR nResponse = dlg.DoModal();- v5 v1 t) l$ q, t
        if (nResponse == IDOK)
+ F) d. h6 p. c% I7 B8 t8 L# m& o7 {# y        {8 [  G8 V) u: }. ?6 ~
                // TODO: 在此放置处理何时用' G9 {: R+ [8 L- _6 z
                //  “确定”来关闭对话框的代码4 u! G; _" Q8 o" u' I* \' B
        }
$ ]4 |, j' P* d4 S& G! t% ?$ K1 l        else if (nResponse == IDCANCEL)
: f: l% P. F, M' N3 e7 F        {
% ?5 P3 ?% L- M3 j& g                // TODO: 在此放置处理何时用- g" o& g/ ]/ [+ d% a  n, ?' Q# V* k
                //  “取消”来关闭对话框的代码6 n' M- N3 r; n- ?1 i
        }1 h+ l- w3 K: \! D$ S! R8 O8 C
2 _* M6 T9 u2 ]8 O$ `5 w8 u& ?3 p/ a
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  l1 q) |5 o1 F        //  而不是启动应用程序的消息泵。
2 P3 E: q; F7 r6 o        return FALSE;
9 b* x( k  H4 n+ [}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 19:08 , Processed in 0.060150 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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