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

如何用AP调用ASL Code??

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

ACPI Debug.rar

16.91 KB, 下载次数: 936

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
" S6 X. y5 d% Q0 Gpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。. A8 Q# H  \; Y; |
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
9 @$ j# H5 N- k7 O- J% F 谢谢各位。- S1 }7 K; z- O
 

Using WMI.rar

1.08 KB, 下载次数: 957

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
5 d; b6 H0 ~' d% q7 K6 j. s* e& a9 A- K
// Using WMI.cpp : 定义应用程序的类行为。
  \6 W3 E% T/ F6 M+ T//1 z( W0 V) t& r6 H
* Y, F  |! z2 i- _  A2 J
#include "stdafx.h"1 r5 Q9 r9 S) v$ A$ O% l9 U
#include "Using WMI.h"8 E5 W. g1 }# p5 O- u
#include "Using WMIDlg.h"
3 L3 z& o7 j, O$ r
2 }2 R6 ?6 ~$ m#ifdef _DEBUG2 L$ d1 ]- L' _* |3 f
#define new DEBUG_NEW
; Y! v+ p3 o0 w1 r2 w#endif
: T3 n- [4 p8 u0 @
4 Q! u# R. s7 s& k  `5 b; M4 I& c, ]' g2 H: K# a' S% V
// CUsingWMIApp2 r2 ~$ i( M1 K. z# z3 w

5 ]4 [  q- N( E' M! N# ZBEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
1 b+ @1 K& i6 k6 t2 ~% [1 S        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
+ W5 ?9 L6 B, V9 zEND_MESSAGE_MAP()
9 {2 L* K. c0 `! Q: T
- e8 D) d6 e  Q
' K7 a* N5 \" V. W% H- A4 n// CUsingWMIApp 构造! t0 @+ ]! }: y2 H" z  Z& X

4 J& _% \; h9 D* g2 q7 E9 s1 nCUsingWMIApp::CUsingWMIApp()
! v0 s, x  k" V7 v{
/ {4 t8 i5 n8 w8 J- I        // TODO: 在此处添加构造代码,: r4 [, {& f5 F9 H- A4 K- b( i, b
        // 将所有重要的初始化放置在 InitInstance 中- W( w" I8 S% \1 z7 p1 d
}0 O0 o8 d5 J( f$ }9 k2 G
0 l* r# G$ W/ k8 n% g9 R

& T/ p; t) J, `8 v/ L1 [% p1 r6 E// 唯一的一个 CUsingWMIApp 对象
' g2 `' W% y2 Q9 u( D0 S2 x8 z4 L, o7 U- f* S. G
CUsingWMIApp theApp;) R  `1 a0 d! l

$ ?9 |( v4 l6 f' i3 V- [! c: ~% l6 p& c) V$ P# b
// CUsingWMIApp 初始化% z' F5 z5 r2 H9 K

( o2 v) L; k, Y% k) C# N- b. `BOOL CUsingWMIApp::InitInstance()
* _* G$ ?9 f4 r{
) g1 W! d2 A( @$ h        // 如果一个运行在 Windows XP 上的应用程序清单指定要
" K" C7 \  J0 G+ I; _        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,- t6 u/ K/ o& X6 B3 E5 w
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。* L* n- i4 F; o( w0 d0 ]
        INITCOMMONCONTROLSEX InitCtrls;8 f3 T7 R  g% K
        InitCtrls.dwSize = sizeof(InitCtrls);) g4 l8 g" y7 P# Z' w& j
        // 将它设置为包括所有要在应用程序中使用的" \) o2 R  ]9 J4 y  I
        // 公共控件类。6 Z6 s) Y; g+ }4 h4 n( E
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
* F  s/ W- p2 a( \5 |        InitCommonControlsEx(&InitCtrls);
( P1 r- l) {. \1 w4 b9 N# v2 [/ p  L- [9 v
        CWinApp::InitInstance();
5 j# ?( m; t) n0 `4 I$ R) V5 D9 ~
: r% S( f* b) I& p        AfxEnableControlContainer();, X4 O, z* d$ }1 Y6 B- p' E
) g. }5 g$ m" ]) \" `- ?0 [3 e6 F: t
        // 标准初始化
& ^4 Z1 t6 J+ w( G: ]' f& }+ U7 X7 ^        // 如果未使用这些功能并希望减小, ?+ P# {# ^& d. J0 r* H5 A: O) Q
        // 最终可执行文件的大小,则应移除下列$ q% d  G" G. a) R- b" d) J; q
        // 不需要的特定初始化例程- e& t) g+ e5 o* i
        // 更改用于存储设置的注册表项
7 h* e( D% P! |# P& |1 Z3 h        // TODO: 应适当修改该字符串,
+ a3 x; `2 J! O2 K# f' K        // 例如修改为公司或组织名& k5 @) A* l6 \9 A+ I
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));. d) {4 G( j: X( v4 x% g
# }: U, z3 E( B, Q. o5 t( y: G7 s* O0 F
        CUsingWMIDlg dlg;1 D; y. t* D8 {9 d4 n
        m_pMainWnd = &dlg;: I* l" c6 J& h0 d' G% L, O$ G
        INT_PTR nResponse = dlg.DoModal();3 I" H/ `4 ^* D: [
        if (nResponse == IDOK)
% `2 g9 N+ C; v0 l* [( d7 w( V        {
$ L3 c4 j  i+ k, h                // TODO: 在此放置处理何时用
* I3 S% N/ H  t) V$ C5 u                //  “确定”来关闭对话框的代码+ D3 L5 w8 k; [% _
        }
6 F$ w$ s5 _1 w, X6 J0 i2 L        else if (nResponse == IDCANCEL)9 W6 f$ {( B: O( p
        {
4 U, k% @$ _, }7 y                // TODO: 在此放置处理何时用
! m4 A2 P0 Y5 k& ~5 D& o                //  “取消”来关闭对话框的代码3 o8 k! y' X5 W. Z. q
        }+ h1 i9 }: R) D" o
% ]/ \' h9 ~" b
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
% m0 l7 X" ^6 |* h        //  而不是启动应用程序的消息泵。
2 V  {7 X9 X0 H- r8 e        return FALSE;  ~/ j. a; u" q3 Y9 M" Q
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:39 , Processed in 0.155824 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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