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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
' b/ J2 L  v& h(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
+ x" S+ `% m8 k- E(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
# }1 e% u; x: c(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接+ E+ {. K1 x8 f  K
(4):重启执行VBS脚本,得到输出结果
* n  J, T4 F- g) `0 s(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)
- F# W  u" O" R9 C1 C$ Z
3 E( E! G- P+ W: i- s# m( ~' `问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
  [. Q* ]4 B$ E7 c3 O   请高手指点一下如何通过这个acpimof.dll来获得控制权7 ]- ?" Q2 b4 _) \, d1 O
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 820

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,6 d3 d. i! K, J% ^, L4 m8 q
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
) X* I$ f) g4 `1 D9 O) c' R或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
& R( R: Y7 |, e& t) q4 D 谢谢各位。
# O/ y; r  R0 L9 j% w* ]1 E- r% H/ J 

Using WMI.rar

1.08 KB, 下载次数: 859

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件2 x& R" J0 w+ D' n! _1 C# J

+ U7 a8 Z  N+ I9 `/ J// Using WMI.cpp : 定义应用程序的类行为。3 U8 W0 Z% p! |* r
//
& ^+ l5 s8 }) F& v* X) V: G  i! \1 s
2 X9 S( |- x9 A% z" |9 D#include "stdafx.h"! y( m- C! q8 [/ S
#include "Using WMI.h"% M: T' {3 e: `
#include "Using WMIDlg.h"; b0 z6 l$ B) F; b

! }" g) L" d' }#ifdef _DEBUG! z" \; v0 Q; U( m9 a9 W/ q7 C
#define new DEBUG_NEW% W! }" E  \5 S3 s3 Y' S3 s6 E. q
#endif
: y  x+ M9 q' e5 d7 J
- i$ j) I& e9 a( N' p( K
; ~1 |* m# \5 T9 o// CUsingWMIApp: q' n' z+ D- [* V2 A0 b
" G2 ~! M' h& i* t. T. N) a6 t: ]5 M
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
) w* M0 \' l, G+ b* m. C$ c        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)- d$ x' A  ]& Y
END_MESSAGE_MAP()
3 S* b! u. X! x* r$ W% G9 R
& c, [/ Y& y" \$ J3 K: U4 t
3 G# r$ r0 m) A// CUsingWMIApp 构造0 u. K5 o9 [& X0 M; Z1 L6 _

+ l4 h: ]$ j/ }. I) BCUsingWMIApp::CUsingWMIApp()
6 \2 I# {. }! F9 ?% i{8 G3 I: i& i: g5 Y, u0 D
        // TODO: 在此处添加构造代码,/ X" o3 Q4 w  g4 K. H7 J+ f9 v
        // 将所有重要的初始化放置在 InitInstance 中
& K' t1 m% x: x9 @& C+ p! e}1 V1 \" B. d7 V0 ?! L/ ~% h, F

. E+ _( X9 o- {/ B. ]& o: p$ s! d* x$ J
// 唯一的一个 CUsingWMIApp 对象2 m0 [$ d1 O5 Y& Y2 m( `5 t

" `+ j5 q/ N. J& w) G7 BCUsingWMIApp theApp;
& }# E# \# W( [) g) k% P* s
5 u9 w% U1 i. h" |4 v
5 ?( O; k& U2 Y( C$ d+ `// CUsingWMIApp 初始化
3 T0 O" |5 S7 |9 U/ F* ?2 x8 R- W3 m, @( D# |8 t1 I" G
BOOL CUsingWMIApp::InitInstance()1 G, b% U5 ~+ C# O2 E3 ^
{
' p- U! X* I; @9 R$ S9 t: z, X6 L        // 如果一个运行在 Windows XP 上的应用程序清单指定要
+ M! K1 S' J% s# R; O) r        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
8 B7 p4 a$ g5 K        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
8 g5 y6 a, l5 {4 ^0 ?8 i8 K        INITCOMMONCONTROLSEX InitCtrls;6 J) j! I6 H' U  I4 l
        InitCtrls.dwSize = sizeof(InitCtrls);
  T7 \3 d2 k( f; n  G        // 将它设置为包括所有要在应用程序中使用的
! N% F5 H/ A- d+ E        // 公共控件类。
+ w0 l0 x  @  j& i4 E# _3 m        InitCtrls.dwICC = ICC_WIN95_CLASSES;; Y' j( G) D- d+ N$ x( d
        InitCommonControlsEx(&InitCtrls);
$ L# J/ M* F% E! W7 @: X' v3 x; C3 e  ?8 |
        CWinApp::InitInstance();4 l5 j( `+ o! Y8 {
/ R( o2 R) e5 F6 F0 D* h# \2 d9 w
        AfxEnableControlContainer();/ Y* \1 U5 R" J3 i2 X
4 r# H8 k# Q* Y0 U2 i3 @! W. Q) Q2 H
        // 标准初始化" {, B" A2 U7 z9 ]( N) I0 p  t
        // 如果未使用这些功能并希望减小% I( \; F3 h. B  j
        // 最终可执行文件的大小,则应移除下列  w& I3 N7 {) L- v
        // 不需要的特定初始化例程
4 S, A9 u# ]3 d) }' ?' B- ~0 Q* ?        // 更改用于存储设置的注册表项
) u2 E& O! @# m        // TODO: 应适当修改该字符串,( k' f' ?) \/ f* D7 n
        // 例如修改为公司或组织名6 Y- k0 C$ M( e0 w1 k( T& v
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
: K$ D* x( i" i1 _" I( ?0 B7 n0 S( g% K* k* \: S3 v% G
        CUsingWMIDlg dlg;& u' R/ f( d: s( }2 P
        m_pMainWnd = &dlg;
+ J% o) c! q  u% N! F        INT_PTR nResponse = dlg.DoModal();
. t+ V3 `6 f" r/ X        if (nResponse == IDOK)' L1 v, N9 G2 J5 z  i. h2 i: a# G# d0 L
        {  F! I! T4 c. W& F& |% k
                // TODO: 在此放置处理何时用
6 z, O! y/ M( X, d+ l/ w. u                //  “确定”来关闭对话框的代码' [9 S" j! F/ L# S# A( ^; J! I, L
        }
0 u/ r, b4 @" }# O        else if (nResponse == IDCANCEL)
9 C3 {/ Z: Q! {% W' a$ j! U        {$ `; g4 ?7 q# A5 f& I! S- D
                // TODO: 在此放置处理何时用" q5 K6 ]0 y3 s# @% @7 k
                //  “取消”来关闭对话框的代码1 h) i: z3 a' E$ t2 B: L3 D* F
        }. N. ~) r, W8 U
) r. G' T' h$ x# C
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
5 Q: R. {% y6 h        //  而不是启动应用程序的消息泵。
7 @; w# N3 w& S8 H5 O        return FALSE;2 ?- S# I2 A" q, R4 d5 F
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:40 , Processed in 0.026008 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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