IRP_MN_DISABLE_COLLECTION
将其一个或多个数据块注册为收集成本高昂的任何 WMI 驱动程序都必须处理此 IRP。 驱动程序可以通过调用 WmiSystemControl 或通过处理 IRP 本身来处理 WMI IRP,如 处理 WMI 请求中所述。
如果驱动程序调用 WmiSystemControl 来处理 IRP_MN_DISABLE_COLLECTION 请求,则 WMI 又调用该驱动程序的 DpWmiFunctionControl 例程。
主代码
发送时
WMI 发送此 IRP,请求驱动程序停止为驱动程序注册为收集成本高昂且已启用数据收集的数据块的累积数据。
WMI 在 IRQL = PASSIVE_LEVEL任意线程上下文中发送此 IRP。
输入参数
Parameters.WMI.ProviderId 指向应响应请求的驱动程序的设备对象。 此指针位于 IRP 中驱动程序的 I/O 堆栈位置。
Parameters.WMI.DataPath 指向标识应停止数据积累的数据块的 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
驱动程序通过在驱动程序在注册或更新数据块时传递给 WMI 的 WMIREGGUID 或 WMIGUIDREGINFO 结构的 Flags 成员中设置WMIREG_FLAG_EXPENSIVE,将数据块注册为收集成本高昂的数据块。 驱动程序在收到启用集合的显式请求之前,无需为此类块累积数据。
如果驱动程序通过调用 WmiSystemControl 处理 WMI IRP,该例程将调用驱动程序的 DpWmiFunctionControl 例程,如果驱动程序未定义例程,则返回STATUS_SUCCESS。
如果驱动程序处理 IRP_MN_DISABLE_COLLECTION 请求本身,则仅当 Parameters.WMI.ProviderId 指向与驱动程序传递给 IoWMIRegistrationControl 的指针相同的设备对象时,它才应这样做。 否则,驱动程序必须将请求转发到下一个较低的驱动程序。
在处理请求之前,驱动程序必须确定 Parameters.WMI.DataPath 是否指向驱动程序支持的 GUID。 否则,驱动程序必须使 IRP 失败并返回STATUS_WMI_GUID_NOT_FOUND。 如果数据块有效但未向 WMIREG_FLAG_EXPENSIVE 注册,则驱动程序可以返回STATUS_SUCCESS,而不采取进一步操作。
驱动程序无需检查数据收集是否已禁用,因为 WMI 在最后一个数据使用者禁用该块的收集时向数据块发送单个禁用请求。 在没有启用干预请求的情况下,WMI 不会发送另一个禁用请求。
要求
标头 |
Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h) |