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

如何用AP调用ASL Code??

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

ACPI Debug.rar

16.91 KB, 下载次数: 836

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.! Q) u; m# w. L2 ~" P
我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,
3 \6 K2 J  N" ^, A* M1 Cpeter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。/ R# v1 M# R7 |
或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!1 f2 C& f2 |: n* G' [
 谢谢各位。1 o1 ~2 R- K; W+ K
 

Using WMI.rar

1.08 KB, 下载次数: 874

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件
3 r& t8 H4 d* A8 n: t* k- L. b, F
" f' }/ A2 n: B2 D+ d// Using WMI.cpp : 定义应用程序的类行为。
* g0 z( G6 ]6 x7 C/ V7 I: p//
8 o: }8 e- e* a+ O+ @
; B6 N, R9 D( g. R#include "stdafx.h"4 w. p8 T$ T; ?( ]( t/ I) J
#include "Using WMI.h"$ Z9 ^) I, F3 r' K4 k( t( o
#include "Using WMIDlg.h"
$ M5 K4 p; g$ {9 B, q6 r) t+ i  }/ G+ F. q5 C5 w8 k# G! H
#ifdef _DEBUG
- x# n0 X! h, g  u#define new DEBUG_NEW! e4 u4 V# W- W7 ]
#endif8 p2 f0 u0 A  f  Z: ^3 ]# Q
8 {6 Q+ u/ G$ T2 _1 R. s) t
  @& C; I: p4 `( o0 g8 r
// CUsingWMIApp
' X( [2 b/ y7 S' K3 H7 {9 q; D4 U; i7 L& r+ M3 L" K
BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)- C7 W9 j& V' R( W- [' }: u# J
        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
7 ~, |6 A8 D0 ]1 f5 M6 \' ^" CEND_MESSAGE_MAP()
4 ^! I# Q0 J: p* K, O
4 q* B7 p( o! b4 A, x5 Q$ d. w: ]+ S  k% z0 O
// CUsingWMIApp 构造
- B/ @4 Q) o' f) p
, p) q* }7 F( g0 X2 q. xCUsingWMIApp::CUsingWMIApp()' H! }4 S; p0 z9 T
{) v2 R* Y. G' ?7 |# \
        // TODO: 在此处添加构造代码,
! O* [& o0 w4 I        // 将所有重要的初始化放置在 InitInstance 中. f) N9 ]) ]% c: l- n& H
}) s. A0 u) `" J# z/ t' m' I
8 q+ E8 y" k- ~- x* t
8 `9 {7 [5 D, g/ t6 J/ Y
// 唯一的一个 CUsingWMIApp 对象) x, u" h4 q+ A
% C' [1 @. u- d0 R
CUsingWMIApp theApp;
( l' h5 e  \9 }' ]& N  W+ K$ U: s
% B+ p, P% T8 u1 M6 w  I- W
// CUsingWMIApp 初始化
( t6 R+ x) Z8 l) }2 R7 |# S' E# ^9 Z  d; T4 x2 O
BOOL CUsingWMIApp::InitInstance()6 `0 q" f+ h+ y
{9 r4 S; r: |7 ?6 r* T
        // 如果一个运行在 Windows XP 上的应用程序清单指定要9 S' U0 J5 a; W2 D$ f/ }
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,+ V! w. C; y" u) T1 Z" O# f% `
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
6 n, n7 K; e: B& S9 M        INITCOMMONCONTROLSEX InitCtrls;: d7 X/ E4 U5 `1 B; x) ^
        InitCtrls.dwSize = sizeof(InitCtrls);9 F7 ^2 o) D3 R
        // 将它设置为包括所有要在应用程序中使用的' R  Z3 o# Z% h
        // 公共控件类。4 g+ b# x8 A+ h0 {. d) r# c4 I4 O% X
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
5 ~; l, P( R; y3 o        InitCommonControlsEx(&InitCtrls);
5 i: h- G) G5 e6 J) h: C1 }7 ^$ H
        CWinApp::InitInstance();
& o* ]2 t3 z4 }4 J) `1 F' W1 b7 C
; Y# `" L6 E) g: M( @9 u        AfxEnableControlContainer();
( n+ R6 F7 N* j1 l( W$ m. f. y0 n6 ^; j4 R7 q
        // 标准初始化
1 X% Z5 x" i. o* i6 W& |        // 如果未使用这些功能并希望减小
7 E4 F* c! u% |: b        // 最终可执行文件的大小,则应移除下列2 d) c: Q( Z. A2 Z- f: {
        // 不需要的特定初始化例程
# s6 \+ H  [% e; j! }        // 更改用于存储设置的注册表项( I9 s% `/ j7 g" E
        // TODO: 应适当修改该字符串,
. S6 V4 x: ~7 ^, \2 |" w$ d7 `        // 例如修改为公司或组织名
' P  Q7 m: b8 \; ^        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));$ ?, E+ v4 E( W4 E3 A1 G/ {' \0 B( L
. ]! D+ U& f: n" t" B
        CUsingWMIDlg dlg;2 |3 q' P) e0 m: l* t
        m_pMainWnd = &dlg;* b* F1 a; P$ H7 k
        INT_PTR nResponse = dlg.DoModal();+ Q3 j/ q: W) E% h$ s
        if (nResponse == IDOK): g+ D9 F: O9 H, ]$ _! ~' i1 q
        {0 |! h$ ?/ i: Q6 G& \
                // TODO: 在此放置处理何时用
8 L) {' X) K0 n7 ^. m+ q1 h! {                //  “确定”来关闭对话框的代码
  B" `. R2 n. X8 G        }7 t! L* u7 Z; m
        else if (nResponse == IDCANCEL)
' Q* \3 Y1 c# H# _( _+ b        {
2 k% g6 q( w3 z. R8 d                // TODO: 在此放置处理何时用
. P- M4 b3 Y7 J- ?! H                //  “取消”来关闭对话框的代码+ u$ K' d- Z* S7 A0 a+ y# J
        }
! h* f3 c. g, ~; m1 t9 f: S% X4 c' J: Q! w! Y/ T
        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
" [# s# Y8 N4 d4 U( a        //  而不是启动应用程序的消息泵。# i/ G+ Y* |+ J+ f7 g, j, L) _
        return FALSE;
' B" }! v/ f2 D) W}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-22 10:23 , Processed in 0.081828 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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