驱动程序可以实现公开特定于设备的检测的 自定义块 。 例如,可以报告温度的磁盘驱动器的驱动程序可能会实现一个自定义事件块,当驱动器的温度超过安全阈值时,该事件块会通知 WMI 客户端。
若要实现自定义块,驱动程序:
在其 MOF 文件中定义类,将 MOF 文件编译为资源,并在驱动程序中包含资源,如 发布 WMI 架构中所述。
将块注册到 WMI 以及驱动程序支持的其他标准和自定义块,如 注册为 WMI 数据提供程序中所述。
处理在 Parameters.WMI.ProviderId 处指定驱动程序的设备对象指针和 Parameters.WMI.DataPath 中标准块的 GUID 的所有 WMI 请求,如处理 WMI 请求中所述。
驱动程序无法控制加载二进制 MOF 文件的顺序。 唯一的保证是在任何特定于驱动程序的 MOF 文件之前加载 wmicore.mof。 因此,自定义 WMI 类只能继承自同一 MOF 文件中或 wmicore.mof 中的任一类。
若要提高自定义 WMI 数据块的性能和易用性,请考虑以下准则:
将操作上分组在一起的数据项放在同一数据块中。
例如,i8042 端口控制器可能会维护有关键盘和鼠标端口的状态信息。 驱动程序可能为鼠标端口定义一个数据块,为键盘端口定义另一个数据块,而不是包含所有鼠标和键盘信息的单个大型数据块。
将常用数据项放在单独的数据块中,特别是当它们与不常使用的项分组时。
例如,驱动程序可能会在具有单个项的数据块中公开 CPU 使用率,因此 WMI 客户端可以跟踪 CPU 使用率,而不会产生在块中检索其他数据项的开销。 WMI 客户端无法查询单个数据项,因此要获取一项,它必须查询整个数据块实例。
使用事件块将异常事件通知 WMI 客户端,而不是作为错误日志记录的替代方法。
一次只能对有限数量的事件进行排队,如果队列已满,则事件将丢失。 此外,无法保证将事件传送到 WMI 客户端的时间安排。
将事件块的最大大小限制为 1K 字节。
事件项应定义为小型数据类型,因为对于包含生成的事件的整个WNODE_EVENT_ITEM结构,最初存在注册表定义的大小限制 (1K ) 。 对于大型通知,驱动程序可以发送 WNODE_EVENT_REFERENCE 结构,该结构指定数据块的单个实例,然后 WMI 查询该实例以获取实际事件。 但是,这会增加事件发生与通知之间的时间延迟。
将固定大小的数据项放在数据块的开头,后跟任何可变大小的数据项。
例如,具有三个 DWORD 数据项和一个可变长度字符串的数据块应先放置三个 DWORD,后跟字符串。 将固定大小的数据项放在块的开头可让 WMI 客户端更轻松地提取它们。
考虑你想要访问驱动程序的数据块的系统用户类型。 系统为所有 WMI 类 GUID 提供默认的安全描述符。 如有必要,可以在设备的 INF 文件中提供备用安全描述符。 有关详细信息,请参阅 创建安全设备安装。
WMI 不支持版本控制,因此驱动程序编写器必须定义新的 MOF 类并生成新的 GUID 来修改现有的自定义块。