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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。% n/ L* B# R# e
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备9 k# i8 a+ {) n' i
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
% k0 h# b% l8 W/ c2 X(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
# {1 W9 U0 P8 X0 e& x4 e$ y! _(4):重启执行VBS脚本,得到输出结果7 O, f7 s1 W5 k  B8 Q) m  N
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
9 c( P8 u# w4 q( W7 v2 S$ A6 ~+ f  b+ Q* z
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
+ l4 ?# X  T( C( E, Z+ X" ~   请高手指点一下如何通过这个acpimof.dll来获得控制权
! G  M2 N5 x- ~' N  y" E   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 421

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
# |  |1 K; ~- S: R/ z# u6 F/ C我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
0 Q6 V. V& O4 F" V7 W- I( i' x% qpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
7 I; S( [' r- B9 z# L% ^  K或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
8 g! V3 x; g* D0 W* B  u4 C- A 谢谢各位。. p8 o7 G- t! ^7 m, |
 

Using WMI.rar

1.08 KB, 下载次数: 457

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
  @5 S6 F' V! s" U
5 v3 k" w# N* ^( {// Using WMI.cpp : 定义应用程序的类行为。, y2 k7 {8 K+ D! b* a! O: ^% w% X
//$ [& ]6 B8 k  w& V6 w; u. n
- g) s6 H. i6 P& g* v0 D
#include "stdafx.h"
# w2 Z* l# m5 k) ^#include "Using WMI.h"
2 f. r# v  C* x7 F+ G0 K#include "Using WMIDlg.h"5 b% N. s" F9 T, Q4 ]
8 s  o; N# O+ @1 w* M& f& n
#ifdef _DEBUG
/ j4 I7 C$ I% H# L- F$ n7 @#define new DEBUG_NEW
' L7 p9 a6 Q6 p1 O#endif
4 s- J3 E. V- a+ k. m5 p
4 B: W  V8 v9 y8 e
8 B  c: ^3 i' D, J& t$ u, Z// CUsingWMIApp
" o1 B, q' p% Z- |2 J: Q8 x0 Q) g& L2 V7 ?1 s/ y  e" Y
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)$ t+ s0 }1 b! `4 r+ W- ?2 t/ h
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
; F0 |/ `8 Y0 ~) pEND_MESSAGE_MAP()
* Y6 g/ L2 q8 E/ c( H
+ A3 N8 {- A3 P# s
  y; v* s6 ?+ J9 B4 r5 t, j// CUsingWMIApp 构造
! B3 J, D6 o) W3 R5 k
5 E8 ^/ k# ?3 f! k& sCUsingWMIApp::CUsingWMIApp()
; E/ ]6 Y& \# }# ^& x; w' V{
5 d- {5 @5 _7 p) h6 T        // TODO: 在此处添加构造代码,4 X3 w- q4 V% B4 W, C
        // 将所有重要的初始化放置在 InitInstance 中
9 ~; _% \2 R" w5 `7 w5 a0 O, A}
, B) G$ N3 N% D4 h/ Y  Y
& {9 [" h# Z" l' y( }" l
3 S2 B/ R! |* V2 l$ v$ J) k6 p// 唯一的一个 CUsingWMIApp 对象
6 j, c# Q# N! [$ X* N, ?8 G, R5 H3 n
# |! |; g: B  bCUsingWMIApp theApp;
% P0 R: I* ^6 c' p2 q/ }' L' |( E* j& ?+ d$ d% ^( @
2 G4 B, v. R- u+ V9 Z& T
// CUsingWMIApp 初始化  N, Y9 E1 A4 @6 ~# T
. d0 a+ t# s* e) \& y" N3 ~
BOOL CUsingWMIApp::InitInstance()
5 U6 W  s3 ?9 @* ~5 h7 W' x) S{- K/ s, C1 W- \# O5 X+ X
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
% ?( I6 K  M6 c6 f# f; V+ D; q/ U        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
5 C6 v1 b7 e# \& E& o1 p' ~        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。( Q4 @( e8 h! B) E* }8 S8 R
        INITCOMMONCONTROLSEX InitCtrls;
2 h% M9 C/ E! S) a" x% N4 z8 P        InitCtrls.dwSize = sizeof(InitCtrls);2 @7 b  }  A8 k5 J8 Y; W
        // 将它设置为包括所有要在应用程序中使用的
8 t) Y8 C: |7 T& @) A        // 公共控件类。
% r8 W; m- F% k& `/ k6 o! g& m& d        InitCtrls.dwICC = ICC_WIN95_CLASSES;4 H' x7 @: `, N1 O( p/ i3 L1 z1 J
        InitCommonControlsEx(&InitCtrls);
1 I) ^6 l: v* T2 ?
- h+ h/ d+ b+ I% u' M% s* m        CWinApp::InitInstance();
" Z2 B) Y% M7 W% F' B( O
  U) `0 v3 W# E$ Z; k        AfxEnableControlContainer();5 v- Z) h) `: ~  Z

8 Z: _* A, V4 L- Z( x        // 标准初始化
6 G( E! p( T( q. K- w; s        // 如果未使用这些功能并希望减小
$ O8 a( I$ F3 c8 K        // 最终可执行文件的大小,则应移除下列3 {8 s+ L  f6 a; ^3 Z/ X0 ]9 n2 K
        // 不需要的特定初始化例程
& O& t6 \8 A4 `$ q7 [- x* z2 Z& j' y        // 更改用于存储设置的注册表项
# Z' y* s* ^% W1 Z. \        // TODO: 应适当修改该字符串,
1 j; J& F6 Z8 G3 ?        // 例如修改为公司或组织名7 d) t& l, M# v7 _# {7 f$ ?
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));) j. y4 }" @' F* f5 j6 Q* P

) \2 `) K& j! ?5 w5 _1 h        CUsingWMIDlg dlg;9 J8 l3 r% a# ^% i8 ~+ y7 A/ ^6 V, B
        m_pMainWnd = &dlg;+ `; G. v$ \+ l  _3 ?3 [3 i8 |
        INT_PTR nResponse = dlg.DoModal();. `6 `, E5 e0 i1 y2 |; q8 A
        if (nResponse == IDOK)
3 A9 m$ ^0 c" f- q  Y        {
- v, k' v. `) q; @                // TODO: 在此放置处理何时用
. H/ b5 N+ r+ W/ x' E0 S* Y                //  “确定”来关闭对话框的代码6 p" b8 S' q  D+ ]% m3 O" A
        }
' I9 S; n5 q3 Z- E$ U9 a        else if (nResponse == IDCANCEL)
8 H7 o* E( L5 z        {
5 K; n2 ^: H! o' n" j8 k                // TODO: 在此放置处理何时用9 }+ U3 Y( r5 ?4 Z0 i# h& `
                //  “取消”来关闭对话框的代码
2 E# N. Y3 t& j  Q" f: x        }
/ P+ j* l& G$ {7 k0 A- e  s/ f7 p9 q$ Q; Y: X9 a$ H' D
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,0 n+ q0 Q2 A/ U4 f, e
        //  而不是启动应用程序的消息泵。4 }4 j7 f' m* Z* ~7 `$ B
        return FALSE;
7 m$ U: h/ j6 a}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 05:56 , Processed in 0.034900 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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