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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
$ r% G4 ^3 p9 Z5 m% V' U8 s(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备# d1 _$ k# s' l0 Y1 c2 J
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
! b  B* H! _: G7 _' x' v# V(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接8 h) w3 X4 ~  |2 d
(4):重启执行VBS脚本,得到输出结果
1 Y5 T1 Q# W( S$ f2 K# {(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
; r! s/ A6 Y" ]. k4 P+ C% S. G6 V. W# J7 ?  p8 _
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。1 E4 ?8 z% W* Q# J; Q
   请高手指点一下如何通过这个acpimof.dll来获得控制权0 Q% q/ B* g$ m! `
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1526

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.4 r9 {3 s5 M, W+ `+ m5 M& I
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,0 T% U2 f- l" V" X2 Z% @
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。6 b- C. s% {3 m/ I8 H0 [1 p
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
+ x0 y" y- I2 ?( E+ ` 谢谢各位。9 a6 o% f$ k- X$ f
 

Using WMI.rar

1.08 KB, 下载次数: 1581

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
8 e2 W9 C% {: R9 D4 p. R; u# @9 `4 f, H2 X0 |
// Using WMI.cpp : 定义应用程序的类行为。
8 Q* q7 `. {3 ~* S1 N2 K  L//
6 }# E! X& O2 `9 x" E" A2 m0 w# w& H3 S, V4 i* Q! \
#include "stdafx.h"
' |( ?8 |" a6 u: T#include "Using WMI.h"1 Z/ J% ?6 v. f& l% ]5 z
#include "Using WMIDlg.h"
* Z- d1 A9 w  D, p6 e9 o( B" u- R5 j* L
#ifdef _DEBUG" G- B6 }5 p1 [$ x( s
#define new DEBUG_NEW
! M# _7 z) @) v; J6 J#endif
4 e' o, E  P: J3 ~3 y9 G& J' s3 D! \

: h# f; _4 C; T' y/ b6 G/ W// CUsingWMIApp& z$ F# r8 }( ?

3 R0 D) M: K7 t( z7 x" ^BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)! ]0 j6 `  S- R4 x6 ^# K
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
1 ^( l0 J# j" D' V( k( x) W* _END_MESSAGE_MAP()
: l8 ^( x% X) t5 n2 v
; [- {% {: V; e# W; r$ o0 f. ]6 l# w7 v# i$ `- Q5 E0 I9 ^/ a$ i
// CUsingWMIApp 构造
1 J2 W8 ?# U6 C! \2 c) _- H
/ l+ I' m! F; G+ K0 |CUsingWMIApp::CUsingWMIApp()6 O; P, t5 {6 v; s# W
{! A4 V9 y8 `6 _9 O5 b
        // TODO: 在此处添加构造代码,; F7 z1 R+ I( V" a0 e
        // 将所有重要的初始化放置在 InitInstance 中
4 P1 \' d7 ~) ~0 d$ Q}% f2 Q  ?7 v& o3 C4 A

: j. ~0 i3 F1 B5 k* B2 A6 b
6 ~- K9 K( F, n7 M& t// 唯一的一个 CUsingWMIApp 对象
& c/ U0 I& D1 u) b5 G4 C% w3 `+ m) H+ [- C- m
CUsingWMIApp theApp;
% \; g7 q% n1 w' `4 G' ?- ~* Q, o
* U& q# v5 {6 W- f
// CUsingWMIApp 初始化* \* ^' t, |! O# g9 i5 ^0 B

$ Z% I/ P+ y- K5 `6 ?, F' ?# ^BOOL CUsingWMIApp::InitInstance()( {& B4 ~2 g  b6 k  q
{
. C- s1 h5 k% U" i        // 如果一个运行在 Windows XP 上的应用程序清单指定要
: Y- j) t2 I9 [8 \6 O        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,4 o# K1 E% o- J" f" i
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。4 }0 W7 S) y2 s: p9 {3 y+ Z
        INITCOMMONCONTROLSEX InitCtrls;
; ^0 D2 Q0 B5 p6 K+ K: \2 @        InitCtrls.dwSize = sizeof(InitCtrls);7 V+ H" t: U0 G; W, t7 ~
        // 将它设置为包括所有要在应用程序中使用的
3 R4 I, ^( P5 n5 q( M; M        // 公共控件类。
1 _' z: x  M! j1 x$ c        InitCtrls.dwICC = ICC_WIN95_CLASSES;
6 M; V. g8 F" T        InitCommonControlsEx(&InitCtrls);
6 n7 Q! \) C, k" ]% W8 z
4 M+ U! e; C( k! R        CWinApp::InitInstance();; y* \# a% g% K0 H# K, Z- Z

: N0 d- A. m3 ^+ [& G: n        AfxEnableControlContainer();
) f* Z  i7 F5 S% u/ p6 i. J3 t
- P" a2 A+ T# J        // 标准初始化
  ~1 g7 c; T* W( c# v# G5 q# G. g        // 如果未使用这些功能并希望减小
* t9 }7 `8 p* {7 [5 N3 [0 ^, v        // 最终可执行文件的大小,则应移除下列0 F+ y, j7 f! O" V% Z* v- i
        // 不需要的特定初始化例程
- C- {" k" |% ]& K" z        // 更改用于存储设置的注册表项, H5 K9 ~( F# m% x& E0 j+ I8 P
        // TODO: 应适当修改该字符串,
% C$ w# I7 I2 n6 R        // 例如修改为公司或组织名: x/ f5 \9 W0 f8 i0 W5 x
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
' i. G5 l5 P9 n1 c& n: h. |* h, Z0 {4 h( r: z
        CUsingWMIDlg dlg;7 y# r% J6 s; t! V5 T/ I
        m_pMainWnd = &dlg;
/ n$ r) D% L* G$ G5 E        INT_PTR nResponse = dlg.DoModal();4 e) V( P; F' f0 `
        if (nResponse == IDOK)
- a) P! M+ F; R/ @$ z. B+ Z! M. Z        {
8 w2 Y* Q9 x4 s* e                // TODO: 在此放置处理何时用
8 F* @! X' L) j2 X4 w1 a6 q                //  “确定”来关闭对话框的代码
( r9 i) y" K* j# [' ?" U9 J4 @        }4 R1 v4 C; g6 u: H8 Q. _7 N" b
        else if (nResponse == IDCANCEL)/ r* `8 j! U4 Y1 i9 R# W
        {
# _* N& v4 _" U8 k* Z                // TODO: 在此放置处理何时用
1 @: ~% {9 x' Z: n& P                //  “取消”来关闭对话框的代码+ A( X: d% ^+ D$ s# V
        }/ M- J  E$ H2 R2 a: A1 u. i

, F9 P# \! p/ @2 n2 {+ ?        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
9 U9 H& A6 j2 e! M& h5 a! V        //  而不是启动应用程序的消息泵。
  o* C; k# d: V& x6 G2 h3 A7 m        return FALSE;
. ]0 \  j6 l' x: y5 c- Q}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:03 , Processed in 0.088585 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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