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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
( s+ S/ Z7 M5 x" ]' }6 U(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
; Y# A* U6 Y5 j% Y+ ?8 X(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
3 j& R+ M9 u+ M  Q" C& ?; R( l1 \(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
+ j+ A' n2 {. A  S0 o: x(4):重启执行VBS脚本,得到输出结果. \" o: k9 u4 F8 s, H6 }6 J" t
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
! b  W  Y) F- S( S% A3 w
7 `- T% c: N: ^: v' I8 M问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。5 ?  v+ c4 V( A( a; n
   请高手指点一下如何通过这个acpimof.dll来获得控制权% x' h0 n- K+ m
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 1607

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
- V9 w, K5 ]" r8 m5 H8 q! _+ J我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,4 n, v. h9 R/ N
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
+ U" r5 d: Q$ v* p  R或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
$ p9 c4 w0 }, D% ]( i: \ 谢谢各位。9 |" M. ]6 }/ U( w+ Q
 

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说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件  `* |  y* s2 ?! g% s) U1 o1 N

4 F" M0 G# j6 B+ S: t. K4 N// Using WMI.cpp : 定义应用程序的类行为。
+ L( k; n$ |7 T3 M) u//- |& `, j9 G3 e0 W/ y5 d8 T! X+ E; P
8 a. K/ d) ^5 a, K7 Q' a
#include "stdafx.h"
' {" U8 b" j$ x. f9 |% v#include "Using WMI.h"
+ z+ }. N* O; k2 L  W$ ^#include "Using WMIDlg.h"- }9 F  i0 _5 X- S+ Z' b1 w2 n

: u% K4 n. S( _6 B' w9 x+ e% i#ifdef _DEBUG2 [* {' w- T( z9 o. r5 k! T
#define new DEBUG_NEW
3 Z& n/ ~% C8 {& Q7 y) f( d' a5 ?#endif  @* s" u( b! S* n
0 o! e  G# K: C9 X

% ?* P: u9 M9 {" s+ x4 l) Q! V// CUsingWMIApp
  M9 p: d" d( V! Y
- T/ P& |* y9 ?  R( f8 mBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)/ \+ a3 h) u: D/ G
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
$ s9 r1 @6 v. g. gEND_MESSAGE_MAP()
+ t& e! R4 ]" w
: d: J. o8 h& E$ c. e- [
: H- A- b. ~% |4 i5 F// CUsingWMIApp 构造
( {: }' ?& ~, v+ |+ L+ j( F4 M/ W$ Z. b( n1 o# p
CUsingWMIApp::CUsingWMIApp()
( V" O# }- ?( y0 G" p$ u1 j- y{( G2 {) _7 d  m; D0 h2 |$ v
        // TODO: 在此处添加构造代码,
; y& a  [2 r# w  s, k        // 将所有重要的初始化放置在 InitInstance 中" b+ e7 _1 z/ T1 G+ i
}
( |* K3 {, n1 f" D# I9 o6 x
1 N/ |- N7 F# ^# ~' B, p
+ x+ ^+ N6 r# A% }- J4 x- f8 z1 B4 }// 唯一的一个 CUsingWMIApp 对象, n2 L' l: C/ O. C
9 Z$ N* t* A3 ]; _
CUsingWMIApp theApp;: `4 S, v3 _. m" f; N
/ ^4 g- ]& v  i: C' C
, C9 _" D) S9 d  i8 P0 O% u0 P$ |- Q
// CUsingWMIApp 初始化
, c, j9 V& s( j) f
# B  B0 D' j* a, Y: ?BOOL CUsingWMIApp::InitInstance()6 f- F8 x5 w3 W  m
{
2 x. c! \8 f! ^  a        // 如果一个运行在 Windows XP 上的应用程序清单指定要
/ x, w! i# H3 s9 I5 e& h2 k& Z        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,$ J9 P, Q0 q# k  x2 n
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
7 E4 C$ T9 A+ }) a4 |/ z: ?        INITCOMMONCONTROLSEX InitCtrls;
) L" X, ]6 s8 z+ _+ y        InitCtrls.dwSize = sizeof(InitCtrls);) v$ H4 t: B5 p4 B4 ]/ g, I5 f1 e: ~
        // 将它设置为包括所有要在应用程序中使用的4 Y9 D$ X+ O8 }1 R7 t7 m
        // 公共控件类。
  `! {0 H1 d$ H3 _. p7 m        InitCtrls.dwICC = ICC_WIN95_CLASSES;
/ l1 z& m% d3 H" U' f% {        InitCommonControlsEx(&InitCtrls);5 y' K) S/ k, r! K
; }4 I9 W4 C& Z6 V/ z# [, o, G
        CWinApp::InitInstance();. b# S6 d% X" T
+ ^/ C# x: x' C4 \8 j, p
        AfxEnableControlContainer();1 B: m& D6 ]: w  `) w

' U8 J9 c& H9 y% Q+ Q        // 标准初始化
: n# G8 U: W) a  ]% G/ f, T5 |5 I        // 如果未使用这些功能并希望减小7 I& E2 B. P# m6 I& G8 v. |
        // 最终可执行文件的大小,则应移除下列& F6 C0 |9 u! r/ U7 u
        // 不需要的特定初始化例程! j" l9 y5 F% Q! w, G& e
        // 更改用于存储设置的注册表项
5 }" F* Y. r2 k3 F5 g; t+ I        // TODO: 应适当修改该字符串,; V3 ~  F2 I6 M+ _5 ?) S8 l  O6 t
        // 例如修改为公司或组织名
# c9 O: n2 v8 d; Q6 e4 V        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
" A/ R  ^+ h4 r3 b! ~4 t
, I9 R: Z$ q% Q6 v) i3 f) D        CUsingWMIDlg dlg;' R' ^+ p- W7 X; k1 K2 L3 Z3 w
        m_pMainWnd = &dlg;
) B6 P& h8 O8 i. t4 @. G        INT_PTR nResponse = dlg.DoModal();6 L9 N5 @0 R/ L6 c9 w4 ^  K1 l
        if (nResponse == IDOK)# s7 h5 o# n0 q& D' P7 c" B2 d
        {2 H# ]! `( s# Z, e6 p
                // TODO: 在此放置处理何时用! m( o! ~6 Q2 [) s
                //  “确定”来关闭对话框的代码
  r" h  L* S5 K! |: u        }
% \1 s% `7 o! [        else if (nResponse == IDCANCEL)
# O' a' R; l  C- a! l        {' s, n  P9 i6 C" h* k, o" V
                // TODO: 在此放置处理何时用
3 @$ J9 ?, n9 p+ u. }                //  “取消”来关闭对话框的代码
4 j1 F3 c) D' W# }- B9 {. w6 @        }# D6 ?& ?! |: {( F) p
# `8 v+ W/ I9 b! w9 U, y, K- ]$ a7 @
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  U  |' E7 z, |, T5 k        //  而不是启动应用程序的消息泵。
8 E0 f3 n1 I% i/ ?6 }        return FALSE;8 {  I- C) f  `2 Q5 ?" {, V+ T$ T; l
}
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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