当前位置: 首页 > news >正文

WMI接口设计实现

WMI是Windows操作系统管理数据和操作的基础设施,系统管理员可以使用VB Script、PowerShell及Windows API(C++、C#等)管理本地或远程计算机。
使用WMI框架应用程序可以直接访问EC RAM、 I/O端口、Memory地址、寄存器、Setup NV设定值,以及其他的系统设备资源。

一、Asl code设计

OemWMIDemo.asl

Scope(\_SB)
{Device(AMW1)//WMI{// pnp0c14 is Plug and Play ID assigned to WMI mapperName(_HID, "PNP0C14")Name(_UID, "WMIDEMO")    // Description of data and events supportedName(_WDG, Buffer() {//// Event// GUID 93B56635-6D54-42D7-BB7D-DF77D452CCE4// BIOS can generator WMI event by Notify (<<WMI device name>>, 0xAC)//0x35, 0x66, 0xB5, 0x93, 0x54, 0x6D, 0xD7, 0x42, 0xBB, 0x7D, 0xDF, 0x77, 0xD4, 0x52, 0xCC, 0xE4,     // GUID0xAC, 0,       // Event Notification ID1,             // Instance Count0x08,          // Flags (WMIACPI_REGFLAG_EVENT)//// Method// GUID ABBC0FB8-8EA1-11D1-A000-C90629100000//0xB8, 0x0F, 0xBC, 0xAB, 0xA1, 0x8E, 0xD1, 0x11, 0xA0, 0x00, 0xC9, 0x06, 0x29, 0x10, 0, 0,0x44, 0x45,    // Object Id (DE)1,             // Instance Count0x02,          // Flags (WMIACPI_REGFLAG_METHOD)//// This GUID for returning the MOF data// 05901221-D566-11D1-B2F0-00A0C90629100x21, 0x12, 0x90, 0x05, 0x66, 0xd5, 0xd1, 0x11, 0xb2, 0xf0, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10,66, 68,        // Object ID (BD)1,             // Instance Count0x00,          // Flags(none)})Name(FEAC, Buffer(0x04){0x00, 0x00, 0x00, 0x00})Method (EVAC, 0){  Return (FEAC)               } // End of Method EVAC//// EcRAM Method data block// Arg0 has the instance being queried// Arg1 has the method id// Arg2 has the data passedMethod(WMDE, 3){//MethodId 1if(LEqual(Arg1, 1)){Store(Arg2, FEAC)Notify(AMW1, 0xAC)Return(0)}}// More info about an event// Arg0 is the event id that was firedMethod(_WED, 1, NotSerialized){If(LEqual(Arg0, 0xAC)){Return(EVAC())}}// -------- Compiled version of "Associated MOF File" below --------// Memo: generated by mofcomp.exeName(WQBD, Buffer(){})}
}//end scope _SB

其中Mof GUID(0x21, 0x12, 0x90, 0x05, 0x66, 0xd5, 0xd1, 0x11, 0xb2, 0xf0, 0x00, 0xa0, 0xc9, 0x06, 0x29, 0x10)为固定值。

二、Mof code设计

OemWMIDemo.mof

[WMI, Dynamic, provider("WMIProv"),locale("MS\\0x409"), GUID("{ABBC0FB8-8EA1-11D1-A000-C90629100000}"), Description("Call BIOS Function through WMI")
]
class WmiDemo
{[key, read] string InstanceName;[read] Boolean Active;[WmiMethodId(1), Implemented, read, write, Description("My method 1")] void MyMethod1([inout, Description("My method 1")] uint32 Data);};[WMI, Dynamic, provider("WMIProv"),locale("MS\\0x409"), GUID("{93B56635-6D54-42D7-BB7D-DF77D452CCE4}"), Description("Event generated when machine is hit") 
]
class DemoWmiEvent : WMIEvent
{[key, read] string InstanceName;[read] Boolean Active;[WmiDataId(1),read, write,Description("Force with which the machine was hit")] uint32 Force;
};

三、编译Mof文件

工具:
mofcomp.exe为系统自带
wmimofck.exe可以从Windows WDK拷贝

将mof文件编译成bmf二进制文件

D:\WMI_Demo>mofcomp.exe -B:OemWMIDemo.bmf OemWMIDemo.mof
分析 MOF 文件: OemWMIDemo.mof
已成功分析 MOF 文件
将二进制 MOF 数据存储在 OemWMIDemo.bmf 中Binary mof file OemWMIDemo.bmf expanded to 3126 bytes

使用wmimofck.exe可生成VBS脚本

D:\WMI_Demo>wmimofck.exe -tOemWMIDemo.vbs OemWMIDemo.bmf
Microsoft (R) WDM Extensions To WMI MOF Checking Utility  Version 1.50.0000
Copyright (c) Microsoft Corp. 1997-2000. All rights reserved.Binary mof file OemWMIDemo.bmf expanded to 3126 bytes

使用wmimofck.exe将bmf二进制文件转成文本

D:\WMI_Demo>wmimofck.exe -x"WIMDemo.txt" OemWMIDemo.bmf
Microsoft (R) WDM Extensions To WMI MOF Checking Utility  Version 1.50.0000
Copyright (c) Microsoft Corp. 1997-2000. All rights reserved.

将文本中的内容填入asl文件中Name(WQBD, Buffer() { })的Buffer里。
在这里插入图片描述

四、测试

使用WMICodeCreator.exe工具进行测试。可支持生成VBScript, C#, and VB .NET代码。
管理员身份打开WMICodeCreator.exe。

  1. 首先设置event,并执行
    在VBS脚本中,添加Wscript.Echo objReceivedEvent.Force语句可输出Event的返回值
    请添加图片描述

  2. 设置Method,并执行
    注意instance要出来,并且选中,如果没出来可能是GUID没填对,没选中的话执行会报错。
    请添加图片描述

参考
创建一个WMI ACPI device
基于Windows Management Instrumentation(WMI)的BIOS接口设计

http://www.lryc.cn/news/323577.html

相关文章:

  • 前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】
  • OpenCV 介绍使用
  • Python 10个面试题实例
  • Python:熟悉简单的skfuzzy构建接近生活事件的模糊控制器”(附带详细注释说明)+ 测试结果
  • opencv函数使用查找
  • 使用 pypdf 快速切分 PDF 文件
  • Avalonia(11.0.2)+.NET6 打包运行到银河麒麟V10桌面系统
  • Mac nvm install failed python: not found
  • C语言基础知识复习(考研)
  • Prometheus Grafana 配置仪表板
  • docker 哲学 - 网络桥接器、容器网络接口 、容器间的通信方式
  • Python 将HTML转为PDF、图片、XML、XPS格式
  • 排序算法记录(冒泡+快排+归并)
  • 简单聊聊如何更优雅地初始化对象:构造函数、Builder模式和静态工厂方法比较
  • 跳过mysql权限验证来修改密码-GPT纯享版
  • Vue3快速上手(十七)Vue3之状态管理Pinia
  • 时序预测 | Matlab实现BiTCN-GRU双向时间卷积神经网络结合门控循环单元时间序列预测
  • 学习笔记Day14:Linux下软件安装
  • 【CXL协议-事务层之CXL.io(3)】
  • 如何自己构建 Ollama 模型
  • 5.84 BCC工具之tcpretrans.py解读
  • 从0到1实现RPC | 03 重载方法和参数类型转换
  • Matlab之已知2点绘制长度可定义的射线
  • 虚拟机安装Linux系统,FinalShell远程连接Linux
  • MacOS Xcode 使用LLDB调试Qt的 QString
  • C/C++代码性能优化——编程实践
  • JVM—内存可见性
  • VScode手动安装vsix格式插件,提示安装插件与code版本不兼容问题
  • K8S Storage
  • Day54-nginx限速-访问日志-错误日志精讲