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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。0 W: |$ {/ c* _0 e3 K- z
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备* `7 E% R6 S  E* `' a0 H  Z9 k3 I
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
% F2 h4 J/ i0 t7 `5 Q5 v: X0 K(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
- a4 Z4 \+ o" l2 }(4):重启执行VBS脚本,得到输出结果& q* A3 C% ~" Q/ ^4 ]9 }( }+ [
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)- M  p, B. d* d2 @7 @

/ j8 P0 a. [- g0 \$ H  @问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
. }  v$ i$ h3 x5 v   请高手指点一下如何通过这个acpimof.dll来获得控制权# L* e" r' e) C" d( P+ r. w, T
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1525

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
! \% R1 v% s2 j1 `: |9 Npeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
. J5 n& ~, i& @" v8 }$ A4 E或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!# R. y( ~  Y2 z
 谢谢各位。2 w9 ]2 X. d/ D  g! l" r( a
 

Using WMI.rar

1.08 KB, 下载次数: 1574

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件( V' ^! y* W- P; F2 J, \8 |, j0 a

1 Q, L. V' J' z8 @7 X// Using WMI.cpp : 定义应用程序的类行为。
/ |1 Z7 b. f: u$ j//
) h9 w* X# q) M- N0 |3 t
3 ?9 ^1 x+ b& S, {5 M, d: S#include "stdafx.h"
+ j( K  k- [; b4 }2 H#include "Using WMI.h"
2 ~0 u& R0 U( J( F, V#include "Using WMIDlg.h"- t2 Y6 X$ x" n6 f" D0 I
3 m( x* k. J8 i* h& W
#ifdef _DEBUG$ Z! G! a* s; w- z! Y4 a) |
#define new DEBUG_NEW0 L. h0 b2 Q5 C/ @4 h( r
#endif
  [  G* ?1 v9 {! i; g. B5 O% ]' _/ E4 `
3 z0 R3 f: ~2 O0 |) W; S
// CUsingWMIApp3 ^4 s) ^* e" e! R1 ?0 A

/ Y7 ~5 g, h  e: nBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp), E6 a6 `" g" y5 ~% H6 C# ^
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
/ I& n; _/ g  f, a, kEND_MESSAGE_MAP()' T" ], i' |' Q3 F/ q
5 m2 i9 F1 P" Y/ x/ R
' _5 |7 t$ V, Z$ J: Q
// CUsingWMIApp 构造
) E4 u) k( J% x8 O  U$ n
" G: m! V- H0 T$ bCUsingWMIApp::CUsingWMIApp()
. p0 Z) ]0 D! M- N{
* L4 @% R& ?6 s% j: |        // TODO: 在此处添加构造代码,
+ a$ |" @. Z" _4 q5 v# p; l* ~        // 将所有重要的初始化放置在 InitInstance 中; H, l2 [, T' Z1 Y% k2 Z
}  o; Y* H4 ~  u4 U* J, b% T2 S# [  S
0 ?1 F% W9 t/ Z9 g2 ?. Q" L

+ ?8 ?" x7 r; G6 L// 唯一的一个 CUsingWMIApp 对象. ?! h& b7 s1 f! N( n$ q+ N3 w0 i
) h* z* n0 c/ @' l" o( `
CUsingWMIApp theApp;: g# @: G5 Q8 a  T; K& r* ~
' @4 m9 K- O1 j& g1 D+ c

' W# _/ n6 z/ R; f- t- U4 Y: J, i5 {) F// CUsingWMIApp 初始化" q: _- h6 y* q# q) T
. ?, E! J- Q4 g" K
BOOL CUsingWMIApp::InitInstance()
( S, n9 c& A: S5 N1 }( N{' m6 }  c5 z5 G1 `  B7 H0 p
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
7 B9 w* J' G+ i. k        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,$ U2 u/ B' P. t
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
' \' e- L0 n6 j( z" e        INITCOMMONCONTROLSEX InitCtrls;
7 ~6 N7 S$ L  l5 a1 f        InitCtrls.dwSize = sizeof(InitCtrls);
3 Q# b' q. p- K# i7 U! ~, O        // 将它设置为包括所有要在应用程序中使用的. z' n4 W3 p9 C# g: p
        // 公共控件类。' w" M7 }9 E: o% }: x) }
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
# O' L- \" i7 s5 S6 n( O        InitCommonControlsEx(&InitCtrls);; ?5 c; I7 d6 X8 j0 y
. [( R- J9 W) @$ G5 n- n
        CWinApp::InitInstance();8 l* ?1 v- i) o

7 T0 v! ?1 B! {* g, c) Q; K        AfxEnableControlContainer();
3 R6 \+ V( K% U- |( |* e1 v5 ~/ ~
2 p" g6 ~% z) i        // 标准初始化% \0 y8 ~" P( O! F6 g
        // 如果未使用这些功能并希望减小1 l" i8 g4 N( f2 _9 o
        // 最终可执行文件的大小,则应移除下列+ U+ I3 ]: d" b* o. ^; _( I
        // 不需要的特定初始化例程+ K- I7 S0 a7 H- b
        // 更改用于存储设置的注册表项
& g4 P6 O  h+ x" Y        // TODO: 应适当修改该字符串,
' G% D* w& `$ n9 p6 R        // 例如修改为公司或组织名
3 s) x( h* T8 y/ D        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));0 U! A( q9 |( r5 f7 i% K
2 q+ c' l. k  H3 ^9 k3 K* B
        CUsingWMIDlg dlg;
# y% ~! Y' {& q2 z8 d- u$ j        m_pMainWnd = &dlg;# X1 H; l" E% L
        INT_PTR nResponse = dlg.DoModal();9 Y/ _. j% |; e: w* H( [2 m
        if (nResponse == IDOK)4 F9 I# t. j$ w6 v3 e" F
        {
$ ]6 T# O$ V  R* @                // TODO: 在此放置处理何时用. _4 ^2 z$ |& @* W  L
                //  “确定”来关闭对话框的代码6 a9 j6 O! p$ y
        }8 t- o4 j" j# B! V7 b% ?( S
        else if (nResponse == IDCANCEL)# b$ b  V- E+ Y) M; [
        {( a- M* Z0 ^* ^% S3 M4 E, T* @
                // TODO: 在此放置处理何时用/ G, ~. J' }4 |5 y; C
                //  “取消”来关闭对话框的代码
/ _2 K2 {2 b8 V8 q        }
& R! @+ X! a+ A. x" M( u
2 X; N, R  e0 [7 ~! S        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,% \# u0 D, v4 e, ^
        //  而不是启动应用程序的消息泵。2 v, b  p  _, {3 j* {2 i* @, O
        return FALSE;1 y* @& V& y- ~8 G; s8 C! E, B
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 16:19 , Processed in 0.091359 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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