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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
/ _% [) t. e! R+ X+ u9 ~+ w4 X(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
" O9 ]! v& t( J" z9 J1 i5 f(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本) ], \6 E9 K0 h4 ?: _+ ?- E
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
$ H, `$ b4 [% f/ R, b(4):重启执行VBS脚本,得到输出结果8 G" D/ U" @6 r' }6 ?, ]" R( u
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程), z# C3 u. v8 M7 w- E% M1 G
: P# q8 E" E" E9 s0 o2 x
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
! c9 n+ {. i7 I; P# [   请高手指点一下如何通过这个acpimof.dll来获得控制权
$ V& m+ b+ ]& _% O4 v2 [   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1574

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
% q+ A( C$ H$ s( X- Z$ |7 w6 I1 T/ i我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
6 V+ [6 Z9 T" B, E# z, n6 j! Apeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。- r2 J' u: U3 c& P: P: ?) @
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
5 K5 d% Y" o5 l0 e, } 谢谢各位。
3 }  m- o* N. {/ Z 

Using WMI.rar

1.08 KB, 下载次数: 1629

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件$ d0 N# J2 j* F* y
6 g4 O1 s8 a; [. F6 }( h) c1 s
// Using WMI.cpp : 定义应用程序的类行为。
/ A& O3 {& n+ _5 s' w; w2 H" q//* {0 K( V: G4 n4 _" S* t
. N! }2 |" _4 B. V( g0 `+ |
#include "stdafx.h": L8 D( P- b* t4 Q
#include "Using WMI.h"6 j1 a+ I- y% `: X. \% F% R
#include "Using WMIDlg.h"
5 n/ n( R# L, e# f+ l' t
7 q/ |1 B$ X$ U8 _#ifdef _DEBUG- J! O+ J$ K+ ?6 L9 C' g: |
#define new DEBUG_NEW
. Q6 q* Y/ k' y* d( o#endif
) ^  n/ Z: o' [7 d/ O, f. I! {- H7 X) }8 d  T7 j

1 d  g3 U3 u- q/ y( Z// CUsingWMIApp3 i8 G* B& p+ K% G6 W( o/ S3 o

8 O0 M+ k! d: c; ~: U( bBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
9 S0 F$ [2 o% ]+ I5 i1 s) \        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
% L3 B* f# ]# E) }9 kEND_MESSAGE_MAP()$ H1 M) G" n& [! j

7 C7 G% @7 ]" s8 _3 G2 c8 k5 }- g
$ P& b/ A, i  P0 {* ?5 p4 y// CUsingWMIApp 构造
8 p) k# }  a5 B# H7 C9 G& n0 W2 l, ]9 X$ ]
CUsingWMIApp::CUsingWMIApp(), X: R" X" Q. X: n% e7 j
{" r0 S8 K0 \1 A& I: w; g
        // TODO: 在此处添加构造代码,
6 L5 E( }) Q8 b; G        // 将所有重要的初始化放置在 InitInstance 中
, ]1 ^/ E$ V$ k' L}
2 [3 I. Z: j6 \- P3 N9 B9 E; i* c. J( p. Z' b
& B+ V" [9 `- y4 `
// 唯一的一个 CUsingWMIApp 对象, F, \+ h1 t6 \% a; P
' y$ l! \+ ~9 F/ \8 a1 `6 g
CUsingWMIApp theApp;
5 {0 G9 O0 L9 o5 V" p3 S7 @( u: V* C0 |# X/ f& ?* {* E1 s# [( E& }
9 \1 K" u! P  p
// CUsingWMIApp 初始化
7 |4 Q9 r' `% J# Z4 F6 [  {6 ~  h. |; {8 w& o7 C
BOOL CUsingWMIApp::InitInstance()
- Q9 R* Y3 E+ q& j/ Q5 e+ ?2 T{
; {- L6 X! b* X' N0 O        // 如果一个运行在 Windows XP 上的应用程序清单指定要7 T5 k4 }+ _4 z5 ]# B7 F6 p5 [, i
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,; B; w* D6 f4 H9 Q: G- q2 T
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。# [$ j- y1 d3 N$ x) \
        INITCOMMONCONTROLSEX InitCtrls;2 L& M* S5 P" D3 V# r) p3 ]; @
        InitCtrls.dwSize = sizeof(InitCtrls);
, S7 X6 W% J  K$ E' W* q        // 将它设置为包括所有要在应用程序中使用的- |0 V( J, k/ c5 w: R
        // 公共控件类。
) E' r* F# L9 w- i* x4 T( ~% ?0 Y        InitCtrls.dwICC = ICC_WIN95_CLASSES;
1 T! b! `4 G0 A        InitCommonControlsEx(&InitCtrls);; i5 q+ y; l! @4 M  z
& h0 f! t- N4 {* G; q+ R
        CWinApp::InitInstance();% S5 P& a* U4 g7 P

; ~3 \8 J1 y0 c! V        AfxEnableControlContainer();) n0 B0 j1 c6 D! s9 d* V2 s

/ Q8 A/ l2 R. a4 o1 j        // 标准初始化7 T  ^, k+ g1 |- b4 Y' B8 w2 G
        // 如果未使用这些功能并希望减小+ {! S' d  s. L+ H9 G# l
        // 最终可执行文件的大小,则应移除下列
% x1 N) [# L9 B5 }- u, s        // 不需要的特定初始化例程/ ]' j5 H8 {, Y7 R6 ~9 a' H
        // 更改用于存储设置的注册表项5 c6 w/ x5 e% _# T$ v# |0 s
        // TODO: 应适当修改该字符串," D4 i9 L: d; z" h7 b
        // 例如修改为公司或组织名
/ s" I7 ~( O0 ^6 a2 X! T3 q# `2 o        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
7 W& g  v; p/ U& V! C. U6 E/ D
6 v* ^3 \$ ~  P* G! P$ Z        CUsingWMIDlg dlg;% E2 {+ j+ }: [# R# X) X/ p! \7 S
        m_pMainWnd = &dlg;, g; h5 p5 |" s* h' c$ t
        INT_PTR nResponse = dlg.DoModal();. {( A1 o* u. N6 @
        if (nResponse == IDOK)
. R2 r7 |) X: w        {: S8 U9 R: A( j8 Z# _* _
                // TODO: 在此放置处理何时用$ L. \2 B! g, \2 |$ w6 c
                //  “确定”来关闭对话框的代码/ L8 ]4 J/ N- Q5 {( |5 K
        }
  }  `8 ?+ H- Y1 C& n9 c        else if (nResponse == IDCANCEL)
, I( a9 u6 z; P; W        {
& u% t! M- V* [  a& L9 h                // TODO: 在此放置处理何时用/ w& h$ R) |. h+ e* }- B% r. H+ n
                //  “取消”来关闭对话框的代码+ p" U3 X4 _- q/ w6 y1 V% }, P
        }. b; i3 h+ V( ]& z4 ]4 `5 {

+ T+ Q. s9 L6 r# c; n) b        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  q+ M& e( Z) Z3 u* n4 R        //  而不是启动应用程序的消息泵。
8 L# e  V* `5 \( a0 [        return FALSE;* O8 g! s1 Q5 }( I4 W
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 16:20 , Processed in 1.276895 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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