IRP_MN_ENABLE_COLLECTION

将其一个或多个数据块注册为收集可能耗时或 成本高昂的任何 WMI 驱动程序都必须处理此 IRP。 驱动程序可以通过调用 WmiSystemControl 或通过处理 IRP 本身来处理 WMI IRP,如 处理 WMI 请求中所述。

如果驱动程序调用 WmiSystemControl 来处理 IRP_MN_ENABLE_COLLECTION 请求,则 WMI 反过来会调用该驱动程序的 DpWmiFunctionControl 例程。

主要代码

IRP_MJ_SYSTEM_CONTROL

发送时间

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

驱动程序通过在 WMIREGGUIDWMIGUIDREGINFO 结构的 Flags 成员中设置WMIREG_FLAG_EXPENSIVE,将数据块注册为收集成本高昂。 驱动程序在注册或更新数据块时将这些结构传递给 WMI。 在驱动程序收到启动数据收集的显式请求之前,无需为此类块累积数据。

驱动程序可以通过调用 WmiSystemControl 或通过处理 IRP 本身来处理 WMI IRP,如 处理 WMI 请求中所述。

如果驱动程序通过调用 WmiSystemControl 处理 WMI IRP,该例程将调用驱动程序的 DpWmiFunctionControl 例程,或者,如果驱动程序未定义例程,则返回STATUS_SUCCESS。

如果驱动程序处理 IRP_MN_ENABLE_COLLECTION 请求本身,则仅当 Parameters.WMI.ProviderId 指向与驱动程序传递给 IoWMIRegistrationControl 的指针相同的设备对象时,它才应这样做。 否则,驱动程序必须将请求转发到下一个较低的驱动程序。

在处理请求之前,驱动程序应确保 Parameters.WMI.DataPath 指向驱动程序支持的 GUID。 否则,驱动程序应使 IRP 失败并返回STATUS_WMI_GUID_NOT_FOUND。 如果数据块有效但未向 WMIREG_FLAG_EXPENSIVE 注册,则驱动程序可以返回STATUS_SUCCESS且不采取进一步操作。

如果块有效且已注册到 WMIREG_FLAG_EXPENSIVE,则驱动程序会为该数据块的所有实例启用数据收集。

驱动程序不需要检查是否已为数据块启用数据收集。 在第一个数据使用者启用数据块后,WMI 仅发送单个请求来启用数据块。 在没有干预禁用请求的情况下,WMI 不会发送另一个启用请求。

要求

标头

Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另请参阅

DpWmiFunctionControl

IoWMIRegistrationControl

IRP_MN_DISABLE_COLLECTION

WMILIB_CONTEXT

WMIREGGUID

WmiSystemControl