使用 WmiFireEvent 发送事件

驱动程序可以调用 WmiFireEvent 来发送不使用动态实例名称的事件,以及单个基名称字符串或 PDO 的设备实例 ID 上的基本静态实例名称。

事件必须是块的单个实例,也就是说,驱动程序无法调用 WmiFireEvent 来发送由单个项或多个实例组成的事件。 若要发送此类事件,驱动程序必须调用 IoWMIWriteEvent,如使用 IoWMIWriteEvent发送事件中所述。

在 WMI 启用事件之前,驱动程序不应发送事件。 启用事件后,当事件发生的触发条件时,驱动程序:

  1. 从非分页池分配缓冲区,并将事件数据写入缓冲区。 如果事件没有数据,驱动程序可以跳过此步骤。

  2. 使用以下参数调用 WmiFireEvent

    • 指向驱动程序的设备对象的指针

    • 指向表示事件块的 GUID 的指针

    • 如果事件块有多个实例,则实例的索引

    • 如果要使用 事件发送数据,则为数据的字节数;如果没有,则为 0

    • 如果要随 事件一起发送数据,则为指向驱动程序分配的包含数据的缓冲区的指针;如果没有,则为 NULL

    驱动程序必须分配从非分页池传递到 WmiFireEvent 的所有参数,包括事件数据缓冲区。 WMI 释放驱动程序分配的内存,而无需驱动程序进一步干预。

WmiFireEvent 返回后,驱动程序将继续监视事件的触发条件,并在每次其触发条件发生时发送事件,直到 WMI 禁用该事件。