IRP_MN_ENABLE_EVENTS
注册一个或多个事件块的任何 WMI 驱动程序都必须处理此 IRP。 驱动程序可以通过调用 WmiSystemControl 或通过处理 IRP 本身来处理 WMI IRP,如 处理 WMI 请求中所述。
如果驱动程序调用 WmiSystemControl 来处理 IRP_MN_ENABLE_EVENTS 请求,则 WMI 又调用该驱动程序的 DpWmiFunctionControl 例程。
主代码
发送时
WMI 发送此 IRP 以通知驱动程序数据使用者已请求事件的通知。
WMI 在 IRQL = PASSIVE_LEVEL任意线程上下文中发送此 IRP。
输入参数
Parameters.WMI.ProviderId 指向应响应请求的驱动程序的设备对象。 此指针位于 IRP 中驱动程序的 I/O 堆栈位置。
Parameters.WMI.DataPath 指向标识要启用的事件块的 GUID。
Parameters.WMI.BufferSize 指示 Parameters.WMI.Buffer 中非分页缓冲区的大小,该 缓冲区 的大小必须大于或等于 (WNODE_HEADER) 。 未注册跟踪块的驱动程序 (WMIREG_FLAG_TRACED_GUID) 可以忽略此参数。
Parameters.WMI.Buffer 指向一个 WNODE_HEADER ,该WNODE_HEADER指示是否应 (WMI_FLAGS_TRACED_GUID) 跟踪事件,并为系统记录器提供句柄。 未注册跟踪块的驱动程序 (WMIREG_FLAG_TRACED_GUID) 可以忽略此参数。
输出参数
无。
I/O 状态块
如果驱动程序通过调用 WmiSystemControl 处理 IRP,则 WMI 在 I/O 状态块中设置 Irp-IoStatus.Status> 和 Irp-IoStatus.Information>。
否则,驱动程序会将 Irp-IoStatus.Status> 设置为STATUS_SUCCESS或相应的错误状态,如下所示:
STATUS_WMI_GUID_NOT_FOUND
STATUS_INVALID_DEVICE_REQUEST
成功后,驱动程序会将 Irp-IoStatus.Information> 设置为零。
Operation
驱动程序可以通过调用 WmiSystemControl 或通过处理 IRP 本身来处理 WMI IRP,如 处理 WMI 请求中所述。
如果驱动程序通过调用 WmiSystemControl 处理 WMI IRP,该例程将调用驱动程序的 DpWmiFunctionControl 例程,如果驱动程序未定义例程,则返回STATUS_SUCCESS。
如果驱动程序处理 IRP_MN_ENABLE_EVENTS 请求本身,则仅当 Parameters.WMI.ProviderId 指向与驱动程序传递到 IoWMIRegistrationControl 的指针相同的设备对象时,它才应这样做。 否则,驱动程序必须将请求转发到下一个较低的驱动程序。
在驱动程序处理请求之前,它应确定 Parameters.WMI.DataPath 是否指向驱动程序支持的 GUID。 否则,驱动程序必须使 IRP 失败并返回STATUS_WMI_GUID_NOT_FOUND。
如果驱动程序支持事件块,它将为该数据块的所有实例启用 事件。
驱动程序无需检查事件块是否已启用事件,因为 WMI 在第一个数据使用者启用事件时发送单个请求来为事件块启用事件块。 在没有干预禁用请求的情况下,WMI 不会发送另一个启用请求。
注册跟踪块的驱动程序 (WMIREG_FLAG_TRACED_GUID) 还必须确定是将事件发送到 WMI 还是发送到系统记录器进行跟踪。 如果请求跟踪, Parameters.WMI.Buffer 会指向 一个WNODE_HEADER 结构,其中使用 WNODE_FLAG_TRACED_GUID 设置 标志 , 而 HistoricalContext 包含记录器的句柄。
有关定义事件块、发送事件和跟踪的详细信息,请参阅 Windows Management Instrumentation。
要求
标头 |
Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h) |