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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
' ?( D& P7 ]9 p& t* D' m(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
, P8 t" c1 D% i! {(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本$ S- I/ R+ W4 J2 U! G. }0 V
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接: n5 W+ ?& e3 a% I9 _
(4):重启执行VBS脚本,得到输出结果
. L; C7 j8 S; }2 U' R) `- g+ v(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
4 k( h2 E. r) e. v9 y  {* N5 m: T% n0 ]3 X9 T
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
2 i. k* \% v" N9 {8 b   请高手指点一下如何通过这个acpimof.dll来获得控制权
3 R6 L* ~8 n& b5 n, c" t# n/ D   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1405

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
$ S' }4 z& i! e/ U1 T7 o我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
& A' ~) f( ]+ d. z% ?peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
5 C# r9 j( Z+ `2 O或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
& D, b) k- z" J$ W. i 谢谢各位。
+ @9 P5 j5 J# |  e 

Using WMI.rar

1.08 KB, 下载次数: 1475

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件! x! |5 d, [; `/ J3 ?0 F9 ~* z0 s
- I8 f  x# R# O3 ~. A
// Using WMI.cpp : 定义应用程序的类行为。
" s' L1 ~4 p' q& i1 [//
# [/ p& r" v- X. ^) D  `8 {; }; y2 U/ S; J& J' f
#include "stdafx.h"6 ]8 C. u/ B+ F  L
#include "Using WMI.h"3 H3 \% F9 {! |  k& d) |; v
#include "Using WMIDlg.h"
  \/ S% W9 N9 \& G! g# B3 y
# U4 ~  R# r" u$ U#ifdef _DEBUG: j+ B6 n" q: D8 J
#define new DEBUG_NEW
7 ^8 q5 D  G* W) j% J1 m#endif
+ ?; i6 ?, _3 O0 e' i7 }0 S7 m2 p9 I! B( H% R' I& A

! c; U$ r& t+ Z$ G6 X// CUsingWMIApp1 i8 e6 N3 h& @3 ?- \
  V' o7 }/ j$ |* Y& N
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)) \, w2 k5 V6 D$ M
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)) G' O0 |6 O: [) E3 D- f, Y
END_MESSAGE_MAP()5 u5 \- d; F! G/ I& }5 O
9 X% ?) t; c1 \. A* \' Z
4 D8 `: }  r: b) W
// CUsingWMIApp 构造9 o/ z' m8 A; D! O! ~% j% F
* N/ P5 e, q: p
CUsingWMIApp::CUsingWMIApp()- u9 S  K8 N7 l# B/ F
{
! T( B% r( h$ ^0 f7 ^( u        // TODO: 在此处添加构造代码,
* a3 o4 g/ o/ e! T! b4 T. }  w  J        // 将所有重要的初始化放置在 InitInstance 中- l  l- u2 m  e& w! x& X. Q5 \
}
6 x8 P3 X0 Y& B8 Q1 P* |2 O" r
- J3 r) n2 I6 T; e5 Y% n1 m, e8 [& v/ D
// 唯一的一个 CUsingWMIApp 对象+ x/ D1 x" ~  s- H9 Q
& v4 ?0 [# \2 v+ n3 N& q# U6 R. s: [/ g
CUsingWMIApp theApp;. ^  v% @- m4 k& t  s
1 `2 A: z1 u; z* I7 X

: b. E4 I  h2 U6 ~; M) V) y& n0 `9 {// CUsingWMIApp 初始化
4 I' b; x( [. e! O. _" k
  J; e  @  P/ Q! |BOOL CUsingWMIApp::InitInstance()- ?/ J: q9 n  O9 |( ]$ y) \7 O5 f8 Z
{3 E5 b, L& [! c' J
        // 如果一个运行在 Windows XP 上的应用程序清单指定要! {% x2 r- t% O) A' p  D
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,1 n4 z1 V$ Y# o+ Z
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
3 E, L8 F( w. H2 D. R, o8 G  _        INITCOMMONCONTROLSEX InitCtrls;
" V7 P1 f, P* S9 A4 {        InitCtrls.dwSize = sizeof(InitCtrls);. C3 D) p0 w: r/ w6 s- M' M; _7 n  [. Y
        // 将它设置为包括所有要在应用程序中使用的! P! Y9 u7 s, r; Y! o9 }/ R6 u' U
        // 公共控件类。
/ E9 W  \! ]& g        InitCtrls.dwICC = ICC_WIN95_CLASSES;
& x# d: \+ E8 t6 G, o4 }        InitCommonControlsEx(&InitCtrls);
3 C( H2 g' }# w& Z; o, k" Y- I2 N" S6 g5 K0 o. \5 K
        CWinApp::InitInstance();
% \# `$ B8 y: K  G! l2 l# {" Y" Y; G3 x7 f6 T. I/ Z* ?$ x
        AfxEnableControlContainer();
" l6 ]; s6 M) r; {. t
3 b* ~/ T+ g/ C        // 标准初始化
) r. {) D, M5 Y' B        // 如果未使用这些功能并希望减小2 v0 L$ V5 h$ O: t6 k2 x
        // 最终可执行文件的大小,则应移除下列8 h4 t+ s8 c4 x* L$ W& T3 W
        // 不需要的特定初始化例程- I8 C6 x3 G9 H6 y
        // 更改用于存储设置的注册表项4 [8 w7 I3 i6 }2 R& s5 ~& ^
        // TODO: 应适当修改该字符串,6 S6 i1 d% u# H  Y
        // 例如修改为公司或组织名. L( c4 F9 @& e9 Z# ~
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));' O1 r! |  {" V. q6 r/ P! b8 x5 |

+ r5 ^2 g+ x. Q" ^" I        CUsingWMIDlg dlg;
- l1 A/ R/ C: W+ S* K( ?        m_pMainWnd = &dlg;5 q& G% {. o8 \0 M! T
        INT_PTR nResponse = dlg.DoModal();
& W# v0 J# @9 E; H8 n+ z5 e) ^8 ]7 i        if (nResponse == IDOK)) p* z4 }% S% M. t  Z, R
        {
& `' D; {% {( y( r5 L                // TODO: 在此放置处理何时用2 U7 S1 @+ V. Y4 V5 U$ @, o
                //  “确定”来关闭对话框的代码
5 j% X. _8 l' s( c. M7 R        }7 |0 v* f0 h& d, W- M( t
        else if (nResponse == IDCANCEL)% x$ r* E! C- H
        {* X7 q6 y- F  Z4 E( W
                // TODO: 在此放置处理何时用9 e; B/ q/ {. y' `4 e" m
                //  “取消”来关闭对话框的代码. }$ Z, X8 d% w
        }
) T0 A/ g5 U* N
8 Y% m, f) L, o* k% o        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,5 g# w1 b* G1 ~  E8 j
        //  而不是启动应用程序的消息泵。
5 K' P, J  Y* y4 y5 c+ ^% S        return FALSE;
* D/ C0 h4 E& b  L}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:57 , Processed in 0.378802 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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