发送 WMI 事件
驱动程序可以使用 WMI 事件向用户模式应用程序通知事件,而无需应用程序轮询或发送 IRP。 驱动程序应使用 WMI 事件来通知 WMI 客户端异常情况,而不是作为错误日志记录的替代方法。 驱动程序应支持在 Wmicore.mof 中为其设备类型定义的任何标准事件块,并且可能定义和注册其他自定义事件块以支持特定于设备的通知。
事件块只是派生自抽象基类 WMIEvent 的数据块。 事件块可以包含与数据块相同的任何数据,也可以为空,也就是说,事件块不需要包含任何驱动程序定义的数据项。 如果事件块确实包含数据,则 WNODE_XXX 加上数据的总大小不应超过注册表定义的 1 KB 限制。 通常,较小的事件可提高系统性能和更及时的通知。 有关定义块的信息,请参阅 WMI 数据和事件块的 MOF 语法 和 设计 WMI 数据和事件块。
驱动程序通过将相应的事件块注册到块的 WMIREGGUID 结构中设置WMIREG_FLAG_EVENT_ONLY_GUID来指示对事件的支持。 有关注册块的信息,请参阅 注册为 WMI 数据提供程序。
当 WMI 客户端用户请求事件通知时,WMI 会向驱动程序发送 IRP_MN_ENABLE_EVENTS 请求,以提醒驱动程序开始监视事件的驱动程序确定的触发条件。 然后,当触发条件发生时,驱动程序会将事件发送到 WMI,WMI 会将事件传递给已注册该事件的所有数据使用者。
驱动程序通过以下方式之一将事件发送到 WMI:
调用内核模式 WMI 库例程 WmiFireEvent。 驱动程序可以调用 WmiFireEvent 以仅发送不使用动态实例名称的事件,并将静态实例名称基于单个基名称字符串或 PDO 的设备实例 ID。 此外,事件必须是单个实例,也就是说,驱动程序无法调用 WmiFireEvent 来发送由单个项或多个实例组成的事件。 有关详细信息,请参阅 使用 WmiFireEvent 发送事件。
使用指向驱动程序分配并初始化的包含事件数据的WNODE_XXX 结构的指针调用内核模式例程 IoWMIWriteEvent。 有关详细信息,请参阅 使用 IoWMIWriteEvent 发送事件。