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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。3 S  C- N/ h* Z  A+ m1 z( H
(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
* F1 C" k# K# ]. {$ D! S(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本7 [: f7 v% e9 s2 l3 b
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接6 R4 C8 q: ?+ w* X
(4):重启执行VBS脚本,得到输出结果1 n. Y$ w0 i- }- `0 s* Z  x
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)4 P+ @. ^: t$ d. S  _( r

' N' T( W2 d& ?3 f  x3 ?问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
$ [3 |7 X& M5 I( _   请高手指点一下如何通过这个acpimof.dll来获得控制权' n, ?/ k/ A# c8 K
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1147

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
7 g( L9 P% O) o$ y7 [2 J$ ^peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
) p8 j5 B8 r: t+ |或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
$ e& }; D/ D5 ?2 X7 F( ] 谢谢各位。
# n! h! U: h0 z$ K; |( M# D; m 

Using WMI.rar

1.08 KB, 下载次数: 1185

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
' q  w$ _7 }2 H5 z. i, T/ k3 _) z( A2 u" g
// Using WMI.cpp : 定义应用程序的类行为。
* a; V0 s' u' y; P. ]//
3 t( o0 W% |8 p! d6 x
  `% P) x5 T% o( ^2 N7 Z- g% M/ i) T#include "stdafx.h"! y; X7 R' L: a( U6 C# {
#include "Using WMI.h". ?* H- B9 _7 }8 Q2 J
#include "Using WMIDlg.h"
/ V- j8 l5 ?1 z2 X( r3 r  Q& w
" P$ k/ W0 l* w' w% [1 X#ifdef _DEBUG
- ~. I" s8 M5 S$ Z9 O* I) y#define new DEBUG_NEW
+ E$ A9 S  ?" J% d#endif% e  v3 ]: C6 k
8 H' @# y+ v8 S$ E9 [$ \2 f3 v

3 E5 X+ j# D( l( D5 j6 [// CUsingWMIApp( |! p# {4 L$ F, r$ R

) M2 w+ X9 ~) x) uBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)/ b7 t0 j4 w- u$ t
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp). p8 ~7 ]$ Y$ Q6 |1 _4 ?: a
END_MESSAGE_MAP()2 v" C2 J1 U# R- y! v

/ i; a0 ]7 P6 l
  u7 A+ ]5 T% z, N& p$ b# z- i// CUsingWMIApp 构造
5 ?" k+ ^, Y: N0 c- I. L( o8 b7 G- C: p8 ^, F4 f
CUsingWMIApp::CUsingWMIApp()
3 e: H/ g$ @) A/ A{" r4 @) s/ v1 t7 o: V- w3 B
        // TODO: 在此处添加构造代码,
  ], O: ]) G. n        // 将所有重要的初始化放置在 InitInstance 中6 R- A* A  a& ]- ]" K5 P4 o
}
2 e# t- ~* I6 A* K# O- c6 [
* j- C/ i4 ~2 U1 i! D" ]6 o$ R5 J+ R8 V" ?( j* a; O/ _
// 唯一的一个 CUsingWMIApp 对象
! a7 d( k8 A& m8 z
7 ~$ @) x2 L! t# g+ CCUsingWMIApp theApp;1 Y; t: v& X* M1 i" @
! q8 p+ B* C; [5 X# S2 k
' Y4 c/ [4 a% d  e- t) K
// CUsingWMIApp 初始化3 s" I2 t# T1 P4 z! K% O4 f" X
7 b9 Z& c' W  ^* O0 k
BOOL CUsingWMIApp::InitInstance()4 T" S  E) {; @/ a
{& _' A; N% {2 |; ?: @
        // 如果一个运行在 Windows XP 上的应用程序清单指定要+ e% p, ?* }5 _$ j, W& j
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
. Q) V, l- h( K% ?# s. }        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
# X: K( Z1 W0 [        INITCOMMONCONTROLSEX InitCtrls;
6 g, ]9 N2 b5 z8 ]8 _! {        InitCtrls.dwSize = sizeof(InitCtrls);
; t9 J! d  f6 d5 J        // 将它设置为包括所有要在应用程序中使用的
3 N, P$ g( _7 n9 l. p        // 公共控件类。
: P/ l* k0 m5 H# |5 g; u$ \! V- N        InitCtrls.dwICC = ICC_WIN95_CLASSES;; `% O: W" k8 [1 H, y3 p7 s. h
        InitCommonControlsEx(&InitCtrls);, Q: [3 a: z. I5 ?' t) }% }

& e+ E& X+ \% C2 c# I" l6 w        CWinApp::InitInstance();
. i% G; b+ L* Q1 l2 n+ V4 A8 X, ]7 v! `' f* o1 I
        AfxEnableControlContainer();  C( d4 k0 T9 @. n0 u9 b8 i8 F

" D# e* ^, Q& H- Z* s3 g& f        // 标准初始化5 S% S- h& y+ ^# A) ?
        // 如果未使用这些功能并希望减小
8 B  O; r4 i8 O) Q        // 最终可执行文件的大小,则应移除下列5 q0 J/ g9 R/ Z* G6 {( @. f
        // 不需要的特定初始化例程+ q( h) E9 t( G$ A' `
        // 更改用于存储设置的注册表项
  v! S: }$ @2 c- u" G' C- R        // TODO: 应适当修改该字符串,; x* Y5 c3 v4 g" x; R# C
        // 例如修改为公司或组织名2 B& ?' O( I- b8 N
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
" \5 _6 A$ }5 H2 y
5 S; I2 F1 G+ Z: K! `$ T! _4 l        CUsingWMIDlg dlg;
: W5 k' V* f" f- K8 {  a        m_pMainWnd = &dlg;
$ {' p' L# y- q, `9 g/ [3 D; W        INT_PTR nResponse = dlg.DoModal();1 Y; q6 M5 Z$ E' n: K
        if (nResponse == IDOK)
  ^& s7 c* I! J; d7 O        {
! s* K/ L. H  p0 \: b! K1 J                // TODO: 在此放置处理何时用4 i& ]: M6 Z/ N( O0 v
                //  “确定”来关闭对话框的代码
- f5 ^! u0 p7 w        }
$ ?# ~+ D% u7 o+ J1 e$ R( C+ H  j        else if (nResponse == IDCANCEL)
, E! o/ i) b$ [2 v+ D9 J        {( k% m' G2 L8 s4 H
                // TODO: 在此放置处理何时用( o2 g6 n, k# D. C4 ^
                //  “取消”来关闭对话框的代码
+ G, N+ N* `+ D! }. l        }
" h& f2 ~( k! h. `- d0 n$ N& Q7 s) Q% M: B/ ]7 d: e1 `
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
8 S8 }: m1 F5 N. {- \6 E3 e3 D        //  而不是启动应用程序的消息泵。
) `$ `/ u% s- [6 Q        return FALSE;& x8 F* U8 c0 ?. g1 V' k! k
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 13:38 , Processed in 0.083516 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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