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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
' T% \' {: T" D& i" p1 E(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
2 e3 }  ]! J# F(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
$ u0 W, J$ f- ~8 Q; ~5 z(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
3 x5 e! {( K) m0 a6 X, r  ]' B(4):重启执行VBS脚本,得到输出结果/ H: p+ |3 o* Q. b' @
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)( J. z4 J; V$ T% N' F& s- \

6 r1 x" {0 f, c6 K问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。& [: l/ c- r' _3 g- ]& R" p7 Q
   请高手指点一下如何通过这个acpimof.dll来获得控制权
+ n" b6 S7 \6 k/ y   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1413

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.$ e1 H. x2 D3 c! n* _7 y; j2 @
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
7 r% x9 X3 O. gpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
1 g$ _/ i. n) m或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
% y$ @/ K- @8 d7 O 谢谢各位。- X" L8 J6 C8 L* C' V- `" i3 J
 

Using WMI.rar

1.08 KB, 下载次数: 1483

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
3 t) a6 X: s) v( [3 K, o# F) z& e$ e; _( N- T' P- m! a1 A7 f; g
// Using WMI.cpp : 定义应用程序的类行为。
, S# D" |& j( r* A% f5 }, c//
$ C( F( u0 L  T8 x0 f2 t  C) O
4 L6 x$ \( y+ j: Y#include "stdafx.h"
- J1 }9 h  K' Y6 v#include "Using WMI.h"
: B' _! H, M2 Q* p2 a#include "Using WMIDlg.h"
- G- K/ b3 F( f1 m/ [9 g
5 Z$ x, @, Z9 K* q5 v" @#ifdef _DEBUG
! f5 c4 A9 O' N" j#define new DEBUG_NEW
5 G1 J* O4 |% w- [/ U. t#endif6 S8 d; S4 Y+ a& T* y
. ~/ d8 F- ?6 V
( `7 v, ]. P4 u" a+ g! t
// CUsingWMIApp
- r* L( R, _! a# q* C( Q! Z
; M% O$ J- R7 K4 ?. u$ jBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)% V; c8 a2 |  Z1 e4 ~' p6 ]# d
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
" _' R; b0 U* Q+ P, ~- bEND_MESSAGE_MAP()
/ C* g' v5 [0 I0 n8 T- s0 e' f$ t" g& F5 o: [
. P% ~& r/ x- t
// CUsingWMIApp 构造& h9 c  _0 P2 s2 \8 P- n
/ ]; G9 @6 N$ A/ L
CUsingWMIApp::CUsingWMIApp()
  b" s3 i) ~0 S; n0 t* o{( a, U- Y" i0 {7 j  q2 l
        // TODO: 在此处添加构造代码,, }$ H7 W- {3 W* W* ?+ g3 n( {
        // 将所有重要的初始化放置在 InitInstance 中
# Z+ `, P; [7 j% {& l2 @' [}
) ^1 ~9 t. |" {8 I2 |# P4 w
4 {+ Z8 [+ L4 p) d$ @
& Q8 I+ V" T' A5 ?+ y  b! j( v/ j// 唯一的一个 CUsingWMIApp 对象
5 v: u; L/ ]" O: i8 T
) n" j- B  {) n7 `' r! D) t! K; FCUsingWMIApp theApp;
4 Z5 A; d# A; `6 m
8 v1 D! ]) t8 e; u
6 `) G: s2 N; f. S// CUsingWMIApp 初始化
. f0 I5 q  h4 D& I" l; k0 J7 v, v) l, p1 g* J- ~5 v. U0 Y$ ^' \- L
BOOL CUsingWMIApp::InitInstance()
) z  m0 ?3 i, q! f: [3 g{- n( m3 C. K3 q5 d4 ]( g% [) B, z
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
  f9 ]9 G% Y' z1 s6 {. U        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,8 n' H2 l1 {9 |
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
7 c3 Y" S7 I+ S2 D' u9 C" Q        INITCOMMONCONTROLSEX InitCtrls;  t( j7 ~0 P7 ~/ @/ k
        InitCtrls.dwSize = sizeof(InitCtrls);
$ Q9 G6 {. s2 T% u, c        // 将它设置为包括所有要在应用程序中使用的# \, n) g( I! G8 z( m  B0 i
        // 公共控件类。
3 ^( a9 f4 b1 A2 h; n6 [        InitCtrls.dwICC = ICC_WIN95_CLASSES;
0 A6 w# m2 C8 T1 b2 m  e- l        InitCommonControlsEx(&InitCtrls);6 Y' F! b+ W) m, {
' N( Z7 T7 i$ ]! M4 y) f
        CWinApp::InitInstance();5 p" U- t% H0 \; B" I

- h0 v% L. ~: u9 G( b; X6 N# d        AfxEnableControlContainer();. v8 P  w7 _4 v. s
- I5 y3 W8 e/ V) g1 t
        // 标准初始化( C# V( Y/ k0 X
        // 如果未使用这些功能并希望减小
  W3 d: S0 U- l        // 最终可执行文件的大小,则应移除下列
1 N7 k9 N& `7 ]( d) z" ^        // 不需要的特定初始化例程
& `) t; Q9 e; w. o) K( w        // 更改用于存储设置的注册表项
% @; u3 Z1 J& e6 D, a  y        // TODO: 应适当修改该字符串,
; }9 U9 M& l) p) r1 n; b+ V3 W        // 例如修改为公司或组织名5 ~/ O# ]% [' b( u. z3 O  `/ A' z$ r3 ]
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
/ N$ j0 J9 Q& H! I- y) k: T  P" e3 ^
        CUsingWMIDlg dlg;
! _; }" H# B1 r        m_pMainWnd = &dlg;( o0 c9 c, c/ q2 k0 |! E7 c3 M8 g
        INT_PTR nResponse = dlg.DoModal();. {# ~/ d9 N! ^# r
        if (nResponse == IDOK)
. Q# p, P) Y( m4 U( e6 d: C        {7 L8 m' R) H* r, g: \
                // TODO: 在此放置处理何时用
& r1 D9 ~0 ?% b; Q+ S                //  “确定”来关闭对话框的代码8 N( Y1 X, ~. A9 P9 d
        }2 o8 k) n6 i/ D- L9 `
        else if (nResponse == IDCANCEL)4 j. [$ v) p& n' f
        {
& _/ T& Z& x# }# E, ?                // TODO: 在此放置处理何时用
6 d) L- b. z1 d0 D8 \8 m0 Q9 G" s                //  “取消”来关闭对话框的代码4 V& v& H( t, H8 C
        }
8 x, `7 c" h5 X. a
/ a7 S& X+ u" Y# c3 |        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,4 M& K. z$ y2 d* n
        //  而不是启动应用程序的消息泵。# J' z( n! H" @5 ^, a$ z/ W
        return FALSE;9 W, @& ~8 w: T* O: K/ N
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 06:47 , Processed in 1.829146 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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