[原创]BIOS知识点滴Follow Bini系列之---WMI ACPI
因看论坛一些用户问到这块,我在这里也献丑给大家“简单”介绍一下。如果能为你节省开发时间,下次碰到我记得请我吃饭。Microsoft® Windows® Management Instrumentation(WMI)是微软提供的Windows环境自动管理方案,它建立在“公共信息模型”(CIM)这个工业标准的基础上。
WBEM : WBEM(Web-Based Enterprise Management)作为一项业界倡议,起始于1996年,它规范了企业网络中受管资源的描述与使用。WBEM由以下几个组件组成:
1) CIM 公共信息模型 (CIM――Common Information Model)是一种机制,用于为受管资源建模并以受管对象格式 (MOF) 表现这些模型。使用CIM和MOF,组成受管资源或资源网络的组件可以象在面向对象设计过程中使用的组件一样被建模和看待。
2) 受管对象格式 (MOF) 是源自CIM模型中的类和关联的正规描述。MOF有它独有的语法,但使用来自于DMTF中的DTD可将它转化为XML。
3) 标准化模型是一个CIM类集合,用于表现一个特殊的管理域。模型可以表现核心CIM类、网络类、软件类和更多的类。
4) CIM对象管理器 (CIMOM) 是CIM类实例的一个数据库。CIMOM是访问管理资源的重点。
5) XML API提供对数据的标准化访问并启用针对CIMOM中显示的受管资源的操作。
各个公司提供自己对WBEM的实现,它们都必须遵循由DMTF提出的规范。所有符合WBEM的技术必须接受由DMTF发行的标准化模型并且所有关联的CIMOM都可通过标准XML API访问。MSDN上所提供的WMI架构图:
关于WMI的具体资料,请在微软相关的网站查找。(官方MSDN地址:http://msdn.microsoft.com/en-us/library/aa394582.aspx )
事前准备:
1、装好(windows 2000或以上) DDK,我用的是Windows DDK 3790.1830
2、准备好你的BIOS源码,含DSDT源码。
可选学习的准备:
1、Windows System Administration Scripting Guide - Script Repository (练习一些管理脚本的编写)
地址:http://www.ufoit.com/bbs/thread-351-1-1.html
2、WMI-ACPI白皮书(Windows 2000 Instrumentation: WMI and ACPI),见后面附件(Attachment)。
WMI ACPI数据处理介绍:
1、ACPI驱动依据受管对象格式 (MOF) 所描述的对象,进行数据收集,如在ACPI BIOS内,就会访问ACPI BIOS进行数据收集。
2、上层软件既可对WMI所受管的对象进行数据访问。
我们要做的几个步骤:
1、编好对象格式 (MOF)文件。
2、用DDK编译对象格式 (MOF)文件成为资源文件之后,参照wmi acpi白皮书,进行wmi-acpi注册,以让wmi acpi driver接管。
3、BIOS按wmi acpi白皮书中的方法,对应MOF文件的数据或方法进行描述。编译BIOS刷入。
PS: pnp0c14 is the ID assigned by Microsoft to the WMI to ACPI mapper, Name(_HID, "*pnp0c14")
4、重启,至此,在OS中可用上层软件进行与BIOS通信。大功告成!
分解慢动作:
1、分解MOF文件.// Author: bini.Yi易祝兵 http://www.ufoit.com 2008-09-24
// File: demowmi.mof
//{39142400-C6A3-40fa-BADB-8A2652834100}
//IMPLEMENT_OLECREATE(<<class>>, <<external_name>>,
//0x39142400, 0xc6a3, 0x40fa, 0xba, 0xdb, 0x8a, 0x26, 0x52, 0x83, 0x41, 0x00);
[WMI,
Dynamic,
Provider("WmiProv"),
Locale("MS\\0x409"),
Description("Events"),
guid("{39142400-C6A3-40fa-BADB-8A2652834100}")
]
class DemoWMIData
{
string InstanceName;
boolean Active;
[WmiDataId(1),
read, write,
Description("description")
] uint32 Data;
};2、第二步用DDK编译MOF文件分解rem makedemo.bat ,by bini.yi for teaching.
Mofcomp -B:demowmi.bmf demowmi.mof
wmimofck -tdemowmi.vbs demowmi.bmf
rc demowmi.rc
Link /DEF:demowmi.DEF demowmi.res /NOENTRY /DLL /MACHINE:Ix86 /OUT:demowmi.dll注:用上步骤编译后会自动参生 vbs脚本,用于验证。
然后按WMI ACPI白皮书的方法加入注册表。
3、第三步分解:ACPI BIOS DSDT中加入代码,编好刷入。// Author: bini.Yi易祝兵 http://www.ufoit.com 2008-09-24
// File: demowmi.ASL
Device(DWMI)
{
// PNP0C14 is PNP ID assigned to WMI mapper
Name(_HID, EISAID("PNP0C14"))
Name(_UID, 0x0)
Name(_WDG, Buffer(){
// {39142400-C6A3-40fa-BADB-8A2652834100}
0x00, 0x24, 0x14, 0x39, 0xA3, 0xC6, 0xFA, 0x40, 0xBA, 0xDB, 0x8A, 0x26, 0x52, 0x83, 0x41, 0x00, 0x30, 0x30, 0x01, 0x01, // 00 = Demo
})
Name(DD00, 0)
Method(WQ00, 1)
{
//DBGS("Demo Wmi Get Function:")
//DW2H(DD00)
//尝试一下发一些看得见摸得着的东西出来
Return(DD00)
}
Method(WS00, 2)
{
//DBGS("Demo Wmi Set Function:")
//DW2H(ARG1)
//尝试一下发一些看得见摸得着的东西出来
Store(ARG1, DD00)
}
}4、什么?死机....还要拆机!....不关我的事。:o
运行一下VBS看看,怎么样?有没有兴趣整一个acpi debugger或者写一个与BIOS通信的Application了呢?那就敢快出手吧~!
最后,我自己写的两个Dll及文档,以及其它东西都在附件里。(仅对个人学习用,如用于商业行为,后果自负) 呵呵,又有更新了赶紧学习!@!!:victory: 太强了,顶你!:lol
我们家的上层AP使用上述架构。 各位, 别放过了, 值得研究!
国内第一台笔记本的 Controll Application 就是这只狼搞的, 用的就是这个! 可不是像网上的那些写的空洞的理论的, 这可是他的心得和实践啊! 非常难得啊!!
学习~ 这样的话,只有BIOS的SourceCode和编译环境才能验证,是吧?
我们最近也想搞一个类似的东西,方向不是太明确。
不知道楼主这个方法是不是通过WMIACPI.sys来实现的?是的话,XP下是怎么做的,因为XP默认是没有WMIACPI.sys的。
[ 本帖最后由 wki 于 2009-1-12 22:19 编辑 ] 不好意思,刚接触这方面的知识,现在知道了,似乎是一旦在BIOS中加入ASL,系统会自己加载WMIACPI.sys,具体还是需要验证。。。 很感谢!需要好好学习 bini我有一个疑问。用你的这种方法,能不能访问除了Device(DWMI)之外的device. 学习了~~~~~~~~~~~~~~~
有借鉴价值,谢谢
很有借鉴价值,谢谢楼主! 请教!我在用隐藏分区恢复系统的时候提示 WMI ACPI is not surpport这是什么意思呀?我的电脑是宏碁的笔记本 感恩啦^^好工具激發學習原動力^^ rttt
[ 本帖最后由 frank 于 2010-8-19 11:22 编辑 ] 运行makedemo.bat出现问题,少了个demowmi.rc 看不太懂,努力学习 很不错,经过努力学习,已经利用DemoWmi 实践Ok,谢谢
同时 也用WDK 6000中的src\ WMI \ wmiacpi 中的sample code 实践成功
不过仍然对于MOF注册有点疑问:
我一直使用的是 修改注册表的方式 (因为是在实验阶段)
如果我要写App 用在量产阶段,那应该要用一个Special GUID 把MOF dataEmbeded intoASL 。
现在有一点不确定的是:这里的MOF data 是指的是用 MOF source build 出来的BSF file 吗?
还有,如果是BSF file 是不是Copy 过去ASL中就可以了?
白皮书Sample 里建立的BufferSize 为 926 ,我的BSF file Size 是 2.15K ,是不是要建立一个 Buffer 为 2150?
希望大家不吝赐教,谢谢啦
[ 本帖最后由 蓝色永恒 于 2011-3-11 10:24 编辑 ] sample code简单易懂
页:
[1]