IRP_MN_REGINFO_EX

WMI 发送此 IRP,以在驱动程序调用 IoWMIRegistrationControl 后查询或更新驱动程序的注册信息。 驱动程序可以通过调用 WmiSystemControl 或通过处理 IRP 本身来处理 WMI IRP,如 处理 WMI 请求中所述。

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

在 Microsoft Windows XP 及更高版本的操作系统上,支持 WMI 的驱动程序必须处理此 IRP。 支持 Microsoft Windows 98 和 Windows 2000 的驱动程序还必须处理 IRP_MN_REGINFO

主要代码

IRP_MJ_SYSTEM_CONTROL

发送时间

在 Windows XP 及更高版本上,WMI 发送此 IRP,以在驱动程序调用 IoWMIRegistrationControl 后查询或更新驱动程序的注册信息。 在 Windows 98 和 Windows 2000 上,WMI 改为发送 IRP_MN_REGINFO 请求。

WMI 在 IRQL = PASSIVE_LEVEL系统线程上下文中发送此 IRP。

输入参数

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

Parameters.WMI.DataPath 设置为 WMIREGISTER 以查询注册信息,或 将 WMIUPDATE 设置为更新它。

Parameters.WMI.BufferSize 指示 Parameters.WMI.Buffer 处非分页缓冲区的最大大小。 大小必须大于或等于 (size of (WMIREGINFO) + (GuidCount * size of (WMIREGGUID) ) 的总大小,其中 GuidCount 是驱动程序注册的数据块和事件块的数量,以及静态实例名称的空间(如果有)。

输出参数

如果驱动程序通过调用 WmiSystemControl 处理 WMI IRP,则 WMI 通过调用其 DpWmiQueryReginfo 例程获取驱动程序的数据块的注册信息。

否则,驱动程序会在 Parameters.WMI.Buffer 处填充 WMIREGINFO 结构,如下所示:

  • BufferSize 设置为 WMIREGINFO 结构和关联注册数据的大小(以字节为单位)。

  • 如果驱动程序代表另一个驱动程序处理 WMI 请求,请将 NextWmiRegInfo 设置为从此 WMIREGINFO 开头到另一个 WMIREGINFO 结构的开头的偏移量(以字节为单位),该结构包含来自另一个驱动程序的注册信息。

  • RegistryPath 设置为传递给驱动程序的 DriverEntry 例程的注册表路径。

  • 如果 Parameters.WMI.Datapath 设置为 WMIREGISTER,请将 MofResourceName 设置为此 WMIREGINFO 开头的偏移量,该字符串在其映像文件中包含驱动程序的 MOF 资源的名称。

  • GuidCount 设置为要注册或更新的数据块和事件块的数量。

  • WmiRegGuid 处写入 WMIREGGUID 结构数组,每个数据块或驱动程序公开的事件块对应一

驱动程序填充每个 WMIREGGUID 结构,如下所示:

  • Guid 设置为标识块的 GUID。

  • 设置 标志 以提供有关块的实例名称和其他特征的信息。 例如,如果使用静态实例名称注册块,驱动程序会使用相应的 WMIREG_FLAG_INSTANCE_XXX 标志设置 Flags

如果块是使用静态实例名称注册的,则驱动程序会:

  • InstanceCount 设置为实例数。

  • 将以下成员之一设置为块的静态实例名称数据的偏移量(以字节为单位):

    • 如果驱动程序使用 WMIREG_FLAG_INSTANCE_LIST 设置 Flags ,则会将 InstanceNameList 设置为静态实例名称字符串列表的偏移量。 WMI 按索引在此列表中指定后续请求中的实例。

    • 如果驱动程序使用 WMIREG_FLAG_INSTANCE_BASENAME 设置 Flags ,则会将 BaseNameOffset 设置为基名称字符串的偏移量。 WMI 使用此字符串为 块生成静态实例名称。

    • 如果驱动程序使用 WMIREG_FLAG_INSTANCE_PDO 设置 Flags ,则会将 Pdo 设置为指向传递给驱动程序 AddDevice 例程的 PDO 的指针的偏移量。 WMI 使用 PDO 的设备实例路径为 块生成静态实例名称。 驱动程序必须在 Pdo 中传递的物理设备对象上调用 ObReferenceObject。 系统将自动调用 ObDereferenceObject 来取消引用对象;驱动程序不得这样做。 (使用 WmiSystemControl 处理 IRP 的驱动程序不需要调用 ObReferenceObject。WMI 在调用驱动程序的 DpWmiQueryReginfo 例程之前自动执行此操作)

  • 分别在 InstanceNameList、BaseName 或 Pdo 指示的偏移量处写入实例名称字符串、基 名称字符串或指向 PDO 的指针。

如果驱动程序代表另一个驱动程序 ((如微型类或微型端口驱动程序) )处理 WMI 注册,则会使用另一个驱动程序的注册信息填充另一个 WMIREGINFO 结构,并将其写入上一个结构中的 NextWmiRegInfo

如果 Parameters.WMI.Buffer 处的缓冲区太小而无法接收所有数据,驱动程序会将所需大小(以字节为单位)作为 ULONG 写入 Parameters.WMI.Buffer ,并使 IRP 失败并返回STATUS_BUFFER_TOO_SMALL。

I/O 状态块

如果驱动程序通过调用 WmiSystemControl 处理 IRP,则 WMI 在 I/O 状态块中设置 Irp-IoStatus.Status>Irp-IoStatus.Information>

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

STATUS_BUFFER_TOO_SMALL

成功后,驱动程序会将 Irp-IoStatus.Information> 设置为写入 Parameters.WMI.Buffer 处缓冲区的字节数。

Operation

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

在处理请求之前,驱动程序必须检查 Parameters.WMI.DataPath 来确定 WMI 是 (WMIREGISTER) 查询注册信息,还是 (WMIUPDATE) 请求更新。

在驱动程序使用 WMIREG_ACTION_REGISTER 或 WMIREG_ACTION_REREGISTER 调用 IoWMIRegistrationControl 后,WMI 使用 WMIREGISTER 发送此 IRP 。 作为响应,驱动程序应使用以下内容填充 Parameters.WMI.Buffer 处的缓冲区

  • WMIREGINFO 结构,指示驱动程序的注册表路径、其 MOF 资源的名称以及要注册的块数。

  • 要注册的每个块的一个WMIREGGUID 结构。 如果要使用静态实例名称注册块,驱动程序将在 WMIREGGUID 结构中为该块设置相应的 WMIREG_FLAG_INSTANCE_XXX 标志。

  • WMI 生成静态实例名称所需的任何字符串。

在驱动程序使用 WMIREG_ACTION_UPDATE_GUIDS 调用 IoWmiRegistrationControl 后,WMI 使用 WMIUPDATE 发送此 IRP。 作为响应,驱动程序应使用 WMIREGINFO 结构填充 Parameters.WMI.Buffer 处的缓冲区,如下所示:

  • 若要删除块,驱动程序在其 WMIREGGUID 结构中设置WMIREG_FLAG_REMOVE_GUID。

  • 例如,若要添加或更新块 (更改其静态实例名称) ,驱动程序会清除WMIREG_FLAG_REMOVE_GUID并为该块提供新的或更新的注册值。

  • 若要使用静态实例名称注册新的或现有的块,驱动程序会设置相应的 WMIREG_FLAG_INSTANCE_XXX ,并提供 WMI 生成静态实例名称所需的任何字符串。

驱动程序可以使用相同的 WMIREGINFO 结构来删除、添加或更新块,因为它最初用于注册其所有块,仅更改要更新的块的标志和数据。 如果此类 WMIREGINFO 结构中的 WMIREGGUID 与驱动程序在首次注册该块时传递的 WMIREGGUID 完全匹配,则 WMI 将跳过更新块所涉及的处理。

驱动程序使用 WMIREG_ACTION_DEREGISTER 调用 IoWMIRegistrationControl 后,WMI 不会发送IRP_MN_REGINFO_EX请求,因为 WMI 不需要驱动程序提供进一步的信息。 驱动程序通常会取消注册其块以响应 IRP_MN_REMOVE_DEVICE 请求。

要求

标头

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

另请参阅

DpWmiQueryReginfo

IoWMIRegistrationControl

WMILIB_CONTEXT

WMIREGGUID

WMIREGINFO

WmiSystemControl

IRP_MN_REGINFO