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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。" Y# A: t$ y( I& b
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备2 B1 n3 ]0 E) c! G" w; Q. p
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
: n* Q9 t: L: \& u, F- e(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
3 N7 x2 z( E. B' `6 s6 _(4):重启执行VBS脚本,得到输出结果4 h9 {& k; j& h$ N7 n0 Y9 y
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)4 Z3 i. g7 U8 P) ?2 E% a
5 A7 Q  C3 ~2 b. Z4 @
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。2 ~6 x' l" N6 ?4 X9 U
   请高手指点一下如何通过这个acpimof.dll来获得控制权- P) i7 c, G- a6 F( d; ]% r
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1640

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
. y# [2 C4 m2 Y3 M5 ]7 v% B. X我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,: }- m7 B9 x  S7 E
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。: K# I# o) v( Q, W
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!: f6 B7 E) n2 k: G/ y( Q. w
 谢谢各位。
- k( x) f% ^: S6 ~ 

Using WMI.rar

1.08 KB, 下载次数: 1701

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件; V  m' \1 Q: ]+ }% Y) L

( U4 |5 m4 G% z- F1 s// Using WMI.cpp : 定义应用程序的类行为。
9 A( O' [% C8 C+ q" A//' z# v2 {) g+ R  k7 j6 z5 g

5 i* x0 K: P& d1 P#include "stdafx.h"
2 Z0 t- ~' v8 V" W7 [#include "Using WMI.h"
( z2 q2 k3 K) G4 ^  \' |#include "Using WMIDlg.h"
+ o6 B% b4 a* j8 I. Q
: F  l: U' R5 @* o3 u. n' O# T6 x#ifdef _DEBUG  a; W* n0 ^$ E5 R: M2 J& _4 p$ B' A; F
#define new DEBUG_NEW
, A- y; K1 m6 o#endif
2 k! s6 a- H# G$ ^, V
2 P" o) E. e3 K( b/ O2 Q( Q+ n4 p) x' g5 a* x9 n& {
// CUsingWMIApp% ~; o6 [) T# f$ G1 I+ s4 a
+ e) u; m3 f' E
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)( @6 y7 X) K; b4 D' [3 A
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp); Y% X4 y' R( d6 I* `! _! t
END_MESSAGE_MAP()
, T( W( j. C6 p4 }0 f4 @; @
" b' i: P1 b* H* I# H+ K' T& h1 j
// CUsingWMIApp 构造
% W- B; d. e/ D  T- n7 M3 m9 c) \3 `8 S/ ~
CUsingWMIApp::CUsingWMIApp()
* g  U: L8 n+ D! C' v; e9 A{
: d1 k9 h* b) X  \, P        // TODO: 在此处添加构造代码,
+ V9 w4 ^/ u2 ?7 _5 m2 I        // 将所有重要的初始化放置在 InitInstance 中, j+ s* q% [0 p0 q8 r: E
}
, [9 R; G6 }9 e. k( z/ w
  o2 N6 H' P* k" m; k$ ], B" L3 ?3 j$ b6 R
// 唯一的一个 CUsingWMIApp 对象
) T& q* @4 K8 x. g6 K  B% Q$ [! q: o& i$ j+ l" N; i$ U8 i2 a
CUsingWMIApp theApp;$ s( T( D; G" e" X! d" y  A

+ f- R9 R  h# W' E& F& J1 C2 l5 r+ q/ V/ P- A8 J. V3 t$ o% T* T
// CUsingWMIApp 初始化( g4 T6 F2 a* a4 I9 _

" w1 `" i! `/ ~' p' V4 S1 e, gBOOL CUsingWMIApp::InitInstance()
/ F* c9 [+ z* M$ p. c; S{7 v  F3 s. l4 [. p' |$ w* s0 G1 N
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
8 W# w7 i6 h8 u% R        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
: w9 {' C7 a4 _$ I1 Y4 b6 b        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。+ k+ N9 P: J2 ]& C+ B+ F! D1 M
        INITCOMMONCONTROLSEX InitCtrls;
3 r: d2 j3 d8 G; t( \        InitCtrls.dwSize = sizeof(InitCtrls);0 ~# `8 ?/ a9 R, g! g0 f5 ~, z5 c
        // 将它设置为包括所有要在应用程序中使用的
, P# N8 [$ \- `9 O* _        // 公共控件类。% x' ?3 W  m0 r& t
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
( Z" V& L* b( G4 y        InitCommonControlsEx(&InitCtrls);' }1 Z9 m( Z! i  b" y" D, \
' m0 {+ d: X+ ^! H+ H
        CWinApp::InitInstance();
) w. i, p9 h' Z+ m; P+ z+ T7 `
# D6 ~+ B( k1 N3 \$ D. ^7 S        AfxEnableControlContainer();
; Z/ Q. y9 B/ X3 g! e) K* o8 O! L
0 v! Y0 V2 @4 j        // 标准初始化
5 f5 I! ~7 R. Y% K9 H        // 如果未使用这些功能并希望减小1 V- H& a! ]+ x/ V; P- E9 h& d
        // 最终可执行文件的大小,则应移除下列
+ H: D- ~' d5 D* l% J; u        // 不需要的特定初始化例程1 |) `. N% x7 a0 E% h6 T1 ~
        // 更改用于存储设置的注册表项! k( A& k  W+ T( Y
        // TODO: 应适当修改该字符串,
# h$ o: T8 p6 c+ J( T9 B        // 例如修改为公司或组织名" u- Z8 |. a/ T$ _( Y
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));, @, |* Q* I9 u

# L: X& q7 X4 S        CUsingWMIDlg dlg;
, \# ?# o7 A' A" Q        m_pMainWnd = &dlg;) ^+ b$ [9 O9 I8 ~, I$ B
        INT_PTR nResponse = dlg.DoModal();  F2 @+ z2 }  B! I
        if (nResponse == IDOK)9 d" Z; L& v5 T/ s# H1 O3 e2 U. Q  U
        {' v) {" h2 `' _+ r& b/ O, ?
                // TODO: 在此放置处理何时用# Y+ S; W: ]5 \- T
                //  “确定”来关闭对话框的代码- q" g! d; g2 R/ p! y
        }5 Z7 x' M! ~3 e5 _
        else if (nResponse == IDCANCEL)" ]5 K1 r4 ?* ^8 L8 z
        {/ _0 c+ _' F# T* d9 e$ v9 \; O
                // TODO: 在此放置处理何时用
. A, K) G6 o# e. o2 a4 B                //  “取消”来关闭对话框的代码( L7 d8 `6 A, v- _' M8 Z
        }6 F% b5 n. Q+ q, ~: k; F* X
. g5 N1 Y6 Q$ O! L. s$ ?8 E1 L
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序," C4 x& Z- ?/ E" W9 X6 D
        //  而不是启动应用程序的消息泵。
8 B$ m1 Y0 |: \" u0 L2 o, M5 V. ~) _        return FALSE;
' l3 m( d2 e) ?6 R3 @}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-19 19:05 , Processed in 0.239752 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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