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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
& k5 s( _% }, X5 `1 b" l(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
. c: H; O' u( K* w: F: c(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本# \( p# R4 h; y& a2 m0 w
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
0 s% R5 Y% i5 L. U/ _(4):重启执行VBS脚本,得到输出结果% j9 M% u% T& t
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
  m/ C) |) a: Z" F! s: g: ]3 I# e& N
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。6 Y2 U- A* M) r" {! D/ y; _
   请高手指点一下如何通过这个acpimof.dll来获得控制权
1 i% [6 r# G# J3 U/ `   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1126

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.! n' X6 W6 U3 u; f
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
7 E4 K- c( P9 l# Cpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
1 W+ _7 w* l! U9 o; G或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!* W1 V1 u. j* q1 x2 e0 @
 谢谢各位。
2 _$ N' Y( Q. A4 o 

Using WMI.rar

1.08 KB, 下载次数: 1169

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
7 `5 t  h. ^+ J. D
' b. C8 e  y# I2 M6 R, O) A// Using WMI.cpp : 定义应用程序的类行为。/ ]" P' P0 G( g# a
//
- u# A0 `- a  Y  _3 E7 r- o" N8 P/ u, ], I9 y" e
#include "stdafx.h"
9 a6 a, K! ?( l# I, _* t5 L#include "Using WMI.h"
- H8 U% F1 m7 ?" N6 X& U$ ?7 F#include "Using WMIDlg.h"
- d7 t3 E+ U  {* z$ F) f# ^
2 R' ~; f2 l6 S9 j#ifdef _DEBUG
& k  s$ l1 c8 K9 O7 @7 B#define new DEBUG_NEW7 k7 S" }5 P2 X: Y8 s
#endif& m7 S  N( Q) p4 H/ N

9 a" D7 @" @5 h$ e) i! s
( F0 C, \% u+ E// CUsingWMIApp
7 o. H) z1 m; T# Y
" K- ^" O4 g& r5 V5 pBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
7 u- ~$ w8 X! Z8 {$ E( h& l        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
* u4 j' g" N$ O1 y% wEND_MESSAGE_MAP()/ T5 G- K" q- F% l+ M9 G4 X3 O

9 i. E$ d6 b# Z. D0 X$ X4 S" `% A; z. f. t7 C0 ^# L# a; j
// CUsingWMIApp 构造0 S) t2 b3 @% \5 J' t6 i& i" ]

9 _* v$ S4 d. j' D6 |2 OCUsingWMIApp::CUsingWMIApp()
3 H9 e3 m: b+ M4 W+ z- X4 e9 L{
: G- v# I- f9 F9 T4 l9 j* {        // TODO: 在此处添加构造代码,0 h' J; Q0 K/ E6 O, |( Q
        // 将所有重要的初始化放置在 InitInstance 中
2 E4 ?( w: s$ x8 O# g5 R}
" X& F2 F) ~; Q* P+ a- [& w6 R7 g) r/ u$ Z

) H& @% k2 N9 Y5 u7 h' V6 W9 E// 唯一的一个 CUsingWMIApp 对象6 p- p4 p' v2 H, z6 U6 f

6 i8 i4 k: |4 c5 Q# R- N4 d# g4 iCUsingWMIApp theApp;
' ]1 U! P1 I# E+ l. @/ _) Z1 b# |  y$ C. U; O

/ g- O" q1 G9 Y* R: H  X// CUsingWMIApp 初始化
5 w1 N" |( Z% R
' a& {# I1 P/ p8 }$ gBOOL CUsingWMIApp::InitInstance()  _. ~1 O0 Y2 f( o; ]- S
{8 _# \9 M% d( |* m) F& U
        // 如果一个运行在 Windows XP 上的应用程序清单指定要; ]* W/ X& i% T/ H8 y
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
6 z, b0 c2 D1 D        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
- z: Z% m  @) w# [- F        INITCOMMONCONTROLSEX InitCtrls;
9 U9 R- q8 [# q2 W/ i+ L        InitCtrls.dwSize = sizeof(InitCtrls);. F9 Y- z% }- l: s' Q
        // 将它设置为包括所有要在应用程序中使用的
: X4 t/ `$ y) s" N7 J3 S. f        // 公共控件类。
( N+ ]2 r+ ^% g        InitCtrls.dwICC = ICC_WIN95_CLASSES;6 w( |0 k# T3 Q* {/ s5 P: f
        InitCommonControlsEx(&InitCtrls);
, O, L2 V( I; E$ o3 `% r0 ~
5 \- o+ M- M" N! c# v: B1 {: W& S        CWinApp::InitInstance();* c0 d) d! H9 e& l$ [! I

! ]4 B4 }5 d8 ]: [) Q7 H4 k        AfxEnableControlContainer();
2 V6 g' W$ M# `$ ~
/ x. `0 K$ r# @        // 标准初始化
3 c: y4 b2 ]: U% S6 p7 H, @        // 如果未使用这些功能并希望减小
! n1 I2 T* @5 D( |5 r        // 最终可执行文件的大小,则应移除下列
8 w( E: G( S7 v$ ^# s8 B        // 不需要的特定初始化例程' w& b% y* E! {; B- ^$ l# f8 g9 I
        // 更改用于存储设置的注册表项
- ?" C8 r/ W4 c9 v* y$ l        // TODO: 应适当修改该字符串,7 C' q: b. s6 m" L* i% ?, V; g
        // 例如修改为公司或组织名
/ ~$ m) G$ D! D6 b        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));4 Z: N' w) }* i4 K; c* Y. Q' @

3 Q9 ^5 H7 E! @: S        CUsingWMIDlg dlg;
$ \( r  j% X7 W        m_pMainWnd = &dlg;
/ F9 j9 j) n# X, h- q( Q2 P+ }& e        INT_PTR nResponse = dlg.DoModal();5 Z+ @- J( m; ^2 Q0 q  y
        if (nResponse == IDOK)
# V9 v( q6 i2 b6 L& b' W8 b        {% W4 g3 k' [: X2 ~: |5 ]+ i6 }
                // TODO: 在此放置处理何时用
7 `7 v& w1 H2 c; e! L                //  “确定”来关闭对话框的代码
" h& K) l( T$ d) T; h$ q/ o1 B        }. a' d, q. F/ j7 m9 s7 L! r
        else if (nResponse == IDCANCEL)& ^" t1 }. O! U+ g- m9 r! Q
        {$ Y2 z2 h5 p8 N
                // TODO: 在此放置处理何时用
  \, j/ M8 x* ?& s                //  “取消”来关闭对话框的代码
5 ]& J. C  R0 W+ |9 g/ C        }
/ P' f  x- A- T6 [- x, @' {& [  K8 r5 ?% c/ G7 }9 }* n
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,# b9 r, ]& z* V% t4 D$ |( |2 d2 p
        //  而不是启动应用程序的消息泵。. |/ r: f6 u4 x1 f, o  b, ?
        return FALSE;
3 }' x; J' J0 k+ [8 C' u}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:44 , Processed in 0.065615 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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