|
因看论坛一些用户问到这块,我在这里也献丑给大家“简单”介绍一下。如果能为你节省开发时间,下次碰到我记得请我吃饭。
1 c0 K+ r% B: L5 K/ ~9 U+ `% m7 X }) g: l9 Z# n
Microsoft® Windows® Management Instrumentation(WMI)是微软提供的Windows环境自动管理方案,它建立在“公共信息模型”(CIM)这个工业标准的基础上。
3 p. p" |4 K, |: a+ L1 `
7 o+ ~# G1 U2 {' V/ E+ hWBEM : WBEM(Web-Based Enterprise Management)作为一项业界倡议,起始于1996年,它规范了企业网络中受管资源的描述与使用。WBEM由以下几个组件组成:" V# r& a5 s' g/ |' m
1) CIM 公共信息模型 (CIM――Common Information Model)是一种机制,用于为受管资源建模并以受管对象格式 (MOF) 表现这些模型。使用CIM和MOF,组成受管资源或资源网络的组件可以象在面向对象设计过程中使用的组件一样被建模和看待。
7 R1 ?$ `: `" Z4 o- F) ^2) 受管对象格式 (MOF) 是源自CIM模型中的类和关联的正规描述。MOF有它独有的语法,但使用来自于DMTF中的DTD可将它转化为XML。5 F: b/ \! [; S7 S: h" W% B( R% z
3) 标准化模型是一个CIM类集合,用于表现一个特殊的管理域。模型可以表现核心CIM类、网络类、软件类和更多的类。
/ O3 q! v( j5 M0 I$ r, D/ z4) CIM对象管理器 (CIMOM) 是CIM类实例的一个数据库。CIMOM是访问管理资源的重点。
8 [1 o# H, a% W2 L5) XML API提供对数据的标准化访问并启用针对CIMOM中显示的受管资源的操作。! A; u, M/ r+ m/ s' ~
! \* l' e; F: T. N5 K, O- c各个公司提供自己对WBEM的实现,它们都必须遵循由DMTF提出的规范。所有符合WBEM的技术必须接受由DMTF发行的标准化模型并且所有关联的CIMOM都可通过标准XML API访问。MSDN上所提供的WMI架构图:) w& ^- d" D. L _
, B0 I5 _) X# D o( N9 x+ P) B
; E$ R+ |4 ]$ b b+ h2 a 关于WMI的具体资料,请在微软相关的网站查找。(官方MSDN地址:http://msdn.microsoft.com/en-us/library/aa394582.aspx )
) d j& [! T) a u! |* v% r7 g! G& P" Z: I# e' R" F
事前准备:2 P. N/ \+ T4 @
1、装好(windows 2000或以上) DDK,我用的是Windows DDK 3790.1830
# `, B7 C$ W3 \# n. e& x2、准备好你的BIOS源码,含DSDT源码。
' Y# T9 \' S5 L3 L c可选学习的准备:
; L5 D! ~. o* i1、Windows System Administration Scripting Guide - Script Repository (练习一些管理脚本的编写)
" U+ {- u9 |; r 地址:http://www.ufoit.com/bbs/thread-351-1-1.html
, m$ v6 c4 E$ o0 e2、WMI-ACPI白皮书(Windows 2000 Instrumentation: WMI and ACPI),见后面附件(Attachment)。
1 m" g) D# p7 n# b+ V- {4 G8 _ {) g% k# `7 h6 i0 L9 v4 C2 H
WMI ACPI数据处理介绍:
" W6 ]9 p% O; R" n" f. b. U1、ACPI驱动依据受管对象格式 (MOF) 所描述的对象,进行数据收集,如在ACPI BIOS内,就会访问ACPI BIOS进行数据收集。
% v& p I& p: i9 d2、上层软件既可对WMI所受管的对象进行数据访问。
2 j+ G& S d' f, ]; p; s0 L2 P# q7 p$ }
% q+ O% U. `- H, f我们要做的几个步骤:
7 I+ u) u( Y$ @2 |7 q1、编好对象格式 (MOF)文件。
3 K! _7 Y8 d8 {7 K2、用DDK编译对象格式 (MOF)文件成为资源文件之后,参照wmi acpi白皮书,进行wmi-acpi注册,以让wmi acpi driver接管。
9 i/ i; s, x% G$ |3、BIOS按wmi acpi白皮书中的方法,对应MOF文件的数据或方法进行描述。编译BIOS刷入。
- t% A# ^' Q; y2 M7 a PS: pnp0c14 is the ID assigned by Microsoft to the WMI to ACPI mapper, Name(_HID, "*pnp0c14")
. y7 R; b/ X5 ~5 x p) C4、重启,至此,在OS中可用上层软件进行与BIOS通信。大功告成!; u: j# g6 t# @- T9 @$ u
( U. R9 l" U" k) c" s k3 n9 J
分解慢动作:( _ M. @9 @( R$ {. q9 @9 g
1、分解MOF文件.- // Author: bini.Yi易祝兵 http://www.ufoit.com 2008-09-24
3 a6 ^; H2 M4 Y X9 _ - // File: demowmi.mof
9 @$ b% B& W7 j- v5 h - //{39142400-C6A3-40fa-BADB-8A2652834100}
& U: E& v, i5 d. o/ V6 R, O - //IMPLEMENT_OLECREATE(<<class>>, <<external_name>>, - a5 Q/ Z" z2 V# K/ l& ^9 q9 b
- //0x39142400, 0xc6a3, 0x40fa, 0xba, 0xdb, 0x8a, 0x26, 0x52, 0x83, 0x41, 0x00);
# [( [( u4 }1 V4 }5 f4 { a
1 K! I) c4 y5 D- [WMI,
5 K" [. i( U0 ^, b5 i( l; Z5 X - Dynamic,
1 D; ]8 V" h9 Z - Provider("WmiProv"),% t$ Z+ S$ Q% V M3 Y( R* t. B9 K5 `
- Locale("MS\\0x409"),( X- r$ m+ b' l' q
- Description("Events"),
! O) @% F! l9 l5 N" H% } - guid("{39142400-C6A3-40fa-BADB-8A2652834100}")! e* G$ q$ f$ j# ^9 U
- ]
& g# M6 O/ R9 Z( p8 x$ F {1 t - class DemoWMIData3 {+ S/ w3 Z3 ]: \( |8 v) [5 d
- {- Z- T2 M) L6 g6 y7 H! x, m
- [key, read]
1 r2 t7 \4 c, F" X- ~ - string InstanceName;2 T, C- q9 j! [) c$ c
- [read] boolean Active;
0 { j q0 q% F( }
u# q7 z l- E I! i- [WmiDataId(1),$ O# z! ~6 y! V8 z
- read, write," v' \& {6 {, I3 y
- Description("description")
5 t2 t- } V9 w* U% F( p) g - ] uint32 Data;( B. u% {. y1 z; R
- };
复制代码 2、第二步用DDK编译MOF文件分解- rem makedemo.bat ,by bini.yi for teaching.
0 M' z5 S4 M: q# a - Mofcomp -B:demowmi.bmf demowmi.mof) j2 d% H! _( P* G3 ?- S$ w# D% `
- wmimofck -tdemowmi.vbs demowmi.bmf
6 W# l6 z1 Q) t - rc demowmi.rc
: r# S+ q& l ?9 i. K S. e8 Z - Link /DEF:demowmi.DEF demowmi.res /NOENTRY /DLL /MACHINE:Ix86 /OUT:demowmi.dll
复制代码 注:用上步骤编译后会自动参生 vbs脚本,用于验证。
$ ~: ?: R# e# o6 R然后按WMI ACPI白皮书的方法加入注册表。
, x7 p' V) ^* E& a2 @) X* W* a
% h z7 F; Y% F3、第三步分解:ACPI BIOS DSDT中加入代码,编好刷入。- // Author: bini.Yi易祝兵 http://www.ufoit.com 2008-09-24
s( p- F! g0 F' p8 { - // File: demowmi.ASL
9 z! u' s2 ~6 R$ Q& T
5 t# R4 j. }; j f; ^' U3 i- Device(DWMI)
2 H) G& b' p- j- M# \9 ~: V# T - { i) _# X; R* m7 L
- // PNP0C14 is PNP ID assigned to WMI mapper
, p3 p2 X% d" k- k, O - Name(_HID, EISAID("PNP0C14"))* N+ @' J. U& x$ E, p
- Name(_UID, 0x0)
/ c5 `- M4 I4 c1 I& M2 U* J0 } - 0 I. w0 A2 X1 @+ w; t9 h3 V; m
- Name(_WDG, Buffer(){
% K6 e1 c' J6 s3 O, C' g - // {39142400-C6A3-40fa-BADB-8A2652834100}
% ?: g- V$ t1 [8 B - 0x00, 0x24, 0x14, 0x39, 0xA3, 0xC6, 0xFA, 0x40, 0xBA, 0xDB, 0x8A, 0x26, 0x52, 0x83, 0x41, 0x00, 0x30, 0x30, 0x01, 0x01, // 00 = Demo! y" ~6 s8 ]1 F4 o0 I$ ^; Y
- })0 W% k1 q: R4 v. T+ E, f' G
, W) N% W3 t6 F7 C% w, [9 M1 q- Name(DD00, 0)7 |4 q% w9 L; r! `7 \
; R3 y- m7 A% L7 G) K( I2 j/ e- Method(WQ00, 1)
9 ]2 g8 T' f4 N; S# W' H/ ~ - {
/ M, M. w! p0 n# o: J' u - //DBGS("Demo Wmi Get Function:"): ~, F; d, ]6 ~! g- L c$ e
- //DW2H(DD00)
) u% P, r5 ?! D: { [( c - //尝试一下发一些看得见摸得着的东西出来" v6 l$ e& ~! }
- Return(DD00)$ M+ Q6 H% v7 g& N( j
- }
$ e7 i! S5 X; O) k% y$ r
; k- M7 y B5 U3 m- x1 Q1 W- Method(WS00, 2)" J+ n6 D' n# s/ F; D) S
- {8 r, ?* ^5 Z& I8 _* T$ U, M
- //DBGS("Demo Wmi Set Function:")
6 J B- A% R: r8 N6 e4 t8 u) V5 K - //DW2H(ARG1)' a% E9 i' `# U" Q! R4 W8 Z
- //尝试一下发一些看得见摸得着的东西出来# m! y- E1 f3 \
- Store(ARG1, DD00)
+ X9 N, |3 Q) J& Y3 ]8 G G: d/ T1 Y6 F - }
) D' U5 x7 V" Y - }
复制代码 4、什么?死机....还要拆机!....不关我的事。
8 M1 C2 {$ J& ?8 ]" B& u; D+ J0 j8 U6 m
运行一下VBS看看,怎么样?有没有兴趣整一个acpi debugger或者写一个与BIOS通信的Application了呢?那就敢快出手吧~!. ?! H! b( c( [& }0 `6 W9 B1 p
; A8 {1 `8 [% S
最后,我自己写的两个Dll及文档,以及其它东西都在附件里。(仅对个人学习用,如用于商业行为,后果自负) |
|