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。
主要代码
发送时间
在 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) |