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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。! L% i  T6 {, C; B, k) C
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备! F; T+ `$ b6 g' W8 t, M
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本" b+ ^! V/ E+ Y$ F) n$ n
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
7 F. q0 S/ S, c! I! y(4):重启执行VBS脚本,得到输出结果
6 M  V$ k8 S% B6 e(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
' D% O1 P8 \. C8 B. Z( |/ T( S7 \9 S' S: H6 _/ _. P
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。& [3 Y! P8 E1 k% J  N# s; n
   请高手指点一下如何通过这个acpimof.dll来获得控制权$ A( F. {- \8 A* z" g
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1607

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,. X4 F/ n- a0 u: x. a- @3 D
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
: G% H- W0 g' s: M或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
% c" x& V( Y( I( j: A 谢谢各位。6 e/ ]2 R+ B+ a+ f2 o. \! K
 

Using WMI.rar

1.08 KB, 下载次数: 1659

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
7 z0 o$ G, R6 }* C! x
2 w$ h+ i. H7 V* d# l3 T% d+ c// Using WMI.cpp : 定义应用程序的类行为。
# C+ \$ E' Z0 J- m//
% n6 h; P5 b/ p5 R1 a" X
; N0 ?' p2 W& X& t/ ~7 _2 d#include "stdafx.h"" q' k1 e" ^& n: F/ x! O
#include "Using WMI.h"# _- p' j# W$ x
#include "Using WMIDlg.h"$ g8 I+ @3 H5 h) K0 \4 P, J! t& P
$ |1 `+ W% g8 {  F) c
#ifdef _DEBUG
9 Y( I; a0 o2 ?2 U" c#define new DEBUG_NEW
7 s2 D+ f+ f; a( z#endif6 o, h$ ^, P# M) W3 M, s
0 u1 _* B3 g# q) H' v
: i( ^6 P. C: r: }# E
// CUsingWMIApp
6 ?4 m0 L  Q( J4 x2 M6 V* G
, D  I- m6 x" l  M0 NBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)* ^' \8 O/ [8 L5 v
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)2 M, Y, z0 T: z, R
END_MESSAGE_MAP()
9 I) I0 r8 c9 x( J# h! x# M; X( X5 U9 i0 ~$ [, X

1 T  a8 K5 H+ f! m! g& Q6 Y7 a9 R( w// CUsingWMIApp 构造# q; h7 C; {! x/ [
6 N: v. r$ o: `& r) m
CUsingWMIApp::CUsingWMIApp()
5 Q* r# O# S& V0 h" N{- d1 t2 T* L6 v- \; x7 I; ~; M# e
        // TODO: 在此处添加构造代码,4 r9 Y% @4 l6 K4 }
        // 将所有重要的初始化放置在 InitInstance 中
0 p, Y9 v/ P, x1 e% f, O}
6 I/ M: N9 k1 z+ ]' f: T) E
( r7 a1 d* ^' G$ j& G
. u+ w3 }+ ~! _' w* H& ?// 唯一的一个 CUsingWMIApp 对象0 W+ w7 r) S9 ^& _; ?
- n) ~6 {6 o4 g5 x
CUsingWMIApp theApp;
* @4 t: @8 H1 n& h- I; o5 v9 V* `0 y" v
: Y& q+ x) [  I
// CUsingWMIApp 初始化
# S- l: t, q( B8 T; u$ _% x/ v' a; G, H( y
BOOL CUsingWMIApp::InitInstance()
/ \# h4 j" r+ V5 L{
) b- m8 x: X# a0 [, l        // 如果一个运行在 Windows XP 上的应用程序清单指定要
6 B/ l0 h" W, O  ]5 d4 O8 X' Y8 B        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
8 L% `. N' j6 s# o! N        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。& ~3 E/ j* N( R/ F/ u
        INITCOMMONCONTROLSEX InitCtrls;
# a2 B2 x2 w" |8 X2 j% a        InitCtrls.dwSize = sizeof(InitCtrls);% J0 J' Z1 S# @
        // 将它设置为包括所有要在应用程序中使用的" o! x: F, n7 }
        // 公共控件类。
) r$ G( ~1 `& g1 `' z! {! S        InitCtrls.dwICC = ICC_WIN95_CLASSES;# j% Y- n# ^, G0 a1 R4 H
        InitCommonControlsEx(&InitCtrls);
, s: T5 b" e- _! Q8 O  N6 i4 Q: s: H, ~! y
        CWinApp::InitInstance();
4 |7 e1 I+ A$ q& q- k
9 _3 S% o: e( G: i  V        AfxEnableControlContainer();% W: f  P9 s& f# Q" Z8 A9 ~3 W

3 s; r: ~9 z! E4 T4 ~        // 标准初始化& e7 x; w# v; X# S1 |
        // 如果未使用这些功能并希望减小
9 o/ H# G0 {2 K$ H0 |- S- I        // 最终可执行文件的大小,则应移除下列
9 h% r  |$ W/ Q6 j& u/ u) q" r        // 不需要的特定初始化例程
& _; j$ K* K1 _        // 更改用于存储设置的注册表项( l8 L4 b! @* F; W9 j0 `- L. h  }
        // TODO: 应适当修改该字符串,: b& M) Y" L! k+ B, A
        // 例如修改为公司或组织名
: c* U6 `( d) J7 S        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
' V6 C0 n1 x3 q4 m2 K/ C
" c5 n# {; A7 {1 G) r5 v        CUsingWMIDlg dlg;  `! b' q' J2 J$ l  G
        m_pMainWnd = &dlg;, H5 I! s. V8 r  D+ s2 A+ b$ ^
        INT_PTR nResponse = dlg.DoModal();5 m" ^# }) O" N0 B
        if (nResponse == IDOK)$ i" A7 A6 \: a! `, [
        {
8 C$ X2 D4 _4 U/ ^; Z8 D" q                // TODO: 在此放置处理何时用
3 j. y/ D$ w7 h& v4 W1 L                //  “确定”来关闭对话框的代码
* w4 E5 F2 g+ n( L5 y        }
1 ~. Y- ~3 W1 w        else if (nResponse == IDCANCEL)
/ U) l8 C! X, m1 {        {
7 Y' R, }# j% W6 C                // TODO: 在此放置处理何时用. ?5 c7 y! D1 y  V
                //  “取消”来关闭对话框的代码5 m6 |6 v8 H3 S7 n- ~9 t
        }
. o  F3 \3 V  P" o3 b! V# t# K. H- ^/ c6 q% G1 K
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,- f" D) x, V, f
        //  而不是启动应用程序的消息泵。
  X% O! ^  T  h; J& I: b9 i* z        return FALSE;
/ m# F; a, `7 H, W, s0 X2 V}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-12 08:10 , Processed in 0.052807 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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