以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 网友互助 』  (http://bbs.xml.org.cn/list.asp?boardid=76)
----  BIOS点滴Follow Bini系列之---WMI ACPI  (http://bbs.xml.org.cn/dispbbs.asp?boardid=76&rootid=&id=71909)


--  作者:卷积内核
--  发布时间:2/12/2009 9:16:00 AM

--  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访问。

    关于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文件.
复制内容到剪贴板
代码:

// 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
{
    [key, read]
     string InstanceName;
    [read] 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中加入代码,编好刷入。
复制内容到剪贴板
代码:

// 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、什么?死机....还要拆机!....不关我的事。

怎么样?有没有兴趣整一个acpi debugger或者写一个与BIOS通信的Application了呢?那就敢快出手吧~!


--  作者:hjx_221
--  发布时间:2/12/2009 6:47:00 PM

--  
谢谢提供!!!热情顶贴!!!!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms