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

如何用AP调用ASL Code??

[复制链接]
发表于 2009-5-22 14:46:15 | 显示全部楼层 |阅读模式
这几天在尝试在AP层调用ASL Code来控制BIOS做事时遇到一个问题,这里用DDK中带的Device.asl来说明。
8 K4 z% c, i/ I. ^0 K* D" {) X(1):将device.asl编译入BIOS(DDK自带的Code有点语法错误,需修改),机台刷新的BIOS后在设备管理器中可以看到多了一个ACPI设备
' M/ t! f8 D/ e0 W(2):编译MOF文件,生成acpimof.dll和acpimof.lib文件及VBS脚本
- N3 s& ?; n8 D0 H  M! C# ^+ Q3 n(3):在注册表中加入WMIACPI.sys和根据MOF编译出的acpimof.DLL文件的联接
0 r, V, c9 t  S1 }& \1 I* u' U, |(4):重启执行VBS脚本,得到输出结果
) _" [$ V* }0 M/ u(5):为了Debug device.asl的执行,用Windebug Debug ACPI的执行。(方法哪附件中所说,可以得到Device.asl的执行流程)) W* Z1 @8 M! ?" j9 z; G' \  l8 d

% m% e! t# d1 B问题:现在我想写一个AP来获得这个控制权,应该怎么做呢?查看acpimof.dll文件,里面看不到一个函数。
1 {2 A, g2 G- |' ?$ H   请高手指点一下如何通过这个acpimof.dll来获得控制权  G/ u, z( @( l& @7 W6 u$ G
   谢谢!

ACPI Debug.rar

16.91 KB, 下载次数: 857

发表于 2009-5-22 19:41:25 | 显示全部楼层
acpimof.dll只是一个resource文件,通过它是无法获得控制权的.
) o* `' `3 F: A! C8 [我觉得可能需要写一支wmiacpi filter driver才有可能在拦到相关的IRP.
回复

使用道具 举报

发表于 2009-5-23 14:38:59 | 显示全部楼层
owen,% x& d6 P8 x" X6 e
peter讲的:acpimof.dll只是一个resource文件,是正确的。AP还需要透过WMI接口来访问。
; ?! M" v# h6 L$ l2 X或者AP不透过WMI-ACPI这个方法来与ASL CODE互动,还可以定义一个虚拟的PNP Driver来做。
回复

使用道具 举报

 楼主| 发表于 2009-5-24 10:40:39 | 显示全部楼层
 可以了!
. H! ?9 y$ P3 E1 H$ J 谢谢各位。
8 a. U$ ~6 l: a- s6 D0 Y" T) h6 E 

Using WMI.rar

1.08 KB, 下载次数: 891

回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2010-9-8 15:50:28 | 显示全部楼层
LZ说的可以了,提供的代码,代码上传错误了吧,那代码内容是,就一个文件& g( Z% K$ j! r  z( o0 [2 z

" i  V3 S/ `1 b5 p$ I5 B/ p0 S// Using WMI.cpp : 定义应用程序的类行为。
; [% B7 n' }0 W* a' V8 _! k//
7 J1 C7 D( f3 ~# R/ x/ _( l8 X5 ^$ u4 y8 q) m. _
#include "stdafx.h"* t: p" \+ p  p. `6 W9 ]1 |
#include "Using WMI.h"
7 @( A- _- I( |9 `. }2 E3 [#include "Using WMIDlg.h"
9 z; h  R7 e" M. T( r
5 `, O$ m/ b3 H7 Q& _( e/ r& T#ifdef _DEBUG
/ x4 Y' Q/ T/ d( n" U#define new DEBUG_NEW4 o* T; r4 G$ g: G5 |/ E, E/ k8 R
#endif
# H8 F+ N8 a8 f" o
. e9 {) [3 v  f& q/ g" w' W' N# Q8 v
// CUsingWMIApp5 d) Z5 B& Z; h* Y

# ]; p2 A  ~/ G8 ^+ e! @BEGIN_MESSAGE_MAP(CUsingWMIApp, CWinApp)
- F, i# A0 O) \& y/ M6 `& t        ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
; }( j& O+ U; w" X/ i' XEND_MESSAGE_MAP()( P% c# a  B/ ]2 P# M) i5 x8 ^

3 e! F% [( Z$ N
( q/ L. Q: v" m6 o7 ]- s3 A// CUsingWMIApp 构造( V) v% U! N2 B! k. T: i

6 n. X3 V3 _* ]CUsingWMIApp::CUsingWMIApp()8 p5 m7 ~$ W: p5 w
{
* c0 Y# q0 D9 V/ {2 s  U# v7 e- c% H        // TODO: 在此处添加构造代码,
0 q1 n4 Q, x9 T        // 将所有重要的初始化放置在 InitInstance 中$ V7 s1 x2 J2 g0 e2 [* W0 f, i% B
}
$ B( k9 S' p) s! o
0 @3 B& v4 U" }9 h9 n6 D, P* r  }1 e$ O9 `3 N" J
// 唯一的一个 CUsingWMIApp 对象  }$ V* y: s' w! o9 `
! o8 E8 x( W7 ]. g: I
CUsingWMIApp theApp;
7 }3 Y1 ]# B1 `. R5 v# K) |
6 `+ F* x  G5 ]3 e. Q" Y
+ ]! X2 S$ Z# K// CUsingWMIApp 初始化
0 Y: K- c) n9 e3 ^8 o3 r3 @- |8 m
BOOL CUsingWMIApp::InitInstance()6 }" e8 S, N) D" [7 S' m
{7 [$ K+ D1 _, R% S. o4 g
        // 如果一个运行在 Windows XP 上的应用程序清单指定要, b# Y8 b% c" a& r; _
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
- [# k# d- r* {& Y9 z        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。  p) e6 |4 D; S* i# z, K
        INITCOMMONCONTROLSEX InitCtrls;
. _7 @0 Z' B( Y* [: R3 |: e        InitCtrls.dwSize = sizeof(InitCtrls);7 ?* x7 R  V, ]) S
        // 将它设置为包括所有要在应用程序中使用的) A2 @( }9 Z" o& _3 K) x' \# H
        // 公共控件类。
, R- P& C. [" o        InitCtrls.dwICC = ICC_WIN95_CLASSES;
- K: V# L2 x4 _  ~( m; @, k        InitCommonControlsEx(&InitCtrls);. j& s3 z- E3 A- j
* y1 l7 W7 V8 S9 T" h' I
        CWinApp::InitInstance();" U  J- t5 `8 v  I6 o' \9 \' o

( ^$ p/ ~; z  \+ A        AfxEnableControlContainer();
" i4 j. s5 I( k* K
" ^, h: ?  I! a        // 标准初始化
) S, E; t/ Y- b+ v        // 如果未使用这些功能并希望减小
* _/ q! o# S* j4 P        // 最终可执行文件的大小,则应移除下列6 |# X) p; h. K5 b% J
        // 不需要的特定初始化例程
! H; S9 _5 q0 K7 A        // 更改用于存储设置的注册表项
  |: o, \/ ~. T$ w5 w# u4 }        // TODO: 应适当修改该字符串,
2 L7 V7 b8 X$ w8 f- e        // 例如修改为公司或组织名
+ _' a" Q1 R/ N* C        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
& F( B! Z0 u  {2 w0 g$ n" U) ]1 i
        CUsingWMIDlg dlg;  U* Z: F# E5 y7 W% s7 s
        m_pMainWnd = &dlg;! H( Y$ ?+ c" ~$ P/ h# }5 d: x
        INT_PTR nResponse = dlg.DoModal();1 d( U2 f# {0 k: b
        if (nResponse == IDOK)
' v5 W. t9 `6 P7 X1 j4 F        {" j. l, L8 y) O* L/ p
                // TODO: 在此放置处理何时用
8 k+ y: l( v+ X0 z& _% I1 G- b! U                //  “确定”来关闭对话框的代码
6 S2 Z) C9 e$ `: t. v# O: `9 I        }. M0 `# F$ e1 C  A
        else if (nResponse == IDCANCEL)& ?, k. v  e" j8 k- o
        {
, H7 ~4 p6 @  J) B                // TODO: 在此放置处理何时用
) O9 R. q$ L( D- U                //  “取消”来关闭对话框的代码- c6 K+ j: ^8 a0 K1 l8 J# W
        }/ _+ W- ], H/ A! o1 W& I

3 x6 I6 k7 }# |) P        // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
9 u5 K, q9 o) Z  H7 ^( a% s# R        //  而不是启动应用程序的消息泵。  s6 F! k: U, Y
        return FALSE;
9 d$ G# I# D& p! R& I3 U+ z! h}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 05:03 , Processed in 0.032365 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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