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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。( d8 j' {, B/ b4 {2 Q9 Y
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
( F7 G6 b8 V* ?: d6 g6 X(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本4 Q  v' d. ]# w3 S8 R  {8 Y+ W. F
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
: l6 M* G6 k) W6 l; z+ T1 ?- W(4):重启执行VBS脚本,得到输出结果
$ [$ L6 d$ Q: f, ^(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
9 @( D% p. R- x5 Q9 C' K; C& z! z' I$ R2 }/ g7 t2 p% X
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
6 [; n: D7 H8 i; a$ h& A   请高手指点一下如何通过这个acpimof.dll来获得控制权1 U+ i: o  ?3 k, m, R5 ?
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1681

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,& n, E: F7 a5 i1 x2 }: T
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
  |1 u6 C0 F  _) }1 D* ^或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!( e% ]" y% U3 O  a6 X
 谢谢各位。8 |6 U$ J% Q/ X
 

Using WMI.rar

1.08 KB, 下载次数: 1727

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件. C) C  a& s- i" Z1 h

$ _  }9 m0 l" u1 ]) ?, Y$ Z// Using WMI.cpp : 定义应用程序的类行为。# S. y: y7 D. A! F3 Y, A
//
  x8 a# p2 g$ a5 w2 g1 h  j  Z. j* `( C' p* q5 r9 T
#include "stdafx.h"9 v3 f. i0 u6 z; T, V
#include "Using WMI.h"2 H: A: P/ v$ j  h
#include "Using WMIDlg.h"
: [4 {/ s5 V9 Y- R# j& j
' U4 F& ]% m' ]9 q: Q$ u2 I5 g#ifdef _DEBUG! ?0 g; B- Q) `: f+ u
#define new DEBUG_NEW
8 V  N/ C. ?. R/ b#endif: S8 w1 Y# ^3 O" e$ u' R

) N% Y1 v6 w$ `; u
: X7 R: S6 o+ C3 M# m// CUsingWMIApp  o2 [3 y5 K* W2 r! q( g2 E

- C: {9 B& e5 u" [% x6 n6 i: yBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
8 ?( D* T' M: g# J+ n" r: u        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)' }7 ]+ H0 M! r
END_MESSAGE_MAP()# R  s6 F, j; v

4 Q- W' z  L1 C2 F" Z3 V# x0 R) L2 X0 a, D: S6 ^
// CUsingWMIApp 构造4 o) K1 N/ [7 D9 s
7 a# d! Q/ @" c: y& c. A5 e! A
CUsingWMIApp::CUsingWMIApp()
- x. S- _' U+ R# U" O{
: j2 X! W7 |3 V( R        // TODO: 在此处添加构造代码,  S8 b0 ~& v& Y1 l4 |. C
        // 将所有重要的初始化放置在 InitInstance 中
7 \, b  ~5 \7 `% ]" i}& I" Z: b3 p1 G5 w, _5 L
" r! q- e2 `3 k: e1 \. ^

7 v" m" [2 O3 h5 x// 唯一的一个 CUsingWMIApp 对象
6 D& e$ F. K! W
7 b# o& [0 s! J% o& ?0 bCUsingWMIApp theApp;& b) X1 U* B! Z/ ^: E
# |: R" R$ y$ o; h. h
; I! s! q1 p, i$ G
// CUsingWMIApp 初始化7 E% S- G8 L; a8 c+ o  m& w' T) {' n
' B! B* C% }, h6 P
BOOL CUsingWMIApp::InitInstance()7 f4 P4 r9 R  h2 ?0 E$ X# G/ J
{. Y5 m  [3 l( _
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
- R* O* f2 n+ v/ o        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
# y6 T, p0 Y4 M2 u8 d7 e/ ^9 q; i1 ~  y        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。5 l. o  V. O  v% S1 z% M4 j
        INITCOMMONCONTROLSEX InitCtrls;
  |8 k* ^7 O. x" q: K+ A" F6 Q; A, Y9 w        InitCtrls.dwSize = sizeof(InitCtrls);; \$ B/ U; H% f+ v( ]
        // 将它设置为包括所有要在应用程序中使用的
1 P6 ]; q0 f+ ]' Z, n* O& y$ g        // 公共控件类。9 j0 X- y9 m1 u: r# O) L  l  g
        InitCtrls.dwICC = ICC_WIN95_CLASSES;# q8 u" i6 h% Y  |. @
        InitCommonControlsEx(&InitCtrls);4 e# q- G; U0 v1 e1 {' }2 z
0 g2 E# _, N  I' i# G; i
        CWinApp::InitInstance();
6 d9 `* u3 g/ l7 R+ D3 m
* A6 ^' X2 @) y  d9 A& o# W  b, Y        AfxEnableControlContainer();
. J/ r) n& W! B. @2 B' f  w+ _, L. d) n$ S9 J" y
        // 标准初始化  }# B4 \4 w3 f" x1 l, N
        // 如果未使用这些功能并希望减小
- C0 ^' E/ C6 g9 F- k4 i$ u        // 最终可执行文件的大小,则应移除下列
' Z: Q& ^4 x) k' v' [# K        // 不需要的特定初始化例程
  B; |: P! {, A0 ^8 G& q0 n        // 更改用于存储设置的注册表项
. P' T3 s! l; c( o$ W        // TODO: 应适当修改该字符串,
! d0 Y3 e5 L2 J4 a        // 例如修改为公司或组织名8 z/ a/ ?0 N* N6 P1 p
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
+ X; R5 Y3 a+ O# T, w" R, W0 ~9 j6 i( d; W: U4 q7 O1 `" |
        CUsingWMIDlg dlg;! H" \& Y# k: r8 T' Q
        m_pMainWnd = &dlg;7 d+ {& U) k; h+ N& U3 V* ^
        INT_PTR nResponse = dlg.DoModal();1 x: u0 }- {) F; E7 ^
        if (nResponse == IDOK)# F9 N( J# r* b# L" m
        {% H5 [7 m( ^7 I& L
                // TODO: 在此放置处理何时用  d! `0 ^9 Q& \1 [: U
                //  “确定”来关闭对话框的代码
5 I- p7 ?% t* w# S3 L, @( }7 ?        }' P1 X3 Q! z3 ^) z1 n/ m! \' n
        else if (nResponse == IDCANCEL)0 L# s+ U' ^7 I- L# g
        {
1 U5 y, e' G! y* J8 K( I' V                // TODO: 在此放置处理何时用4 Y1 t3 {( d8 u9 ^& T$ f7 ?
                //  “取消”来关闭对话框的代码/ v' y- i" F% R
        }$ x0 [. D! u6 |: `5 R) o0 U
% r* c2 T, S! Z" x# c! z3 [- k
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
: M1 x. Q' _1 r- v% a0 K/ B        //  而不是启动应用程序的消息泵。
( q) e/ |3 s9 v: M        return FALSE;
3 B$ R% b1 H, [0 L; E}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:10 , Processed in 0.199569 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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