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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。" K3 r' O* ^( S3 j+ G% R
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
( o% K% b8 b! v& ?5 O8 r(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本2 O* H3 O- V7 d) V$ H+ u6 r
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接* f/ Q$ ]) \0 J6 j5 O
(4):重启执行VBS脚本,得到输出结果
- w+ ~- t# [+ g5 e  W. y" F% e(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
' P, B# v- e9 T4 w. u8 z0 ?8 A) c, @( w# v% F0 S
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。+ R2 b1 P) N; _% _1 u* O- O
   请高手指点一下如何通过这个acpimof.dll来获得控制权* m2 n: v" z# J) {8 \
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 478

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.! O) z/ _5 C2 o3 |/ [$ M1 U- u# A" |) f
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
. l$ @; I- t: b" E( `3 Ipeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
& e: b3 f/ R1 I" B0 X3 R/ T7 }. L* [或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!! T; t( i0 `4 o1 R$ M0 l+ E  s
 谢谢各位。
" R6 B! `6 t0 a% y4 M; b 

Using WMI.rar

1.08 KB, 下载次数: 513

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
+ e1 W/ a" M7 R9 E  c( n' v+ k7 m# C# d; y$ ^
// Using WMI.cpp : 定义应用程序的类行为。
3 ~5 g. f2 L0 V$ x4 r# v% u8 K/ N% J$ ~//  u: N/ y" R% @! C* j5 u
( Y; C8 j6 k& w8 m4 o4 u
#include "stdafx.h"% B$ J4 h# H. L
#include "Using WMI.h"2 W% ^9 M7 \& y$ J( n8 t
#include "Using WMIDlg.h"
0 ^) C# v! d+ U; i0 N+ ~1 O% I) O& r0 R6 @* X' c5 p
#ifdef _DEBUG
, h/ S1 @8 c) X$ S8 |#define new DEBUG_NEW% x  a5 }& B! E+ o
#endif* {( B. s* R9 D$ S& g

! U" D! S- J) f
5 A- I6 ]; Q4 \$ g" P* q  e// CUsingWMIApp
- Z, n0 l) h  x8 D5 O) B
9 a" x' L7 h! U. R# T0 G9 yBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
- m" e- P1 @1 }) P' F( s* q- N        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)) W  S' u- m+ X+ a! p5 S; x
END_MESSAGE_MAP()+ W& D9 P0 p( H2 c5 C4 {

4 a5 y; y0 w. y: s* G6 y8 r; `4 a. @# ], A- ]" w7 @/ `* T
// CUsingWMIApp 构造
( {/ t% B+ X! a0 g' S7 C2 m( W' a6 ^. m1 z5 U2 b: ^7 `
CUsingWMIApp::CUsingWMIApp()* x- S( ?- B5 x2 l( B9 V, C
{# t( H  r9 U" Z6 r' S1 s
        // TODO: 在此处添加构造代码,
) p/ d: g# X7 j/ W  y5 i        // 将所有重要的初始化放置在 InitInstance 中) r0 ]0 m! a# y8 I* |- \+ n: _# Z% T
}+ x' {; j: h3 C" K; s

: C) W# Q- [3 @) Z7 ~
; n" E+ x8 V0 |// 唯一的一个 CUsingWMIApp 对象
  g8 f2 [5 e4 w& s# J  m3 b4 Q, K1 Y0 o1 _0 R
CUsingWMIApp theApp;
5 y7 L) E2 E' K7 {- h
  X- U$ h/ G. D& K4 e" s& V" E
- M0 X+ U" R! |, |// CUsingWMIApp 初始化. u* G( h3 z9 X9 c* ]8 h) Z, B
2 k9 x! v- X+ C+ X; q3 F& a
BOOL CUsingWMIApp::InitInstance()
6 T( V8 E( v2 v3 I* X8 V1 H{
/ _0 O4 j6 v. i- S( `  t: i        // 如果一个运行在 Windows XP 上的应用程序清单指定要2 y1 G. t& n, \4 }/ Q) d8 N9 G+ ^
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,& @2 t6 R3 y1 e8 S* X
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
9 s% e% |+ F; n- F! z, l# q        INITCOMMONCONTROLSEX InitCtrls;2 r. ]# S! ~6 Z5 Y; Z3 i
        InitCtrls.dwSize = sizeof(InitCtrls);
, Y9 d. \9 F9 _: J& C        // 将它设置为包括所有要在应用程序中使用的
4 P7 s% f: T0 S; {        // 公共控件类。
! |) A/ h* G3 ]0 m* ?9 R* d        InitCtrls.dwICC = ICC_WIN95_CLASSES;" V/ C/ Z) X, F, w( H
        InitCommonControlsEx(&InitCtrls);
3 Q1 S# M+ t) R6 b+ F
* f& ^! K" v8 P# c& P4 J  {) y        CWinApp::InitInstance();: z3 ?4 q2 a) S) r1 r( i  ?# e
! e4 F5 Q! d- e8 s: `; J. Q
        AfxEnableControlContainer();; j) J9 H& a& |
( W! ]! @9 y% Z
        // 标准初始化
+ \1 y& m6 Z* W; m! m) z        // 如果未使用这些功能并希望减小
$ k$ Q0 u6 D8 y9 _# q+ W6 h        // 最终可执行文件的大小,则应移除下列# {0 J( R& [* t9 S7 b, V3 A
        // 不需要的特定初始化例程8 j$ j. B' I9 ~
        // 更改用于存储设置的注册表项0 |$ Y- x# h8 W- @5 j
        // TODO: 应适当修改该字符串,
1 W; F1 ?% a" |. R& l% I  L! d        // 例如修改为公司或组织名
  m3 B/ g: I" h4 ]( J; I        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));- v4 U( e7 ?, M" f

3 Q2 R8 [" i7 h4 t3 Q        CUsingWMIDlg dlg;
" A: {: ^( @% G. t; P- V5 k4 j        m_pMainWnd = &dlg;% Q5 a. m% ^+ i7 y) M7 k. {! Q
        INT_PTR nResponse = dlg.DoModal();  R) u' @* ?5 T4 I( U
        if (nResponse == IDOK)
+ }8 I2 r7 F2 K/ {9 \2 L" X8 `        {+ l" z3 b4 w/ a5 A( P5 o
                // TODO: 在此放置处理何时用3 c3 R' [5 C5 o2 W( S
                //  “确定”来关闭对话框的代码8 V2 W/ O& M0 s- z
        }+ X& Z% V, U0 H  ~, @& d
        else if (nResponse == IDCANCEL)
! X; c$ J: p6 o& X% k        {* `  i1 z" Z& H4 `; k6 s: x
                // TODO: 在此放置处理何时用
7 y) M3 v" a7 x4 l8 v7 r+ X2 e                //  “取消”来关闭对话框的代码3 G0 ^7 W* O: L5 O  q; V8 ]
        }
8 N1 q9 s% x8 x0 U7 F( G; q
$ P- V9 C6 k' P        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,* G  A( K7 K( R0 O" ]3 ^
        //  而不是启动应用程序的消息泵。1 h  `3 y0 B8 J5 p1 ^5 ]
        return FALSE;
- s/ p% u; s' a! C% j& B1 n; l! ]3 x}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:32 , Processed in 0.025480 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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