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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
5 Q( t, N5 S; _$ |7 o5 h3 Z0 _( p(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
$ l- C8 G3 m3 Z5 M" n: p(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本  Q7 r) J: M5 I8 ?* e7 K4 a
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
+ r" s. a7 i5 N4 ~(4):重启执行VBS脚本,得到输出结果- t6 H# R2 d5 }* p4 g
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
1 v$ ]& J! @% \* {' s; b$ Z! B# j0 l# w/ Z
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
# V  ?5 U% i. H8 @5 d   请高手指点一下如何通过这个acpimof.dll来获得控制权; o# v4 w/ @: X& [0 w3 @2 v
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1535

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
; o8 {& E5 U* ?! n  Z4 ]1 ~" n我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
8 T" D3 s$ m) [- G2 j' o7 l- Y0 dpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。1 v) ?! |$ }, r, k$ Q
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!, m% F3 v; L1 k2 q- Q0 @: ~
 谢谢各位。- i  o9 j( _+ a" C$ {6 J
 

Using WMI.rar

1.08 KB, 下载次数: 1596

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件  g3 R1 D/ P3 u  A7 I/ K. f1 z  N+ A

" S9 o* I: `' X3 X; }// Using WMI.cpp : 定义应用程序的类行为。$ \/ N4 f+ i! l. p7 @1 X* n% V
//8 I+ w" q. S" j1 @, T* Q8 L$ ]" p
$ Y% K2 R1 T" \4 V* ]2 ?
#include "stdafx.h", d! E9 ]! \2 f# x( h6 ^
#include "Using WMI.h"
+ s  K; s2 q( a5 u  i#include "Using WMIDlg.h", ^+ M; L3 p5 y+ y, Q

. g1 u0 j1 ?/ D% k1 S#ifdef _DEBUG
; J( j0 W( ?) ^) D$ ?$ q#define new DEBUG_NEW( e; I7 |; k# j8 ^+ i8 T! `
#endif
2 b) |1 R! x: l( f) P2 X4 P3 R' ?3 L8 V3 p- A. v/ s7 [  S

6 d5 Q  R  g# F0 F0 A5 y, Q// CUsingWMIApp
0 \$ S0 o1 z) m9 x  f0 R5 C/ Z# ^0 R. e$ z3 ]$ j; n
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)7 d, {) }; x& U# e! W' h
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)( b4 j/ K" z# g1 ^. t& X; D
END_MESSAGE_MAP()
; ]1 \/ S8 v2 _8 L- \
3 [) |+ q; z1 u
, a: p0 Z% A- e# U; ]) _// CUsingWMIApp 构造8 [( Q7 d, M2 D* @

/ s+ d% H9 g& \& W- [+ N8 NCUsingWMIApp::CUsingWMIApp()4 p* D  h: T! x- c
{0 J% i( |4 r1 |
        // TODO: 在此处添加构造代码,, B) L' x8 M7 s- W8 a
        // 将所有重要的初始化放置在 InitInstance 中4 F" L5 m+ R( U5 ]- A
}
& J& P1 Z/ f0 o4 l8 D
  W' S8 {4 Q2 J7 a( _# o& N% k/ G
, v; b# X7 P) N7 }1 K// 唯一的一个 CUsingWMIApp 对象
( ~* ?6 G: p8 r, w5 f3 a- c6 f( w" I0 d* \0 P  j# P! U1 ]  @
CUsingWMIApp theApp;  @2 T( b* l2 D0 s0 h) j% d

) v' B2 c4 d( h
4 O: W$ z; B5 N& t; ?& Y) j, C// CUsingWMIApp 初始化$ \/ l2 l- M2 e* A0 L" M

4 N% G# d  T$ ^+ M$ \* BBOOL CUsingWMIApp::InitInstance()
+ B2 |: d$ I. M{4 m) I/ ]' ]+ a
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
5 ], B1 t) t6 K/ y        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,, w  k) U2 a  _) X  I! e
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
% z6 a, O7 B6 y2 w/ m8 K0 F) p7 P        INITCOMMONCONTROLSEX InitCtrls;5 B: W$ t; @+ q1 z+ k
        InitCtrls.dwSize = sizeof(InitCtrls);$ b- W+ p7 F$ I; _6 A- E* R
        // 将它设置为包括所有要在应用程序中使用的) V: O+ H5 k5 a6 G+ C. Z
        // 公共控件类。7 P, s0 ]7 s" t
        InitCtrls.dwICC = ICC_WIN95_CLASSES;, u, s' T+ o7 y
        InitCommonControlsEx(&InitCtrls);1 g8 P% V- u# `: f7 M8 Y

2 n3 J# K, Q) v0 q5 d# ~2 k        CWinApp::InitInstance();+ u% F+ @) _: F/ x4 p4 J0 `

; I; k/ C7 q. @        AfxEnableControlContainer();
; {+ |# Y: x" \3 F
! ?  D  Y3 x4 V# Q6 L5 C        // 标准初始化
" S6 I6 ]; n2 }3 L2 e! n3 A        // 如果未使用这些功能并希望减小
0 w$ }2 c( f! k" V' U        // 最终可执行文件的大小,则应移除下列
  W6 N2 d7 G! c& [6 z# u0 Z        // 不需要的特定初始化例程
" |* L: L0 S& S$ U, d3 |+ H        // 更改用于存储设置的注册表项
+ h$ o. X  q1 ~" x1 j        // TODO: 应适当修改该字符串,
% |, W4 [7 o0 l& M# X' t; X, D  Q        // 例如修改为公司或组织名
7 R. o) B& L4 X" t6 q9 n        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));' j* ~' Q0 T+ J- [

9 X% U0 q; s4 k5 h" l        CUsingWMIDlg dlg;
$ ]. j8 D5 D# Y( U: h1 Y: i+ c        m_pMainWnd = &dlg;
$ c8 A# D$ w, y2 b9 H1 R( J        INT_PTR nResponse = dlg.DoModal();
) D8 H4 _3 T. O; h$ b        if (nResponse == IDOK). _  ?* O  c) d( z( i
        {
" P1 A4 R9 n' G* b: [: J0 R5 f                // TODO: 在此放置处理何时用
. a0 b! A. x8 F+ h- Y4 y                //  “确定”来关闭对话框的代码# {) Q( k: }; G2 i5 ^
        }
2 b# r- K( q' ]  H1 M2 D- R' C7 N        else if (nResponse == IDCANCEL)
5 R( f2 G1 D* p% O. v        {
7 Q7 B, q8 n. a; ?                // TODO: 在此放置处理何时用
4 h" E4 a) K9 p. ~4 [0 a3 V. P                //  “取消”来关闭对话框的代码4 o2 Y% O/ U: K/ ?+ x/ s
        }
4 g/ n8 p* t! L; J$ X
; e& B2 @& q: L: N- _4 v/ ?# K) B        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
, j2 Q# q2 d+ g+ i+ _+ l' p        //  而不是启动应用程序的消息泵。0 z1 k  @5 E5 z  B6 D
        return FALSE;4 K5 t9 Z2 h; |
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:41 , Processed in 0.127640 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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