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

[原创]WMIACPI.SYS

[复制链接]
发表于 2009-5-22 17:14:23 | 显示全部楼层 |阅读模式
WMIACPI.SYS
/ `- I0 y5 F+ W( E- _
1. WMI Concept: y) A2 n, ?* d& o, f
! R7 @9 b" Q+ H+ ?" Q& Q$ u
WMI全称Windows Management Instrumentation是一种管理计算机系统的方式。它是微软基于WBEM的实现,WMI希望为系统管理以及分布式数据描述提供一种模型,并且允许使用基于COMuser mode API对系统部件进行访问、管理、控制。, m# p( y! \  F% R; q. T) v/ o
0 W7 U- ]0 N7 T- d' [% F, `

/ M$ C9 g) K& ]2 I; d* W! ~7 y2. WMIACPI.SYS
: a! w6 W* }. R! }
2 d" R4 S! P2 M) o2 W8 pWmiacpi.sys 是微软提供的一只generic mapping driver它的Plug and Play ID PNP0c14.ACPI包含丰富的系统信息,OEM厂商可以利用这支mapping driver定制平台相关的功能而且允许使用WMI获取,如此便可以在单机或者在网络环境中获得平台的特定信息。关于如何在BIOSOS中定制wmiacpibini已经给出了非常详细的讲解,有兴趣可以参考
bini的文章。在这里我会讲解一下原理部分。ACPI-to-WMI mapping function是通过下述两只driver达成的:
; e; T6 F' Z# M$ zA.Acpi.sys
8 u; m+ A- H5 i$ xB.Wmiacpi.sys
. ], `! ~) F, ~1 xA).Acpi.sys的一个主要功能是解释和执行aml,aml就是asl code的机器码,所以ACPI asl code真正的执行是由acpi.sys触发的,而不是BIOS主动执行的。它的另一个功能就是查找ACPI spec定义的device Plug and Play ID,并据此创建相应的software device后续OS会为这些device加载对应driver。如power button driverbattery driverlid driverfan driver等等。Device 对应的Plug and Play ID可以查阅ACPI spec获得。
9 w, b, y% a) i. cB).Wmiacpi.sys它的Plug and Play IDPNP0c14,一旦BIOS asl code给出定义,acpi.sys就会创建这个pseudo deviceOS就会load wmiacpi.sys作为该devicedriver。当然仅仅加载这支driver还是不够的,为了能够使用WMI访问该software device包含的具体信息我们还需要一个供BIOS使用的asl文件以及与asl code对应的MOF文件而微软并没有提供Wmiacpi.sys相关的MOF文件。那么MOF文件到底有什么作用呢?要搞明白这一点我们来研究一下WMI的工作原理了,下图1展示了WMI Architecture2 i9 E! {! u4 J4 F3 [

& j. T: b' ]. A: N9 M% Y* a! A2 G" ~0 j  A; Q! ^
wmiacpi1.JPG
8 j1 B9 \! s9 m, N! h) @user使用API访问WMI信息时,WMI CORE会查看repository中已知的scheme定义,然后将希望获得的信息通过IRP的形式送给Providers这些Providers通常都是WMI Driver,它们处理IRP并将所需信息送给上层。那么也就是说必须要将MOF scheme加到WMI repository之中,consumer 才可能透过WMI COM API访问到。完整的过程是这样的OS在加载WMI驱动程序的时候会查看驱动程序的MOF scheme,如果驱动程序MOF scheme 部分正确无误,那么OS会将MOF scheme提取出来并自动加入到repository之中。所以OS仅仅加载wmiacpi.sys并不行,我们还需要给出与ACPI asl code对应的MOF scheme,并且通过在WMIACPI service key 下面建立一个key MofImagePath它的value指向MOF档的路径。如此在OS加载wmiacpi.sys时就会将对应的MOF scheme加入到repository之中,后续consumer访问时WMI CORE就会检索到scheme信息,然后下IRPwmiacpi.sys。讲到这里原理应该差不多了但还要注意的是wmiacpi.sys并不会去执行asl code,最终执行动作还是会由acpi.sys发动。driver是层次结构的,acpi.syswmiacpi.syslower driverwmiacpi.sys会将上层对asl的访问转化为low level IRP 送给acpi.sysacpi.sys再返回具体信息然后逐级回送。7 G& j0 g& `' h

9 G+ ]$ R- d5 I3 n8 b3 D3. Under the hood
8 B! s# n1 ]5 J# ~  }  H& Y6 O/ S* }4 w8 \3 [
前面都是原理的介绍,讲的我都快吐血了J,实践是检验理论的唯一标准。说不如做,随我揭开内幕一探究竟。WDK ver6000 src带了一个wmiacpisamplecodebuild之后会生成一只acpimof.dll,在BIOS里面将device.asl
包进去然后再注册表中加入acpimof.dll的信息然后重启。讲到这里还要提到一个验证wmi的好工具叫做WMICodeCreator.exe微软的网站上有下载,下面我们就使用该tool验证前面的说法,下图2演示了我们定制wmiacpi之后的状况:
1 V. H* b0 m- M5 e+ j) J
7 A  g$ Y) K, V* C8 ~% [' s1 r2 i- }/ N
wmiacpi2.JPG

4 _$ q- d) D; p$ z
2

$ o! V& s6 T/ g. A2红色方框标注的AcpiTest_**就是我们定制的WMI class。也就是OS Load wmiacpi.sys之后将其MOF档案解析出来并加入到WMI repository于是我们就看到了上图的信息。下面我们来跟踪一下访问具体的class的情况吧,祭出WinDbglet’s go!首先查看一下wmiacpi.sys这支driver有没有被加载下图3表明该driver被正常加载了。
2 ]+ I: V% v0 x+ j; \- W* h6 j% l" ^* y$ w- h9 l( ^
wmiacpi3.JPG
5 y; {/ M0 b+ A
3
6 E& D* F: ]/ S9 w0 G5 r% n
由图3显示与wmi相关的有两个driver:wmilib.syswmiacpi.sys,wmilib.sys是干嘛的呢?别急后续讲述wmi driver的文章会详细介绍它。既然被加载了那我们就要dump wmiacpi.syssymbol看看有哪些有用的信息,这样我们才比较容易下手J。下图4显示了wmiacpi.sys的所有symbol  n& R6 ?1 N: r
( D; g! t. F3 t
wmiacpi4.JPG

+ v* m; Q, I- b( n2 U/ u
4

. c, j4 r1 F+ T( C, U前面我们还讲到wmiacpi.sys最终会调用到acpi.sys访问asl code那我们再看一看acpi.sys有哪些symbol,下图5显示了acpi.sys的所有symbol
+ L0 |( T- E0 S- T$ Z, d  E1 H/ T! i" `6 A' S0 p8 Z
wmiacpi5.JPG

7 W2 d0 l* [3 H5 ~3 M  E' N9 ^
5
# P( i. D/ h% u$ R, a9 {% l8 H. |
经过分析上述symbol我觉得下述函数很有作案嫌疑,所以将它们秘密监控J都给设上断点,被怀疑的对象如下图6所示:; A( w  A& V2 `4 ?- |* I# p* Z
2 N7 |5 l7 t3 S2 \) H; h# c4 a
wmiacpi6.JPG

& m% L/ U8 j8 [' _( b4 a) }
6
, Q& s: [1 h' i' B% S
如图所示:
( b9 O7 \% D+ v$ k2 u6 t6 }( Q% }3 Y* Z6 T  A/ x
wmiacpi!WmiAcpiSetWmiDataItem

6 |) \" @, s2 S  i5 u: E
3 K( G" @* p  c1 Vwmiacpi!WmiAcpiSetWmiDataBlock

  s. z' b2 W3 a7 c+ P5 e8 T3 h3 t$ d: p' Z1 m& h
wmiacpi!WmiFireEvent
& k4 I, r% q1 g% s  X8 x
& s+ k- s( x( Y7 K5 c5 a
wmiacpi!WmiAcpiQueryWmiDataBlock

. W' k: N% f/ Q& t2 d- ~' j" N
& M  m' j/ ]& z4 vwmiacpi!WmiAcpiSendAsyncDownStreamIrp
3 F# @2 ?5 |; o

  r) g0 o/ b8 w, j+ r0 Lwmiacpi!WmiSystemControl
% U# s8 G4 Z# a9 U+ a
: I) h* f( d- z, ~3 `9 [8 G& S
wmiacpi!WmiAcpiSystemControlDispatch
; y# W1 l+ t+ G+ _" R3 V: L
9 _5 J/ _. k( p8 \- A' J% N2 F7 \4 y
acpi!ACPIIoctlEvalControlMethod
- O( j" C$ y" K" v7 \4 B

* o2 F; a3 l! Y/ |3 J# pacpi!ACPIIoctlAsyncEvalControlMethod
, ?5 T4 }3 z- K" k1 }

; w- K* G. Y+ facpi!ACPIIoctlAsyncEvalControlMethodEx
2 G8 I/ P! ]9 g2 u! X+ s

) l' E# K7 c7 y. k3 @$ Yacpi!ACPIIoctlEvalControlMethodEx

3 D) m: D1 H, V; c: a* ?4 T3 ]# K
" }& @/ P6 s8 a9 L, aacpi!ACPIButtonDeviceControl

9 N' h" L2 k( f: C9 k
8 I2 R2 m$ }  C, v- u7 tacpi!ACPIEcInternalControl
4 P9 F! ^6 C5 b$ q4 b" a7 B

6 B" S! x% d" @1 eacpi!AcpiEmbeddedControllerIrpDispatch

0 j% a! `' a0 O1 `7 e2 N0 n5 R$ G: O
acpi!ACPIIrpDispatchDeviceControl

+ V# @- d5 E. @$ }4 a; h; u/ N
% @" D/ S0 Q$ {- ?9 p* racpi!WmiSystemControl

8 ], X- g+ _* _7 O/ j, Z3 X6 H: W7 k. i) d$ @' a9 k
这些函数都被设置的断点,下面就我们读写一个class试试看了,图7证实了我之前的所说绝非空口无凭,我们读AcpiTest_MPackage class时发现先会call wmiacpi!WmiAcpiQueryWmiDataBlock,然后acpi!ACPIIrpDispatch DeviceControl会接手,当然后续还会有别的一些动作,但是上述行为就足以支撑我的论点了J
. H: Q% c/ [* r& U
8 J3 T4 M( U6 i- |# q2 w8 ?; D; u( P7 z* ]6 T  e

* u& Y; a2 r! U9 n1 K
wmiacpi7.JPG

( t; w4 q. E# `+ w# m
7
8 W. T6 x+ I- B  w/ |9 f
8演示了我们发一个event的状况,图中显示acpi.sys会接到该event然后透过wmiacpi!WmiFireEvent送给上层AP,上层AP再透过IRP下来qurey其它相关的具体信息。
/ K3 a" L! C; B) D* Z9 j

8 p: O" m8 S5 T2 e2 i& s( P2 t- A3 b" V3 ~7 M1 w# f' o% a5 i
wmiacpi8.JPG
& d) D' s  l) C, A
8
+ u* e5 s* V* r& ?6 ]4 o1 d4 [
以上就是我费尽九牛二虎之力挖掘的wmiacpi.sys的秘密了,再附上一幅我的debug环境J
* a3 e- Y3 F8 G+ J) K% q- @6 S

( t/ o7 [6 W6 t0 Q4 m  h! i" J+ K
wmiacpiA.JPG
( y$ u# v7 A6 A& Y+ ~
9

; ]9 X5 A& ]0 b5 K5 tThat’s all!' G8 p+ C" @* G/ |% b- ]
Peter
8 k5 Y, _; R  U+ c+ R2 M
6 J6 o9 ^; K* T/ E& Q& A[ 本帖最后由 peterhu 于 2009-5-25 09:31 编辑 ]
发表于 2009-5-22 20:27:37 | 显示全部楼层
兄弟说的很详细。
1 t" s, R1 d# ?# H* ?# d: u+ g但最终的实现是不是采用MS的那个AP3 k( l3 _* _6 z) T' \
动态生成VBS脚本,然后执行: K  x/ G+ b* r
上面Debug中那些内核函数,兄弟你不会是自己做申明吧?' x/ t( R+ O8 V9 _0 j$ n6 i
刚才骑车时仔细想了一下,觉得用那动态生成脚本是最方便的。8 Q* y4 b: b+ @+ K5 L
如果用COM来访问,我试了去调用,结果总是不能执行。
回复

使用道具 举报

 楼主| 发表于 2009-5-23 11:13:23 | 显示全部楼层
那些内核函数是微软的symbol,怎么可能是我声明的呢?
( F  `- z& |. [4 G6 C使用COM API访问绝对可以,请看这里http://blog.csdn.net/hgf1011/archive/2009/04/14/4073457.aspx  t: E! @) L8 U# i* S' d
这是我写的一个tool,使用COM访问.
回复

使用道具 举报

发表于 2009-5-24 10:39:03 | 显示全部楼层
可以了,附件为C++写的一个执行WMI的程序,可以执行ASL代码了。7 U" j9 s' |6 a( M6 @7 M! D- R  M" a8 {( D
以前不能执行是我把namespace给弄错了。& M* a  f4 p' I' }, N& w1 a
谢谢各位。

Using WMI.rar

1.08 KB, 下载次数: 1238

回复

使用道具 举报

发表于 2009-7-30 16:05:21 | 显示全部楼层
刚开始学习acpi,收藏了,谢谢!
回复

使用道具 举报

发表于 2009-8-11 11:25:53 | 显示全部楼层
看了楼主的文章,有两点实在不是很清楚,望楼主指教:
/ G; g! Y$ Z- w! {& G1  该怎么把asl文件刷到BIOS中,是否需要BIOS的源代码,还需要其他的工具么?如果没有BIOS的源代码,我是否可以用ACPISCOPE刷到BIOS里面?但是这又引出一个问题,我不知道该把这段ASL放在DSDT表格的什么地方?
3 i( ~; R! W% [/ R1 C2  我在其他的地方找到一般都是把acpimof.dll注册在HKLM\System\CurrentControlSet\Services\WmiAcpi里面,$ F' b$ k. d4 W; X( B4 w3 \- U
我在xp上试验的,我的机器里面没有WmiAcpi这一项,是否我需要自己新创建这一项,然后把它加入?
; h, n: P5 U5 b! S不好意思,我刚接触这个,很多都不是很清楚,自己在网上找了好长时间都没有搞清楚,所以只有麻烦楼主了。* M: G+ D* e4 F% K
先谢了!
回复

使用道具 举报

发表于 2009-8-11 14:10:43 | 显示全部楼层
关于第一个问题,我用iasl  device.asl编译没有通过,出现了一个错误:
; m1 C! {2 G2 s' |0 F/ ~9 `1 JError    4095 -                    ^ parse error, expecting `error' or `PARSEOP_DEFINITIONBLOCK'# Z% ~+ T& }6 p' M) }
但是这个device.asl就是DDK自带的。6 j1 |* u) S4 C9 J6 {0 L
第二个问题我直接在cmd里面执行的时候也出现了一个错误:“已加载 acpimof.dll,但没有找到DllRegisterServer输入点,无法注册这个文件。”6 o& E& P. R) T- Z
我在网上下载了一个wmiacpi.sys,请问我可以自己修改注册表,然后将这个驱动加载到系统中么?3 a' j% s% ?' ^5 L
好迷糊。。。
2 ]& X" V: I1 y/ B3 \
" Q. q6 Y7 @, J" w: D; W& P[ 本帖最后由 go_ahead 于 2009-8-11 16:48 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-8-11 22:03:52 | 显示全部楼层
to go_ahead:# y" Y% z8 |: D+ j- S" \/ I
使用DDK build wmiacpi code." W. d4 r# Z( A3 {0 k* D
asl code要包在BIOS code中,所以需要BIOS的源代碼。' i. l# t; ]4 o3 A6 n2 P! c% L2 c1 Y
沒有Wmiacpi選項就自己創建一個。
回复

使用道具 举报

发表于 2009-8-12 09:31:51 | 显示全部楼层
原帖由 peterhu 于 2009-8-11 22:03 发表 : R! g2 S4 r/ {0 K6 c4 D, u1 n
to go_ahead:
. ~0 M- r/ C8 J4 X: D  L4 V使用DDK build wmiacpi code." y/ p9 H/ c) q& R& F" G! T
asl code要包在BIOS code中,所以需要BIOS的源代碼。
% c4 O3 j& Q$ E6 ^# D8 u' F+ L8 j2 n沒有Wmiacpi選項就自己創建一個。
9 x+ P% h' ^$ Z) p& I* o! S

3 ^) ~) }) K' O! g谢谢peterhu,今天看到了注册表出现了wmiacpi项了,而且查看acpiscope看到了添加进去的内容了。
1 t7 |8 L& ?7 ~8 r. b' P! D- Y但是还是不知道该怎么把dll加入注册表, 今天我再试试也许就出来了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:57 , Processed in 0.255827 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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