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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。6 Z* R- [( L& T5 [: k7 ?' b9 {
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
- S0 o; A  q" X* O2 v' [(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本0 k2 p& l; x4 e- _. z5 S+ ?
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接8 ?- D( t  h4 ?- D
(4):重启执行VBS脚本,得到输出结果+ X6 a# y+ A! k2 K
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)* L9 [; ]# g1 B+ B0 R
) ]/ {. X; `: y2 ?6 A! L$ O
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。; R( q+ X6 w, \( i. f; S; \0 `
   请高手指点一下如何通过这个acpimof.dll来获得控制权2 K4 v/ R% u8 `- S& @$ `
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1103

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的." P" V0 T9 b) V+ {4 k. ~
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
4 ]7 l2 d) C7 Gpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。" R* E# q) a5 K6 l( K0 Q
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
, B$ i' x. e. `2 x) w- ^$ |) \ 谢谢各位。
6 f& f# g8 ^5 t, g% b 

Using WMI.rar

1.08 KB, 下载次数: 1140

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
- t/ w& P2 ~" m0 p- M# R$ y
1 ]% r2 n  O+ z  J1 T9 n8 b// Using WMI.cpp : 定义应用程序的类行为。( s% H1 i6 ~; m& {" @5 u8 u, k
//( I5 S( K5 X1 P% Y) x' N1 M
& l! o  C, E8 x2 g: L1 W' m& z% x- \
#include "stdafx.h"
# }  G1 P& w; i#include "Using WMI.h"% ~8 {( ~+ H$ o3 a. J# [9 Y
#include "Using WMIDlg.h"3 v% X+ j0 f. E" I; _' z* s# d  A
- q+ ~7 N' W  F( s; ]
#ifdef _DEBUG- t9 Y0 J  h* U% v! u0 ^# T6 x( G6 ^
#define new DEBUG_NEW
& r$ @/ z+ k3 w: O* z#endif
, }4 V- x2 @! Z; w2 u8 h4 u" f* z% o4 L
7 U* ^  R( P4 G! c) w# l, b
// CUsingWMIApp
7 W3 l! I: {/ D: x
8 g. }" `" h$ W, \9 g2 _BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)) p1 r9 }1 e# s: }  y
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
, Z, W# h! N* }7 P  QEND_MESSAGE_MAP()5 f4 R2 B+ U: N% F
/ t' ?+ l& r; U

! {& K3 p% o# R$ V& U// CUsingWMIApp 构造
% l2 Q0 b( x2 |2 ^% @/ P: w% S: s% Q
CUsingWMIApp::CUsingWMIApp()0 n( D2 h! `% d  j0 x/ q
{- Q' F% \0 o/ i% B8 P
        // TODO: 在此处添加构造代码,
; E2 _% K; G. O4 T8 b" j( s" h        // 将所有重要的初始化放置在 InitInstance 中
+ A. z6 b0 j2 Y}+ S. a2 @4 k: l# R
! x/ v; T0 n* d5 Z
/ j% e5 E5 s7 p- v* c8 ^8 f
// 唯一的一个 CUsingWMIApp 对象
1 s; X) h0 R% N0 B
# R) r( R2 E) [, O2 X& i* LCUsingWMIApp theApp;
# w' ?" R7 r; }
  F( T, B8 P: I0 a( ^) t4 S: ]6 W5 `* l, J4 H" L. u+ H# Y: `8 k
// CUsingWMIApp 初始化
) V( f4 F( `2 H/ W6 K. |& `. S/ d  H5 c# {; }7 v: ^
BOOL CUsingWMIApp::InitInstance()
( a3 y2 [: \' A! Q/ i! n6 P) K{
* Z2 b/ R' c  O: d2 D; c5 P% I        // 如果一个运行在 Windows XP 上的应用程序清单指定要
0 K9 `, j+ _* R. s- N        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
3 [$ S, n3 {. K2 Z) e        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。; l1 ?& f! O  s; e& b( \/ b" l
        INITCOMMONCONTROLSEX InitCtrls;! W  x! s% C: N/ P5 n) _% X/ [6 o
        InitCtrls.dwSize = sizeof(InitCtrls);7 p+ f+ [: ]$ j9 i" P* N! w9 i
        // 将它设置为包括所有要在应用程序中使用的
. B# [& M0 H, ]  s  O        // 公共控件类。+ i" j+ ?9 m* \9 Y
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
$ I6 n5 T0 }6 V2 l* _        InitCommonControlsEx(&InitCtrls);; s! y7 E( |. m, z$ q3 ], H
$ C. F" Q/ A# H
        CWinApp::InitInstance();6 ~& V) d" k4 k5 t

# \* n6 a: ^# S, l1 w        AfxEnableControlContainer();
( u; I6 R# H; Q4 O" O- z, y6 ?7 B& W' W( t" [, S* C
        // 标准初始化
9 T2 S  N3 d6 L0 Q        // 如果未使用这些功能并希望减小
# u- a6 Q& |) W# ~4 N3 \        // 最终可执行文件的大小,则应移除下列
: @# l( }, }5 g* Y        // 不需要的特定初始化例程: ?6 O( D, ?/ Z+ {0 w+ g# K/ \
        // 更改用于存储设置的注册表项
. C* R: U& |0 Q) i" {        // TODO: 应适当修改该字符串,
: P9 M* ]5 ~) `7 P6 l' f+ c  ?        // 例如修改为公司或组织名
6 k4 z& T  @2 }* x        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
2 E9 {  ^: J( ~9 {5 f" K% {% B: K% E1 S2 J2 g
        CUsingWMIDlg dlg;
6 U6 ~  O5 Q  T        m_pMainWnd = &dlg;8 l# f  D& `* v' @5 l9 `' I
        INT_PTR nResponse = dlg.DoModal();' X: A( S0 P, U  D* ^) x' m6 Q% T! s
        if (nResponse == IDOK)  g! G; Q+ V1 @- F  g& y2 p
        {1 j; t0 ?# A8 j+ N, X
                // TODO: 在此放置处理何时用3 N' Q0 P5 c' |3 h3 B6 y, D
                //  “确定”来关闭对话框的代码4 @4 L* t5 w7 ?6 P) d8 O, m
        }
1 q/ z. j6 L* ^8 n1 X        else if (nResponse == IDCANCEL)
8 P  g) t( E. S5 h+ F        {( ~) r9 c4 u) n" m" H" G4 {2 w# d
                // TODO: 在此放置处理何时用' C2 O1 ?) n- T- R% d: G0 Q
                //  “取消”来关闭对话框的代码# L  N6 |" h. j9 e  c% ^% w
        }' [4 V8 }" p& M' `' E1 O

9 X- b- Q7 ~) h7 i- c& P- \4 x# h1 Y        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
9 r3 r; H& g# _# J: k: R( n! t        //  而不是启动应用程序的消息泵。! p( D+ A# V: j( H
        return FALSE;
4 h* E9 F& F6 R/ V}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 05:39 , Processed in 0.059800 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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