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

[原创]WMIACPI.SYS

[复制链接]
发表于 2009-5-22 17:14:23 | 显示全部楼层 |阅读模式
WMIACPI.SYS

# K; W% N- r* q. a; A0 \; E0 {, S1. WMI Concept* r, O( T% B2 _  X
0 r' @7 S; D& t: u9 z8 A
WMI全称Windows Management Instrumentation是一种管理计算机系统的方式。它是微软基于WBEM的实现,WMI希望为系统管理以及分布式数据描述提供一种模型,并且允许使用基于COMuser mode API对系统部件进行访问、管理、控制。: y+ ]4 V; N) E4 h
/ b# m4 U- S, T0 b5 A/ _

; [) V: v0 A: |6 _( ~5 N2. WMIACPI.SYS% N# [8 [( h6 X6 r
) W  Q- |0 w- F
Wmiacpi.sys 是微软提供的一只generic mapping driver它的Plug and Play ID PNP0c14.ACPI包含丰富的系统信息,OEM厂商可以利用这支mapping driver定制平台相关的功能而且允许使用WMI获取,如此便可以在单机或者在网络环境中获得平台的特定信息。关于如何在BIOSOS中定制wmiacpibini已经给出了非常详细的讲解,有兴趣可以参考
bini的文章。在这里我会讲解一下原理部分。ACPI-to-WMI mapping function是通过下述两只driver达成的:$ [  {" N% E  t  C
A.Acpi.sys! x5 l+ h. a- N& {
B.Wmiacpi.sys. n; t2 Z& o8 L8 D2 f
A).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获得。7 D$ }1 l1 A& m" }. U5 I9 _& O
B).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 Architecture
' I* [% }  s8 p& ]( }) i0 k4 j5 C, c  h% w' i

, k! n/ Q1 a+ c% D' k wmiacpi1.JPG : j' I# q: T, r. A0 Z" S1 x
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再返回具体信息然后逐级回送。( N2 l: A, G, h& y1 w
2 F+ Y: _9 N0 f4 N) G2 E
3. Under the hood7 d# v/ M  h) R& B
1 x: X8 u* b& W4 v# t$ q, v
前面都是原理的介绍,讲的我都快吐血了J,实践是检验理论的唯一标准。说不如做,随我揭开内幕一探究竟。WDK ver6000 src带了一个wmiacpisamplecodebuild之后会生成一只acpimof.dll,在BIOS里面将device.asl
包进去然后再注册表中加入acpimof.dll的信息然后重启。讲到这里还要提到一个验证wmi的好工具叫做WMICodeCreator.exe微软的网站上有下载,下面我们就使用该tool验证前面的说法,下图2演示了我们定制wmiacpi之后的状况:
8 m9 G' f# ?& @! X+ O" k6 d/ W0 H1 W- e$ _

0 t% j* C5 ~: u5 ?" p: [0 b6 x# j
wmiacpi2.JPG
9 ~0 R, a& h/ e" Y; H
2
+ v6 M% F% d. |0 g! l' l
2红色方框标注的AcpiTest_**就是我们定制的WMI class。也就是OS Load wmiacpi.sys之后将其MOF档案解析出来并加入到WMI repository于是我们就看到了上图的信息。下面我们来跟踪一下访问具体的class的情况吧,祭出WinDbglet’s go!首先查看一下wmiacpi.sys这支driver有没有被加载下图3表明该driver被正常加载了。
% S9 P- f% o* w. ?
- o" T6 Q% F* e3 w7 }0 [9 e+ @0 s
wmiacpi3.JPG

4 \' @8 I% R% L# ~6 H1 P
3

: {$ U: c' I+ y由图3显示与wmi相关的有两个driver:wmilib.syswmiacpi.sys,wmilib.sys是干嘛的呢?别急后续讲述wmi driver的文章会详细介绍它。既然被加载了那我们就要dump wmiacpi.syssymbol看看有哪些有用的信息,这样我们才比较容易下手J。下图4显示了wmiacpi.sys的所有symbol
3 B4 ~* s2 R  h4 K/ F4 k6 \* `7 k/ \: n4 R3 p
wmiacpi4.JPG
9 z1 V3 |6 b4 c
4
; J) H2 _# A. I# @
前面我们还讲到wmiacpi.sys最终会调用到acpi.sys访问asl code那我们再看一看acpi.sys有哪些symbol,下图5显示了acpi.sys的所有symbol
1 x+ P# E' f6 r
% A- Y& n0 b9 l
wmiacpi5.JPG
* f/ g& u. M) s$ B
5

* Z. i* q9 r7 e# R' J3 ?经过分析上述symbol我觉得下述函数很有作案嫌疑,所以将它们秘密监控J都给设上断点,被怀疑的对象如下图6所示:3 i9 c" [2 l7 C/ @! i% w% I
' h+ H8 l( W3 D( C! p0 Z
wmiacpi6.JPG

! }* q& r8 E4 `" e) ?/ b2 K2 c# V
6

  ?6 u* m2 G3 ~, e; ^9 |" E如图所示:
! [( n  H, o: z: \
* V8 P& B7 e. S* N5 Z# |wmiacpi!WmiAcpiSetWmiDataItem

$ _; Y# M. I8 q8 t) ?
: G% H4 ^) R9 ^0 ?' h5 xwmiacpi!WmiAcpiSetWmiDataBlock

" [$ n% P; H5 A7 `+ V: {
4 c7 R" e+ H6 y; F! Bwmiacpi!WmiFireEvent
6 m! T5 A' {0 ]! m$ E$ L( e
  P% G, v8 c+ b& @
wmiacpi!WmiAcpiQueryWmiDataBlock

' r7 d" D- ^$ F7 A; I7 M7 |0 P' C, J) n5 [& [* l
wmiacpi!WmiAcpiSendAsyncDownStreamIrp
; ~& M8 U* K7 U* B
! ~) e- s2 r, z8 i# k* X& G- @
wmiacpi!WmiSystemControl

& u! Z4 R! I6 V  ?- Y- @( W7 a
) k  ]5 K% ?) ?2 [wmiacpi!WmiAcpiSystemControlDispatch

; W6 d$ q5 F7 e* p# o  a- O2 v( u' d, N9 P5 B8 X. E( L
acpi!ACPIIoctlEvalControlMethod

. F- s9 C# f6 `. ~0 U* F# `; \% n# U9 G5 L9 ?" ]: v
acpi!ACPIIoctlAsyncEvalControlMethod
) z/ y/ W" H" I  _( n9 r& t/ Z8 s

0 v8 N6 f) N, F. Kacpi!ACPIIoctlAsyncEvalControlMethodEx
  q$ C- P$ u7 o3 U
$ n8 e1 n' P& T
acpi!ACPIIoctlEvalControlMethodEx

5 v; r! R5 ^) D2 K2 |; q$ ^3 E! Q$ R/ u( K3 p& B. x" u  F
acpi!ACPIButtonDeviceControl

+ C% i+ I5 d. ?  \0 U: w- Y! ?$ Y- [' g: P' m9 w
acpi!ACPIEcInternalControl

% e2 D; z2 X$ G) j1 ^9 Z6 \6 z: s3 ^2 \, b1 Y9 H/ ?
acpi!AcpiEmbeddedControllerIrpDispatch
( i1 s, h  V1 H9 [: m3 {: U
4 c  `6 W% V: P. m9 ]+ o, g
acpi!ACPIIrpDispatchDeviceControl

" ^) b! V, u) q9 ]* @. k1 r$ S& b* _/ H6 v; e& f  N0 A
acpi!WmiSystemControl

) n8 D& ]( g9 ~- U& g, D9 y
+ X1 J% Q8 r/ p5 J4 y( F; r这些函数都被设置的断点,下面就我们读写一个class试试看了,图7证实了我之前的所说绝非空口无凭,我们读AcpiTest_MPackage class时发现先会call wmiacpi!WmiAcpiQueryWmiDataBlock,然后acpi!ACPIIrpDispatch DeviceControl会接手,当然后续还会有别的一些动作,但是上述行为就足以支撑我的论点了J
( @' L  @6 D  b$ G; J5 u8 J7 ~% y: u/ ^6 a
! ?# _* w/ P, d, z

, \2 R0 K, c7 k5 }3 z" |$ A# u
wmiacpi7.JPG
' J6 T/ ^5 z" o' t8 K' ?( C2 ^
7
  p7 ]' ^; B6 y/ W
8演示了我们发一个event的状况,图中显示acpi.sys会接到该event然后透过wmiacpi!WmiFireEvent送给上层AP,上层AP再透过IRP下来qurey其它相关的具体信息。3 W" K7 M$ K9 k3 \- D( W+ z" O
9 H6 S8 M' W" X4 Z' n( t  ^

( r& u7 A  v) f1 z: d4 Y
wmiacpi8.JPG

1 q3 Z% l5 F/ o8 d* H
8

2 R+ E) @% k# V/ o- d以上就是我费尽九牛二虎之力挖掘的wmiacpi.sys的秘密了,再附上一幅我的debug环境J" r3 z6 `) w' [# z8 ?

8 O# K3 g* n- d% H- s0 r6 I" l8 r* G1 c) i+ u4 ?" F2 L
wmiacpiA.JPG

  r4 g: @. v9 h/ N- M# y# I* g5 k
9
, N/ i3 C+ s9 P, x
That’s all!9 Q+ @- z; s8 N/ C' n: R
Peter $ d" i4 C* s4 O; D1 O
1 T$ v5 D8 Z! I  Y- Q7 u. c
[ 本帖最后由 peterhu 于 2009-5-25 09:31 编辑 ]
发表于 2009-5-22 20:27:37 | 显示全部楼层
兄弟说的很详细。
' ?6 O7 P5 W* r5 x' p0 C2 |但最终的实现是不是采用MS的那个AP6 f; H$ u8 E8 R  @7 W
动态生成VBS脚本,然后执行
+ Q+ Q  d8 c6 A. r* ^9 r上面Debug中那些内核函数,兄弟你不会是自己做申明吧?
- \8 u; I2 k) G; [+ F0 l) d刚才骑车时仔细想了一下,觉得用那动态生成脚本是最方便的。
- w2 s- v5 J1 d/ t' h0 F如果用COM来访问,我试了去调用,结果总是不能执行。
回复

使用道具 举报

 楼主| 发表于 2009-5-23 11:13:23 | 显示全部楼层
那些内核函数是微软的symbol,怎么可能是我声明的呢? 8 Q* p7 L0 H, m, X
使用COM API访问绝对可以,请看这里http://blog.csdn.net/hgf1011/archive/2009/04/14/4073457.aspx7 l( F; J9 |9 C. a- ~, x& i" [
这是我写的一个tool,使用COM访问.
回复

使用道具 举报

发表于 2009-5-24 10:39:03 | 显示全部楼层
可以了,附件为C++写的一个执行WMI的程序,可以执行ASL代码了。
) k6 K; u+ A. O6 z以前不能执行是我把namespace给弄错了。; |: e- G6 y, I% x9 z. U4 }
谢谢各位。

Using WMI.rar

1.08 KB, 下载次数: 1323

回复

使用道具 举报

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

使用道具 举报

发表于 2009-8-11 11:25:53 | 显示全部楼层
看了楼主的文章,有两点实在不是很清楚,望楼主指教:
" h! O0 a/ \% d# ?4 R1  该怎么把asl文件刷到BIOS中,是否需要BIOS的源代码,还需要其他的工具么?如果没有BIOS的源代码,我是否可以用ACPISCOPE刷到BIOS里面?但是这又引出一个问题,我不知道该把这段ASL放在DSDT表格的什么地方?: \; \5 C& Z* D2 p* L
2  我在其他的地方找到一般都是把acpimof.dll注册在HKLM\System\CurrentControlSet\Services\WmiAcpi里面,
3 }5 X  g# V' z; m3 I我在xp上试验的,我的机器里面没有WmiAcpi这一项,是否我需要自己新创建这一项,然后把它加入?
' W4 [1 \3 X' w6 L% _7 v& U! s不好意思,我刚接触这个,很多都不是很清楚,自己在网上找了好长时间都没有搞清楚,所以只有麻烦楼主了。
% Z  E. Y+ K9 h$ F先谢了!
回复

使用道具 举报

发表于 2009-8-11 14:10:43 | 显示全部楼层
关于第一个问题,我用iasl  device.asl编译没有通过,出现了一个错误:
& o, E3 V, W2 S' h2 d; K( G& }! eError    4095 -                    ^ parse error, expecting `error' or `PARSEOP_DEFINITIONBLOCK'
: ~8 n' }6 G3 q& Y6 E5 h. S但是这个device.asl就是DDK自带的。
6 O7 j; L+ w$ C第二个问题我直接在cmd里面执行的时候也出现了一个错误:“已加载 acpimof.dll,但没有找到DllRegisterServer输入点,无法注册这个文件。”
9 Z3 y1 a$ ]1 q. r' ?' s- g我在网上下载了一个wmiacpi.sys,请问我可以自己修改注册表,然后将这个驱动加载到系统中么?
  \- W/ n0 F' _% V, v好迷糊。。。( G& o# @( a7 {- u, k
1 j0 T' y2 Y# ?9 p1 u
[ 本帖最后由 go_ahead 于 2009-8-11 16:48 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-8-11 22:03:52 | 显示全部楼层
to go_ahead:; a$ D3 x6 E: U2 N3 z4 Z
使用DDK build wmiacpi code.& V( U& @7 d; V0 T  y  n) q  h
asl code要包在BIOS code中,所以需要BIOS的源代碼。. M2 b9 u2 l9 t6 q  H  X  u
沒有Wmiacpi選項就自己創建一個。
回复

使用道具 举报

发表于 2009-8-12 09:31:51 | 显示全部楼层
原帖由 peterhu 于 2009-8-11 22:03 发表
7 W' Z$ B$ H" ^to go_ahead:1 O8 R7 I* n/ m( U5 W4 }: K' S* a5 y
使用DDK build wmiacpi code.+ k/ L! q( d# J, B0 ^7 C
asl code要包在BIOS code中,所以需要BIOS的源代碼。$ G+ B- u# Q% Y- u- h2 J! q# k5 w
沒有Wmiacpi選項就自己創建一個。
8 H! s4 w0 l  y* k

1 q% N& B9 }$ }! y9 Y谢谢peterhu,今天看到了注册表出现了wmiacpi项了,而且查看acpiscope看到了添加进去的内容了。  ?. v  ]. y7 ]& I
但是还是不知道该怎么把dll加入注册表, 今天我再试试也许就出来了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 17:49 , Processed in 0.368028 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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