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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
' |6 J, c( W* I% n- Y$ m' @(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
8 u  S$ d% g3 g; i8 ~( u0 [(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
$ _! b5 ]; G, U" m(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接. O. _$ a  ]3 y8 S/ e" F2 q) w) q
(4):重启执行VBS脚本,得到输出结果
5 d3 w5 h/ O) K' w! D(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
  _2 ]1 I! ^4 l& ^' J. h+ Y3 m  I( D
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。' E, ]' p% W; B
   请高手指点一下如何通过这个acpimof.dll来获得控制权
2 E. d. g. o, {" m; t/ J   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1526

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
' C: D3 u8 H2 J1 Y6 t8 k3 cpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
2 X2 ^3 k% ]) m3 v3 p2 Q或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!# ?: q; ~* f  T/ m
 谢谢各位。" u/ ?2 |. R. i: {( Z+ z. e
 

Using WMI.rar

1.08 KB, 下载次数: 1581

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件+ @  I3 X2 ?! r$ n# h

' N; v6 [; O; ?8 i3 ~8 b2 I// Using WMI.cpp : 定义应用程序的类行为。3 O8 r0 ?- W% J# K5 L4 F2 s1 X
//& F" }" H/ ?+ n" ~
. f2 A4 r6 ^+ W# @- Y, m) Z
#include "stdafx.h"  l% u, K5 \# J; C  @
#include "Using WMI.h"
2 _, h* Z. [8 P/ m#include "Using WMIDlg.h"2 t9 O0 i% r& z4 H

$ y7 }) J# q! a+ U; ?* t" u#ifdef _DEBUG, d/ ?" E: C7 ?' H
#define new DEBUG_NEW
4 l; A* V; N* @. ^4 `. |! q) P#endif
2 p. A# d: n% r
; Q+ O; f, W  ?/ Y4 Q- r/ x' a7 K
; q1 l" s9 k1 }- [" i* Z// CUsingWMIApp
" x6 r/ P  j* \5 z  V" V! w4 @- F2 q
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
1 v- ~  s2 s5 r  }/ Z' A        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)- s6 D1 h9 o  z* D
END_MESSAGE_MAP()
$ i; I2 ], b. D4 l
2 e3 S" k6 Z8 D& E: j- X; q: Q* ]5 }4 ~+ `6 S  x
// CUsingWMIApp 构造6 `. c; E  h* u" b4 z
7 J) z+ h9 p0 K: ]
CUsingWMIApp::CUsingWMIApp()" o( S% Z5 g5 E' X  ~9 j/ m
{$ O/ m, T8 y9 V  y( D1 H" f
        // TODO: 在此处添加构造代码," U( Z$ X1 e# K" X: c3 b& n
        // 将所有重要的初始化放置在 InitInstance 中
- T5 ]* C8 u* u4 f/ n, R}
2 e, H; I1 g- p5 w4 l$ w; ~; D0 X( I: k- W9 l3 L! k0 B

% z- e0 @: W( Q5 Y  ^9 H% a// 唯一的一个 CUsingWMIApp 对象  {3 m0 A0 e. F/ s
5 _  T6 `" p) q- R& o
CUsingWMIApp theApp;( H* ]6 a0 p. G" w8 _7 o
5 y0 y' r6 i- F. Q6 O9 b* J

6 _& o9 H6 o" u) G0 B7 W// CUsingWMIApp 初始化
% ^6 [7 l( F2 i/ N
  Z) \+ l4 N* V) z3 L! p; O+ y' tBOOL CUsingWMIApp::InitInstance()
; ?# Q3 _' w0 i; W. r  Z% G{( s* N5 t9 e' y  I% u2 i
        // 如果一个运行在 Windows XP 上的应用程序清单指定要4 M* M6 ^8 z$ i$ a1 F( i+ f& e
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
2 P0 A$ P/ ]# B5 v8 b        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。, R4 p0 A3 f$ g  V/ r$ H7 V+ R
        INITCOMMONCONTROLSEX InitCtrls;, S- v. M! Q3 i9 [, s
        InitCtrls.dwSize = sizeof(InitCtrls);
) K7 R  N' L" R7 a        // 将它设置为包括所有要在应用程序中使用的
7 O! d& x$ F4 z* `2 G        // 公共控件类。* P4 j3 I4 L: g3 p& a
        InitCtrls.dwICC = ICC_WIN95_CLASSES;: F. E2 d4 F# Q, F8 S+ F
        InitCommonControlsEx(&InitCtrls);
5 M0 z* T- p; O/ f- n0 N) t. K' h" m8 R- M% y0 H0 s
        CWinApp::InitInstance();
/ q: ]. H2 N. @9 w3 n" w" N4 }4 \( X& O" [- u9 [6 Z
        AfxEnableControlContainer();
2 @) F2 X4 b9 V9 J7 I- Z: }4 n% L+ g- V; y; K. d
        // 标准初始化. _1 \& V/ [+ w
        // 如果未使用这些功能并希望减小9 Y1 r1 Z# z- n. m: o! [# @
        // 最终可执行文件的大小,则应移除下列1 T: ^0 U1 U( b! Z
        // 不需要的特定初始化例程, ]; F7 P4 T3 G+ z' S& |
        // 更改用于存储设置的注册表项$ F! ~' j, q2 {# J$ h8 x6 q
        // TODO: 应适当修改该字符串,
0 N, r3 {+ z3 ?* @        // 例如修改为公司或组织名
0 A. |4 a2 a" m/ E0 h        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));% S1 u: U2 Q; i+ t7 W
$ r& J6 J/ T1 d. J3 w* J% w
        CUsingWMIDlg dlg;
( e7 A! q& s2 U- P& i* \" R& P1 L0 q        m_pMainWnd = &dlg;
: R% ?$ f/ Z5 f9 l        INT_PTR nResponse = dlg.DoModal();
% E, E) p) Q/ ^3 D5 C$ w        if (nResponse == IDOK)
- g6 F; e  ~8 S* \. F7 i" ?        {
. d% G' w6 W* \                // TODO: 在此放置处理何时用
. ?, t" f  f8 ?1 ]3 s                //  “确定”来关闭对话框的代码
; G# w, C# b+ j4 G0 W        }& N$ }  m2 \+ `
        else if (nResponse == IDCANCEL)7 q: \! N6 N' ]
        {
, X; }! q# |2 }3 G                // TODO: 在此放置处理何时用0 @, [. ~0 l( s4 G2 X0 N8 `! J
                //  “取消”来关闭对话框的代码
4 o$ g8 L8 }9 R4 l6 \. G/ n        }. i0 ?) K) N  Z; w0 p

6 c& z1 S# J0 p& n, l  n        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  v% q& ^: ~' h# \9 B& f) \7 O: `: B        //  而不是启动应用程序的消息泵。  d4 f; H$ w( D
        return FALSE;
: Y6 }. s2 E7 Q" Z% H/ q}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:05 , Processed in 0.052861 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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