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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。6 a& f) R+ ]* [  k: c
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
+ [, q1 r* @- {& H! T8 V/ L(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
1 b8 S: {$ N: x# R7 J! R2 G6 k(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
1 a% c  H$ y/ G4 P# c( @5 [(4):重启执行VBS脚本,得到输出结果! J( R1 x4 J& [& y
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
  H) u+ S1 y3 U7 W+ U0 D; ], ~6 w8 O$ L  y. h$ n. x9 M( O; ^" m
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
) P5 S: R! D9 K+ l6 K& N. q   请高手指点一下如何通过这个acpimof.dll来获得控制权
- Y. X- J: F7 @. H   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1147

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
& e3 r5 f9 a3 y8 K4 o我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
2 _7 @& H8 X7 T7 \: ~: p, b) _# r- tpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。" s1 w0 u& q0 b: _+ v! _
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
: E/ c1 R+ a! B 谢谢各位。+ ?- W% M4 F: }* S9 N! L: _; }
 

Using WMI.rar

1.08 KB, 下载次数: 1184

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
% y0 p+ z) q& x+ W6 f- o  n
) R  f9 c0 F+ @; M' o/ i// Using WMI.cpp : 定义应用程序的类行为。
. @6 V& k. {1 k//
- j- o$ F8 g! d( d
" H8 i* W5 a4 [. J7 G) X#include "stdafx.h"
" _$ `" A6 l9 K3 `% }5 {#include "Using WMI.h"/ j* D+ L1 @3 v; O: k$ M& {  q
#include "Using WMIDlg.h"
  [2 ~5 T; n( ?
0 I5 K; a% t- _8 k. b#ifdef _DEBUG
' Y$ H( t% B  s* s. j#define new DEBUG_NEW) k, W3 m# U4 _  ~0 u  C  Y
#endif
9 B+ e5 V" @. t
+ H5 G- n; r2 E3 `! z" r8 L$ q& u* n# @7 }  V4 B2 P& t
// CUsingWMIApp; _' x; d( K( t3 `: m9 j+ j

6 k: O7 l  _9 ]/ z' {- vBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
& f8 U9 Y' d$ k# E: _5 K" |        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)& Z; |6 J2 P) j% T+ ^5 c
END_MESSAGE_MAP()
6 W1 L" [- p5 S1 o0 L5 |0 l  G" t6 ^4 t& T/ }) N" Y9 o

" \0 R4 s9 F8 B) F/ _, @! K: ]- a" A// CUsingWMIApp 构造0 a9 _1 V$ A, r% F1 e
+ f. n0 X4 q7 o$ U3 A" c4 \2 p
CUsingWMIApp::CUsingWMIApp()
% ~! n1 S9 D5 _# w  w) v* k{. \7 m6 v  X: Y- Z
        // TODO: 在此处添加构造代码,. L! B5 P1 m  b* m
        // 将所有重要的初始化放置在 InitInstance 中
5 R# G4 y$ S$ `3 n  q( l}* q+ Y* m4 z  q3 v( ~) H
! V1 z. N  f2 A+ @/ ?9 t2 C- ~, S0 W/ X

0 [$ t' s; A, j) s+ E+ {+ `3 l3 C// 唯一的一个 CUsingWMIApp 对象3 h/ g" Y# P- r" t9 y% f) ]& K
; b5 U. l, f, Z) K# q& `7 N; d
CUsingWMIApp theApp;
9 C7 `0 h: i% S+ n( Z! L1 P. ~" l3 i+ t$ x4 m1 W
1 R% }2 `, V: r% w6 m
// CUsingWMIApp 初始化
: e- }3 Z* m2 Q& B! l& k
+ d/ I% h" i% a' SBOOL CUsingWMIApp::InitInstance(); \/ ~5 d" B5 Y$ W+ y2 J( g$ w
{
5 y) h! a9 a( J# K5 S8 o        // 如果一个运行在 Windows XP 上的应用程序清单指定要
( k0 c2 ?8 h2 g        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
% r8 U" o" V$ N: }: K) f        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。3 s, ~; \0 R- @7 x% n
        INITCOMMONCONTROLSEX InitCtrls;1 R  t# [2 e5 F! p/ n
        InitCtrls.dwSize = sizeof(InitCtrls);
& W! @8 v5 ^: N/ ~2 k1 _        // 将它设置为包括所有要在应用程序中使用的) _! N6 l, W# b2 T3 z
        // 公共控件类。
+ j) u7 a1 {- Z# y2 _        InitCtrls.dwICC = ICC_WIN95_CLASSES;& o9 ~3 |5 F) i* q( b9 a
        InitCommonControlsEx(&InitCtrls);/ x5 @$ `* p1 V* }: }# _
0 ?0 j( c5 s5 A+ F& E
        CWinApp::InitInstance();( {0 Z/ M( A) [
. {+ U' |6 f7 |" q
        AfxEnableControlContainer();
0 X5 x6 {- A3 I
% M+ K- L  I; y        // 标准初始化
7 E9 R4 F% K& l: L# o4 m& N        // 如果未使用这些功能并希望减小8 g) i. d  P% t. N# |" R6 L! A
        // 最终可执行文件的大小,则应移除下列
* L8 g$ O! @8 m        // 不需要的特定初始化例程
+ C# `# t) i' m5 A: [: m        // 更改用于存储设置的注册表项" L/ d, n# ^% y/ g
        // TODO: 应适当修改该字符串,1 S5 P$ y" S' [. |9 ~
        // 例如修改为公司或组织名; S  d- y% R* E6 V
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));( k6 V& x" H% \' {. X
0 d3 W; K* I. g$ S$ M; X! D6 ^- B
        CUsingWMIDlg dlg;
& ~  I/ D, O! G2 P/ {: c        m_pMainWnd = &dlg;7 u2 N+ {$ Q# L6 T& W! Y
        INT_PTR nResponse = dlg.DoModal();" V7 u' I/ N( [9 P3 u
        if (nResponse == IDOK)+ i; u2 x, I' Q  s% @
        {6 c% s" E2 W! B, Q5 ]" C
                // TODO: 在此放置处理何时用, N. i( Y4 g8 A2 n9 b* n. P- ]8 ?
                //  “确定”来关闭对话框的代码
' i( i8 R- ^3 ?7 ]( E        }
" q& j1 o1 B7 o( F9 a        else if (nResponse == IDCANCEL)  q8 f& N  l1 ^7 `% y
        {2 o. X4 V/ g5 J) ~) C
                // TODO: 在此放置处理何时用5 v* y" \8 r; _% V6 s
                //  “取消”来关闭对话框的代码
0 _+ B. U+ `. q        }
; r* w1 x* M3 B) o  j* e: h  u& s# y* ]$ [" X7 j
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,. E& I' ]0 ^9 G4 Y; v$ n
        //  而不是启动应用程序的消息泵。! Q& p/ N/ i. ~' U5 I  p. a
        return FALSE;
+ \" [2 l5 y* n7 R, t  i  i! G. ~}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 12:07 , Processed in 0.060787 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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