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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
" }6 D; u* i* @2 A1 f" R! `' i(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备1 l# ?! w- D* ~* @  z* B* t- R
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
& b0 J8 r- E- B8 @% \+ u& h! X(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接) m, v2 u) r. n, J  z$ h
(4):重启执行VBS脚本,得到输出结果
' X# A  n& c+ F. @- [(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
4 J6 ^# j6 j! l$ A" q# ?
, s0 X1 f' N! ^% O: K* u6 a) O问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
# a% v9 Z  F) O* {2 a, n* Q   请高手指点一下如何通过这个acpimof.dll来获得控制权, L3 W, `2 C0 b2 _9 U
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1575

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
% ^! n# I! ]' G  q5 W7 k" }/ l我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,3 c, B5 V3 k; J4 s
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。9 i, k5 \/ f8 G; V
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
9 X9 z0 j' a' d* E$ g& n 谢谢各位。
1 V- P! w9 i  T( B6 t 

Using WMI.rar

1.08 KB, 下载次数: 1630

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
8 F& l2 M- N' j$ i; y% c3 j( v* T. D4 B2 m% E0 X9 u) ]; |
// Using WMI.cpp : 定义应用程序的类行为。4 \8 S4 R% M+ H% V
//3 L5 z& Q8 G- V4 V& |7 d
* a( }. N3 |" {4 x& x' h
#include "stdafx.h"
/ w# K4 F& s! a, x! [: i1 _#include "Using WMI.h"
2 z% r4 `, O8 r; {#include "Using WMIDlg.h"
: [5 p4 n/ Y6 h9 V; H" \' r! [# z% b; V4 S! m( `( N# h
#ifdef _DEBUG
3 d8 s& A& M( R1 K8 U8 l7 g#define new DEBUG_NEW& e) b- i# D& c+ D  A
#endif
8 ~+ C, }7 q* L
9 r  b3 n' Q1 E. Y( _$ H0 r9 a
/ V& j$ N1 k8 l1 }// CUsingWMIApp* p! F# o0 q7 u$ `5 `" f

3 y. m# V7 J# V! I( ?; SBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
* l! n+ }" p2 \+ I: U        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
5 o" t5 V* A$ J2 p" c/ F8 r; KEND_MESSAGE_MAP()
; q, o+ g( S. H9 Z$ O" T( D3 T3 N; `4 k7 Z

9 `. _+ S( r8 W9 \// CUsingWMIApp 构造
# N1 s8 N  U/ I
* i  S2 B- Z! s. GCUsingWMIApp::CUsingWMIApp(); k. F+ @( l  ?7 h; T; S
{
7 c) {, `6 M" ?3 _2 c6 Y        // TODO: 在此处添加构造代码,
6 j. b8 f' O+ V: b3 L$ y        // 将所有重要的初始化放置在 InitInstance 中
% V9 d# z3 G+ x* L  h" k}, k) X3 ]$ N4 r* r# J) i* w0 X& D

- Q  U+ x3 u( \4 F- x$ ?9 Z! B1 f
8 S2 i) r) [0 ?// 唯一的一个 CUsingWMIApp 对象
! @- X* H2 b; F6 J; ]# w
3 `; a, S; H5 k7 q9 `CUsingWMIApp theApp;
  Z/ s* ?& i2 i9 e9 ?- G5 }1 y1 j( c7 P

, h7 m. G$ ]7 O5 ^% V4 N- \// CUsingWMIApp 初始化
5 C6 @3 V0 r" a) c$ T- C5 G6 G: s( ]& w# B% \/ ]" ]
BOOL CUsingWMIApp::InitInstance()
3 t3 ^3 E% W0 U' [{2 [' Z' K# P( O, ]
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
0 b5 M( b- C3 o5 F0 K$ \        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
/ Q: i' q* O9 X        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。% w5 w" a8 v1 e* I$ K8 j
        INITCOMMONCONTROLSEX InitCtrls;
( ~' C" c. J* `/ b, s6 f        InitCtrls.dwSize = sizeof(InitCtrls);
8 }! q! x2 V" J        // 将它设置为包括所有要在应用程序中使用的, l/ W* f! }' X7 B8 E4 o
        // 公共控件类。' ~4 w/ `! h& a
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
1 \1 L+ l) }3 C2 ?6 x# Y0 h2 s* `        InitCommonControlsEx(&InitCtrls);
* N  O/ I% ~* g3 P
0 s& J+ P" K# q        CWinApp::InitInstance();
! m& U* r/ H& l( c# U
/ F: E4 o1 O- p1 e1 l        AfxEnableControlContainer();
; \: y" T$ W* w1 Z
! K  ^+ X3 d6 A) w9 Y, p- K        // 标准初始化0 ^. l( T* a% V& ?' k0 z+ S
        // 如果未使用这些功能并希望减小
5 _- l0 t* y4 j9 p) }' Y1 m% ?% ^        // 最终可执行文件的大小,则应移除下列; C& {! r6 G, Q. C' A$ q+ q3 s
        // 不需要的特定初始化例程7 J. T/ T1 {6 s' g/ \9 _& Z$ y
        // 更改用于存储设置的注册表项
" i7 _& ?( y! C. h- u9 h        // TODO: 应适当修改该字符串,
, K% X  t% K. y% [        // 例如修改为公司或组织名9 }3 @1 T, P5 l% t
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
; ]7 B0 n3 Q; w
- ~3 G9 S) q: b8 Y0 G1 x. t* g        CUsingWMIDlg dlg;0 V4 h$ G. k9 _6 g+ ^5 @' ?' V
        m_pMainWnd = &dlg;
' N5 c3 n2 l- n: d; I        INT_PTR nResponse = dlg.DoModal();) u5 N6 d& X: l( }
        if (nResponse == IDOK)0 E; ]+ S( V( m, X1 y
        {7 t6 Q+ e) g- I0 F
                // TODO: 在此放置处理何时用8 \, d9 C% ]6 {, O+ s$ _3 e
                //  “确定”来关闭对话框的代码
' }. p0 S# h- p: x+ w        }
$ _( I' i7 }- v! W3 x  i0 e' a        else if (nResponse == IDCANCEL)  c! x8 {2 A2 Q
        {
: Q! |# t9 S; [                // TODO: 在此放置处理何时用' @. R# [" }/ C/ V- u" g" s
                //  “取消”来关闭对话框的代码
8 U$ p" Q7 f0 q# ~% H1 V; l' m        }8 c0 `! P3 a/ v  |
& U% P6 b) R6 X+ V: N
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,! S: U6 V- v6 J" Y) J" o
        //  而不是启动应用程序的消息泵。0 I+ O7 [. J9 r+ G" O( c: h6 r4 C
        return FALSE;
7 M; A( p: d2 i1 s# R; t}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 19:22 , Processed in 0.130992 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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