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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
3 Q( f& y1 S) r  p) D(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
3 J( H: j9 j2 |' P(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
' p' T+ X2 [- g; K! Q( d9 a(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
6 I; @9 V- X" G(4):重启执行VBS脚本,得到输出结果6 @4 \' W: F" t4 K4 N& Y
(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)& y2 g$ U8 h$ a" ~  _
7 H* l+ j/ A$ ~: S4 G
问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。4 D& b: Z% u) v6 ]; E
   请高手指点一下如何通过这个acpimof.dll来获得控制权. p2 G/ Z: [9 R! g
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 471

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

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
$ f4 [9 ^$ l% k: Q; `# wpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。; a# f8 [' J8 y* r
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
4 n7 O; l7 U/ ?9 \, J. M; p 谢谢各位。
6 g4 e* f, v# u) M8 C1 {; f& H+ X' n 

Using WMI.rar

1.08 KB, 下载次数: 505

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件3 F0 |' j, `- {: a
# `8 u6 N/ \) j# W& x
// Using WMI.cpp : 定义应用程序的类行为。. X/ W* g3 W1 I
//
/ q( B5 p1 Q- I' r+ s0 Y: K
9 }+ \7 T- `1 e  }- Y#include "stdafx.h"( y2 ~5 E! d" f
#include "Using WMI.h"
9 A* G" f3 v- I- y: R+ |#include "Using WMIDlg.h"
/ ]7 D! I" u, j% k1 j* L" u. m! Q8 W% K6 H8 A% I
#ifdef _DEBUG" X3 q" E; K: n0 Y4 T
#define new DEBUG_NEW
7 ]% _) D/ T- }, M0 i#endif
+ I; k' e8 W) L$ m/ \- s
- K: @2 P0 H3 w+ i+ k9 V$ d& w6 ^8 L" t. C* H: a
// CUsingWMIApp& R7 @7 N: W+ Y9 r
' R2 q+ I+ J8 |8 f8 ?4 r9 I- f- c! N* E
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp), s; e* n. ^* w6 a  f0 T0 `
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
) d+ Y3 x4 c1 ?7 Z7 }! `6 bEND_MESSAGE_MAP()
# J4 M( u5 I( o5 K% [; f3 K! e! M- y. ?3 I1 w! R

$ _5 ^% o( [5 o* L* I  H+ w// CUsingWMIApp 构造- k0 c. ?; t9 W) p

7 b2 y- i6 t. D  _CUsingWMIApp::CUsingWMIApp()8 a' i- u8 [& f/ M" U3 |* Z0 F1 A
{- H: i* p* p+ I& u
        // TODO: 在此处添加构造代码,% n1 x8 w0 O+ O+ D( Q
        // 将所有重要的初始化放置在 InitInstance 中  y0 f8 j# U( i4 ]; b& D* [8 T$ J
}8 Z8 F  w: B; f: ?6 F
7 u5 @- C- q; b7 k1 L$ T- a- Q/ d
6 M6 l1 s; Y" p# A/ `  m
// 唯一的一个 CUsingWMIApp 对象! r/ i% K3 B% {
9 x) j# R. j  Z9 g" K
CUsingWMIApp theApp;1 z( T; z1 X8 ]" a

% T2 }; V" m7 S  b  |. ^
; l6 z2 a  S9 N  _& v9 w% \  Q// CUsingWMIApp 初始化
+ j# u; }$ i1 g" c" B) @
( W. B1 _* g% @) S% W# W' pBOOL CUsingWMIApp::InitInstance()
4 D; o6 z4 s/ A- B& \{
, I  l( X  ~& f3 Z        // 如果一个运行在 Windows XP 上的应用程序清单指定要
( T' M7 P% q, i% U        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,0 [+ ]' ?# P- K
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。. _: K, s( v! f' n
        INITCOMMONCONTROLSEX InitCtrls;
! j$ J7 A+ t3 b4 K        InitCtrls.dwSize = sizeof(InitCtrls);
0 a7 z, _3 ?' ~- P1 p        // 将它设置为包括所有要在应用程序中使用的
% c/ X8 O: @. {) L4 h# W/ v        // 公共控件类。
3 c0 W2 M7 u! d        InitCtrls.dwICC = ICC_WIN95_CLASSES;
% X7 ^* x8 `( u; c+ Y& C9 _+ n! r: [        InitCommonControlsEx(&InitCtrls);
# j! @3 f! ]4 b: K3 [1 L' _' }! L) h) u7 V
        CWinApp::InitInstance();' R: W' A2 q' n2 U6 \
" D$ ~( T# S+ Y6 W9 s, b0 h  V3 `
        AfxEnableControlContainer();
8 t8 Z+ J6 ^3 K0 P2 J5 q  V) U7 u; v
        // 标准初始化7 X  F0 O* ^' d) ]
        // 如果未使用这些功能并希望减小
2 \) S5 @) g, R1 m, C. V        // 最终可执行文件的大小,则应移除下列5 y/ v3 h- K. g" v6 `. \: h
        // 不需要的特定初始化例程2 }+ x6 l- X* g
        // 更改用于存储设置的注册表项! |* j: O, q5 ?; y4 t& [  s
        // TODO: 应适当修改该字符串,
/ ?/ R9 f0 m* i3 D2 p2 o        // 例如修改为公司或组织名
% J1 O( T" U  N5 t% D! L& W        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));. m/ i  H: @9 B$ S7 O9 s! }0 G

" b& ~, w: a8 I: x- f! K+ k* a        CUsingWMIDlg dlg;; i( V0 d; u" b) V5 b' l- v5 l0 v
        m_pMainWnd = &dlg;# C0 w. X1 j' ?4 K
        INT_PTR nResponse = dlg.DoModal();
& ?- p" Y- u5 J: i: u- s2 {        if (nResponse == IDOK). P3 f  l9 i+ d2 u5 n
        {
( J: f- b# k3 b; \: ~+ r                // TODO: 在此放置处理何时用6 T4 ^/ w. E7 ^& d2 r7 t  ~6 T
                //  “确定”来关闭对话框的代码, |3 H  F2 v9 X; Y: r
        }
$ {. W$ w3 R" ^( e3 S        else if (nResponse == IDCANCEL)& q0 f, r/ Z/ O+ D9 G1 y. ]
        {% F# D  ]4 E/ \; y# a
                // TODO: 在此放置处理何时用
, [& @! B, c' O+ H                //  “取消”来关闭对话框的代码; u- X, S3 S  g6 t# ]
        }" N% A4 h, E8 U  ^& E

+ i" a8 L. L9 C- T7 c4 V        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,2 }- k- g2 a0 ~. x- c# |5 ]: M
        //  而不是启动应用程序的消息泵。) t# X  A# }1 ~9 p: F% B5 w- x
        return FALSE;3 ^3 ^* C5 ]- h+ j3 L% y
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-5 09:45 , Processed in 0.031817 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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