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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
; ^  H# k" L* V1 Z. x2 U$ j(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备( c$ Y' R8 t- h( e( _  R* p
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本9 T4 q; t3 @6 o( N
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
9 Z, t) |. G1 ?(4):重启执行VBS脚本,得到输出结果2 ?4 S' B# M' _+ \
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)/ I; Q% E9 d. L) I5 I8 }, d

8 f# I( {: I2 N5 p; H1 F" h0 T问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
3 x' }2 G) X* ?" y6 F   请高手指点一下如何通过这个acpimof.dll来获得控制权
8 a0 _; h% r( \   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1560

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
0 d$ Y* X7 s! v' D+ Npeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。& |$ [& @8 c! ]
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
6 y3 d( L! i, r4 B& q 谢谢各位。% m# z- D1 Y0 v. f) l) O9 d6 N8 q
 

Using WMI.rar

1.08 KB, 下载次数: 1614

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件2 f! u' x; A3 m  W

4 t* o" y1 K3 R: d3 H4 |1 D// Using WMI.cpp : 定义应用程序的类行为。+ @. [/ Y( H+ b4 U
//( Q) N9 q0 X7 k

5 Z1 \' ?' `. r5 K$ c3 i- x#include "stdafx.h"
$ v% Y, N0 b9 y- A; T#include "Using WMI.h"; x/ ^+ C: J7 k2 s( e# B$ \" \
#include "Using WMIDlg.h"9 l* u1 b- A3 q' s
9 s/ I# x% k$ |* I0 ~
#ifdef _DEBUG
# K# {' G: F/ A#define new DEBUG_NEW' y; ^4 l# A1 ^" T8 x7 q; J/ [, E
#endif
* w% K# t5 X, q2 x0 ?. k* n5 y8 s1 U7 i# ?" A

' q  C1 Y9 O" v7 i# s// CUsingWMIApp% b' s2 s$ d: Z& J6 Q* |

5 v) q' M% h$ j/ PBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp): U* _' S2 k& G% n8 C& I
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)& Q3 M4 U0 l* t+ B: X/ ?$ y
END_MESSAGE_MAP()& z0 H! \" i  s8 [9 B9 ?! O! M

& a1 [, X$ m) I9 t. B2 ?+ v6 \7 M+ J0 g8 V" h
// CUsingWMIApp 构造
$ X) ?, X7 D3 Q+ \* t
. t( o3 }( R5 }. V3 M* @CUsingWMIApp::CUsingWMIApp()6 |# Z% A' w. M: J
{
; g2 h7 [! W; l: [' v) L        // TODO: 在此处添加构造代码,: s  A: H+ L. A0 _
        // 将所有重要的初始化放置在 InitInstance 中+ R; e9 s, m- B# z
}- P2 v4 f/ v  |7 K
0 H: t8 l" U0 g) A
2 N* }9 @. ]9 Y' }8 k8 N/ A
// 唯一的一个 CUsingWMIApp 对象
9 @; c1 ]" U) ?. G3 h4 Z0 s
' L' L1 |3 L1 f) pCUsingWMIApp theApp;$ f5 n+ J5 f6 m2 i5 c0 ]+ ~
7 T! K& J' ?; X% z) _* g8 N4 ]/ @$ j+ v

; S; a$ x5 k, S/ V: B# t5 Y  D4 i% T// CUsingWMIApp 初始化
6 D8 v" f+ @) D) e* t
+ w1 |4 _  F8 j. w- j' g0 u4 D" [BOOL CUsingWMIApp::InitInstance()
8 Y' {; }1 D: h2 M* f{6 m( D0 ~) b' M
        // 如果一个运行在 Windows XP 上的应用程序清单指定要/ \3 J5 e9 j/ I8 l/ q, t9 i; w
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,9 y: h% V' L) K
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。8 l  |- o1 C* E! [3 l/ F" O
        INITCOMMONCONTROLSEX InitCtrls;4 P4 @; U3 M% n3 b
        InitCtrls.dwSize = sizeof(InitCtrls);2 E8 B0 |0 b7 j( H+ b
        // 将它设置为包括所有要在应用程序中使用的# e3 t5 S1 D3 s8 W; y) E7 U( y
        // 公共控件类。
: w2 g) Z6 c6 R/ A" A( h        InitCtrls.dwICC = ICC_WIN95_CLASSES;  S3 I5 y) E8 V& J
        InitCommonControlsEx(&InitCtrls);
. r- A+ Q" ^/ t; a: Q0 D3 O
/ |8 @) k( c% g        CWinApp::InitInstance();
+ K" I1 V1 Y/ p; J6 W+ n" P: ]) R" h1 J8 _$ Q( w
        AfxEnableControlContainer();
  F( N) c; q* H4 W0 n$ D% q. J7 \+ j
% ~. M9 C8 F2 q& ^( |        // 标准初始化
$ x1 g2 h9 A8 T4 Q        // 如果未使用这些功能并希望减小2 b/ V% b% x+ R9 Y, }/ E
        // 最终可执行文件的大小,则应移除下列/ z5 i( ?9 B* ~( n0 ]9 ?
        // 不需要的特定初始化例程
! r, [8 ^# A( X# H, Z        // 更改用于存储设置的注册表项2 @9 v, o2 j) A
        // TODO: 应适当修改该字符串,6 z3 o3 t$ n9 n0 T
        // 例如修改为公司或组织名
2 l) X5 T  b- A$ E% Y+ K* X6 {        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
. v. G: S. o% ~, }4 ?9 X4 ?4 l  R) Q1 U7 Q* _
        CUsingWMIDlg dlg;$ s. c9 `5 B$ u% H5 c
        m_pMainWnd = &dlg;
$ b" K4 J+ @. F0 ?6 h5 T        INT_PTR nResponse = dlg.DoModal();
" p7 n, g# O* U: s* {4 N) V  }        if (nResponse == IDOK): o! ^, A0 D+ Z! ~
        {
+ S9 |- ^6 l- Y# f( D6 M8 ]8 L6 G2 T                // TODO: 在此放置处理何时用
) ~( y/ V' g. T- J6 H- D- `                //  “确定”来关闭对话框的代码7 u, j! z; ]! b0 u
        }
0 m0 L2 [& G* W- u' F% A$ d4 J        else if (nResponse == IDCANCEL)
1 S0 P5 R; n$ \, Q; A* ^# u# S        {
; D5 ~; [' t; @, P* J& n( d                // TODO: 在此放置处理何时用8 M- D/ W; H, u
                //  “取消”来关闭对话框的代码% @, x. G) I; l/ l# Z$ F
        }
9 j" A) G7 B% W* t9 t  I1 D+ @. X7 H- \: J
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,/ t3 i* i6 k5 e0 S
        //  而不是启动应用程序的消息泵。
% B/ `8 ^0 A( _% c& m7 c        return FALSE;; [# _/ Y6 t3 B5 G6 X
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:43 , Processed in 0.044586 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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