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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
0 D$ V( x" L* r2 D5 A(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备  p  |5 ^: `. \
(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本  w- w# g. [5 H/ {
(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接! x) v+ T: F9 H+ S
(4):重启执行VBS脚本,得到输出结果: x' C. y$ w! R( Z# b6 J
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)1 S2 J, F+ Y7 T( L6 Q  n, I3 x
' D, q) a2 ~2 K8 Y0 {/ n$ N
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
' Z' g' i1 Y% p3 o   请高手指点一下如何通过这个acpimof.dll来获得控制权
, E5 R; @8 w4 i- V7 K0 b1 \6 T   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1590

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
% ~2 W+ L7 l# z我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
9 E  Z% E0 G6 u; ]( g  Qpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
$ {) |5 p8 ~2 N5 e5 d0 e或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!9 t" g) m% L. r4 o$ b
 谢谢各位。! Q; a2 U% I/ F5 o/ R' }
 

Using WMI.rar

1.08 KB, 下载次数: 1650

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件5 ?/ F4 P& Z$ ?& l6 e

1 ^; B* `/ q- h; |: Z9 p# y// Using WMI.cpp : 定义应用程序的类行为。* D0 Q5 C3 P5 O: z5 k
//
+ M+ y' }( K5 b3 f1 H: |6 P
  W, O2 t+ I% V+ L0 i8 Y, P#include "stdafx.h"
, E9 X& Q2 n% y0 i1 X, B#include "Using WMI.h"7 U- i) j9 s' t4 T% M
#include "Using WMIDlg.h"
- H+ I3 ?: r, C8 }. v) [
* z3 Y. _+ ?% v( c; M#ifdef _DEBUG
8 R1 \: S: x7 n( Q: T. ], p#define new DEBUG_NEW
" D* d( c) D* Y! \( {4 G5 A) N#endif+ B6 Y# X. d  f: ^, e' z
& c! A2 }8 r( i0 O
9 w( S: X( {( L( o" T! R
// CUsingWMIApp9 k8 B6 a. o( n
; K! ^% [1 w( |0 r
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
  L. ?- P: n& \5 J  ]        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)  B& |" ?  Q4 U
END_MESSAGE_MAP()0 E; D4 v( a; n

$ u$ v+ L5 h1 x6 |% _7 I  m7 t
// CUsingWMIApp 构造
/ ^* {4 g! T) |' A. X, P
9 V: I( t' z6 h: F7 C) [CUsingWMIApp::CUsingWMIApp(); @4 G$ d, p$ t2 X5 g
{( n! n* y! h; m6 V0 U; [
        // TODO: 在此处添加构造代码,! d. |% ^: U6 x1 @1 i+ m
        // 将所有重要的初始化放置在 InitInstance 中
: y7 @" x5 |: D( B7 z" e}1 l: n4 m/ X' v8 D' G9 }9 g
# j: q4 P) d' E9 Q

6 B7 c) ?* p' G0 |% W// 唯一的一个 CUsingWMIApp 对象. b) Z; g& m, o: {
+ P2 N7 W3 P7 G, G, A
CUsingWMIApp theApp;
, w& y! ], E" i' R! N% v2 `
, ]  B( i0 @2 F
0 a) s8 h' ]3 ?9 g// CUsingWMIApp 初始化
- Z" e* ^1 g8 d$ o4 `) |5 h4 V& F/ n7 W8 {0 ?$ ?0 S! P
BOOL CUsingWMIApp::InitInstance()9 n9 G& m9 N& z4 v7 P
{7 ^; R6 w! m! C  k0 i! u
        // 如果一个运行在 Windows XP 上的应用程序清单指定要! m$ ]7 j) @5 K6 j( |% |8 B; d
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,$ L$ {; O4 O( `3 B
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
. t3 \! c) z  C+ l3 \( c        INITCOMMONCONTROLSEX InitCtrls;# G* v+ n3 ?  O( \$ X
        InitCtrls.dwSize = sizeof(InitCtrls);/ }7 R& `  M( J$ H
        // 将它设置为包括所有要在应用程序中使用的9 W+ a. o9 q" {+ e7 _0 M" y
        // 公共控件类。
" C& d0 c+ o8 J        InitCtrls.dwICC = ICC_WIN95_CLASSES;: {9 h. ~; J7 d9 r
        InitCommonControlsEx(&InitCtrls);% ]$ v) }: x5 m

8 e4 w* Y/ z9 Z- T        CWinApp::InitInstance();  k, E; q1 I0 F! y
+ b- Z7 T- `* m* g" o, Y
        AfxEnableControlContainer();
) |3 F% E; l: y8 n8 `( g9 |# F5 Y  Z( \' F9 Y7 P9 G8 e
        // 标准初始化2 j  H" T! x0 O9 T5 v/ g0 s
        // 如果未使用这些功能并希望减小+ D- q$ M. Z' B7 e( c( d8 Q
        // 最终可执行文件的大小,则应移除下列$ @3 h( Z% |- [# @$ R1 `
        // 不需要的特定初始化例程
0 j3 _! _0 M' p! e7 g        // 更改用于存储设置的注册表项  h1 W" D' @1 {3 a- N* V  `) I6 j
        // TODO: 应适当修改该字符串,& V$ i: g8 A- H# N/ B
        // 例如修改为公司或组织名
- S9 j3 y+ |) W6 h7 V$ p4 X# y+ T7 q        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
3 o  o" k& Y+ Z9 @6 d! s0 e3 b. I- x" m. g7 c8 P
        CUsingWMIDlg dlg;0 }7 @1 u7 r4 V8 U, y4 n
        m_pMainWnd = &dlg;: q0 |. h3 Z. @( y
        INT_PTR nResponse = dlg.DoModal();
9 O- ^$ }. h* N) Y4 J        if (nResponse == IDOK)$ q- U/ F+ V* O) A( X; \
        {, N& i4 @3 K" ^! d- V' G
                // TODO: 在此放置处理何时用
2 ?6 u+ y# l# ~5 U9 \2 N8 ]                //  “确定”来关闭对话框的代码
; e6 T* \) P+ z# R+ h. ?        }4 J! r+ n0 R9 U. A2 G
        else if (nResponse == IDCANCEL)2 v- k& m  E( c3 n. Z# c
        {
9 O# Z; s4 e! e                // TODO: 在此放置处理何时用5 V2 D/ r, r8 x6 c
                //  “取消”来关闭对话框的代码
6 V% c; `. `. ?! T. W+ Y        }
* C. s6 |, n0 }( Z  H/ s
- M; j* D# O0 p. {/ p        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
3 K) k  U+ Q1 b        //  而不是启动应用程序的消息泵。# j+ d8 w. ?) _$ [. s; h: ?4 v
        return FALSE;
# L2 J" G& _; k3 J! ?}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:11 , Processed in 0.123850 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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