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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
9 B" l* f" m, _6 J2 B7 \(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备. ^% \8 ^' R3 i) ?/ |; T
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
6 F/ u! r9 B4 L$ S4 r$ J(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
4 h3 T! I9 Y/ ^$ V' i(4):重启执行VBS脚本,得到输出结果
5 a! ]- U) M1 M8 S7 U( Q(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
# w( }7 i) g; ^4 G
4 b1 q& l7 J/ @) `0 J问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
+ e* E0 W0 q% q1 S7 V5 \1 }& |9 R   请高手指点一下如何通过这个acpimof.dll来获得控制权
7 `6 z4 }2 K( M5 s: g   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1126

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.- @! f; F* q+ r2 ~0 J9 z0 s+ v
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,2 Y- _  e2 j6 B: R6 \: c, T
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。( o" _2 t1 i+ A
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
2 Q* X2 B+ c5 D5 v+ X 谢谢各位。( Y0 u: U+ J6 r: s( G
 

Using WMI.rar

1.08 KB, 下载次数: 1169

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
- S- g1 X- Z" {. c, r) Q# P2 S
( f8 ~7 D, c/ v: e  D// Using WMI.cpp : 定义应用程序的类行为。
: X) g* u. d% ?  \8 W9 W//
/ R/ o# E2 g1 A& g7 ^+ U) k9 J  }0 K2 D% n+ ]2 ~' r2 I
#include "stdafx.h"% N6 {6 e# ?4 r# ^: l
#include "Using WMI.h"$ z6 O/ s' W$ X$ k8 P
#include "Using WMIDlg.h"
. d! H  }6 u& T' h  d
5 ]; o9 D# R6 p2 R* g#ifdef _DEBUG
! [1 ^& Q9 x0 v% x- L$ e/ J, A#define new DEBUG_NEW
9 f0 }) {( |# A* S) i9 b/ Y' |! P#endif
) d& p, i9 Y  U7 u& X& F
. M4 m4 l% k. K# I
  b% ]/ C- [# I6 ]2 ^+ h: i// CUsingWMIApp- T: v4 z& o6 ^6 \/ h, p4 D

  C2 L& x( i% ~# g: e) xBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)( e% W( ~; D& e  H( ~* b: z* ^/ _
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
5 p* `) N, Z! }  P: s- qEND_MESSAGE_MAP()
0 u- v, D3 `- G8 i8 U1 ~) f( f1 g3 b  z2 W
( l; s4 s- f! }
// CUsingWMIApp 构造
+ z) {2 y) a  F1 U' D" H7 u0 |+ w  c; _' p* E$ i
CUsingWMIApp::CUsingWMIApp(). B5 R. e- Y! J- r
{
( y8 l0 X9 ]; p3 N        // TODO: 在此处添加构造代码,
) b/ C* }: k# U        // 将所有重要的初始化放置在 InitInstance 中0 S, o9 `( h! s  H5 K* k3 Z
}
# x3 f8 b# M1 P/ G# R' [3 \- ?9 V! @- i

) w9 K6 U& |! y: h// 唯一的一个 CUsingWMIApp 对象0 c' n- Q$ T' x" A
. E: }7 v4 N# X9 @
CUsingWMIApp theApp;6 W0 W5 o; T8 _. ^
  U# ~% J# k: A& m

5 u8 }3 d, N0 s5 L. r( T// CUsingWMIApp 初始化) @7 P- R3 W' a% W( O% ]+ o( K

1 J" W1 [5 C* GBOOL CUsingWMIApp::InitInstance()
2 L; m( F! s- N! M6 w6 U{. i. O: P7 ~/ [8 d4 B8 M
        // 如果一个运行在 Windows XP 上的应用程序清单指定要+ d, ^0 [9 H8 v" s
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
! L2 H+ `5 q" g+ P; O! K        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
: t5 {: ?+ s- e2 Q# m        INITCOMMONCONTROLSEX InitCtrls;
6 F. U- e0 [6 L* b        InitCtrls.dwSize = sizeof(InitCtrls);
6 h- z# A, H6 S7 z& n  v7 W8 R        // 将它设置为包括所有要在应用程序中使用的" H1 X' T6 s6 p- \
        // 公共控件类。
* A" x3 s  v/ y7 v6 a1 Y; z5 t        InitCtrls.dwICC = ICC_WIN95_CLASSES;
; k2 L6 }* j" m& q) o, x8 Z- s        InitCommonControlsEx(&InitCtrls);
9 n6 r1 n7 ?3 t" y# V0 \
3 E0 l6 J+ y5 H7 H6 E6 K$ [        CWinApp::InitInstance();
& g# n4 G' \, A% N4 Z) n! z% C1 B7 C1 N; ~
        AfxEnableControlContainer();
& t& f0 n- c8 {! ?. ]5 O' Z8 ^) V# F5 C/ c  Z
        // 标准初始化* |8 Z3 e5 O( A7 Q8 V# j/ X  J
        // 如果未使用这些功能并希望减小! }4 i: D- w) ?3 `; F6 H4 D& g
        // 最终可执行文件的大小,则应移除下列
% W4 u, e$ |3 P% e        // 不需要的特定初始化例程
/ I; `9 S8 c$ O& r  P        // 更改用于存储设置的注册表项6 G; F! j* d4 O& v* e0 |
        // TODO: 应适当修改该字符串,
6 z$ M8 v9 H8 S, \2 R        // 例如修改为公司或组织名, ?; h& W1 q0 k0 v
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
3 H/ b9 e  m8 \, N; J8 G
7 P" s; A" {- D6 _5 N2 g        CUsingWMIDlg dlg;2 l1 x2 B* N0 Y! I% E
        m_pMainWnd = &dlg;3 m6 Y- B6 k# F: U/ H
        INT_PTR nResponse = dlg.DoModal();
# C4 P* Z: ^& {1 s+ U" |( V$ k        if (nResponse == IDOK)8 ]7 |7 s, \4 r! I. g
        {( A  P; i9 ~; ^1 J4 W
                // TODO: 在此放置处理何时用
* Y" \8 F3 i( V& T9 }# Z  T                //  “确定”来关闭对话框的代码
% p9 w* m3 ~; D/ U. Y- D        }1 l. S  P+ }- f. p4 r1 X% e
        else if (nResponse == IDCANCEL), u+ N1 p& f) P, p  |
        {% g3 u  _1 m; K
                // TODO: 在此放置处理何时用
- P- W- b2 f" t# b* b                //  “取消”来关闭对话框的代码# o# c3 d% y! p1 Y0 x
        }& ^, w( ~; a8 g* E3 g( u8 J

( h' c7 i5 ]0 x/ I6 e        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
# u+ {3 O! r' d/ ?& S" h2 X" T% ~        //  而不是启动应用程序的消息泵。
3 ^% Q& _2 Q) X) K7 ^# X) W0 }        return FALSE;0 y0 Y2 B* c  V0 m! Q
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:46 , Processed in 0.063926 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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