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 将此 IRP 以 IRQL = PASSIVE_LEVEL 发送到任意线程上下文中。

输入参数

Parameters。 ProviderId 指向应响应请求的驱动程序的设备对象。 此指针位于 IRP 中驱动程序的 i/o 堆栈位置。

数据路径 指向用于标识要为其累积数据的数据块的 GUID。

输出参数

无。

I/o 状态块

如果驱动程序通过调用WmiSystemControl来处理 IRP,WMI 将在 i/o 状态块中设置irp- > IoStatusirp- > IoStatus。

否则,驱动程序将 Irp- > IoStatus 设置为 STATUS_SUCCESS 或相应的错误状态,如下所示:

STATUS_WMI_GUID_NOT_FOUND

STATUS_INVALID_DEVICE_REQUEST

成功时,驱动程序将 Irp- > IoStatus 设置为零。

操作

驱动程序通过在WMIREGGUIDWMIGUIDREGINFO结构的Flags成员中设置 WMIREG_FLAG_EXPENSIVE 来注册数据块,从而导致收集开销较高。 当驱动程序注册或更新数据块时,它会将这些结构传递给 WMI。 驱动程序在接收到开始数据收集的显式请求之前,不需要为此类块累积数据。

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

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

如果驱动程序处理 IRP_MN_ENABLE_COLLECTION 请求本身,则仅当 参数. ProviderId 指向与驱动程序传递给 IoWMIRegistrationControl的指针相同的设备对象时,才应执行此操作。 否则,驱动程序必须将请求转发到下一个较低版本的驱动程序。

在处理请求之前,驱动程序应确保 数据路径 指向驱动程序支持的 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