WMI_QUERY_REGINFO_CALLBACK回调函数 (wmilib.h)

DpWmiQueryReginfo 例程提供有关驱动程序要注册的数据块和事件块的信息。 此例程是必需的。

语法

WMI_QUERY_REGINFO_CALLBACK WmiQueryReginfoCallback;

NTSTATUS WmiQueryReginfoCallback(
  [in]  PDEVICE_OBJECT DeviceObject,
  [out] PULONG RegFlags,
  [out] PUNICODE_STRING InstanceName,
  [out] PUNICODE_STRING *RegistryPath,
  [out] PUNICODE_STRING MofResourceName,
  [out] PDEVICE_OBJECT *Pdo
)
{...}

参数

[in] DeviceObject

指向驱动程序的 WDM DEVICE_OBJECT 结构的指针。

[out] RegFlags

此参数指示注册的所有块的常见特征。 RegFlags 中设置的任何标志都应用于所有块。 驱动程序可以通过在块 WMIGUIDREGINFO 结构中设置 标志 来补充给定块的 RegFlags。 例如,驱动程序可能会在 RegFlags中清除WMIREG_FLAG_EXPENSIVE,但在 Flags 中将其设置为将给定块注册为成本高昂的收集块。

驱动程序在 RegFlags中设置以下标志之一:

WMIREG_FLAG_INSTANCE_BASENAME

请求 WMI 从驱动程序在 InstanceName提供的基名称生成静态实例名称。 WMI 通过将计数器追加到基名称来生成实例名称。

WMIREG_FLAG_INSTANCE_PDO

请求 WMI 从 PDO 的设备实例 ID 生成静态实例名称。 如果驱动程序设置此标志,则还必须将 Pdo 设置为传递给驱动程序的 AddDevice 例程的 PDO。 WMI 从 PDO 的设备实例路径生成实例名称。 将设备实例路径用作静态实例名称的基础是有效的,因为此类名称保证是唯一的。 WMI 自动为实例提供一个“友好”名称,作为数据块中可由数据使用者查询的项。

驱动程序还可以在 RegFlags中设置以下一个或多个标志,但更通常在块 WMIGUIDREGINFO 结构的 标志 中设置这些标志:

WMIREG_FLAG_EVENT_ONLY_GUID

块只能启用或禁用为事件,并且无法查询或设置。 如果此标志明确,还可以查询或设置块。

WMIREG_FLAG_EXPENSIVE

请求 WMI 在数据使用者首次打开数据块时发送 IRP_MN_ENABLE_COLLECTION 请求,并在最后一个数据使用者关闭数据块时发出 IRP_MN_DISABLE_COLLECTION 请求。 如果收集此类数据会影响性能,则建议这样做,因为在数据使用者通过打开块显式请求数据之前,驱动程序不需要收集数据。

WMIREG_FLAG_REMOVE_GUID

请求 WMI 删除对块的支持。 此标志仅在响应更新注册信息的请求时有效(IRP_MN_REGINFOIRP_MN_REGINFO_EXParameters.WMI.DataPath 设置为 WMIUPDATE)。

[out] InstanceName

指向单个计数 Unicode 字符串的指针,该字符串用作驱动程序要注册的所有块的所有实例的基名称。 WMI 使用 ExFreePool释放字符串。 如果WMIREG_FLAG_INSTANCE_BASENAME清楚,则忽略 InstanceName

[out] RegistryPath

指向指向计数 Unicode 字符串的指针的指针,该字符串指定传递给驱动程序的 DriverEntry 例程的注册表路径。

[out] MofResourceName

指向单个计数 Unicode 字符串的指针,该字符串指示附加到驱动程序的二进制映像文件的 MOF 资源的名称。 通常,此字符串是驱动程序定义的静态字符串。 WMI 在驱动程序从此例程返回后创建此字符串的副本。 此字符串可由驱动程序动态分配。 对于分配的字符串,驱动程序负责释放应在 WmiSystemControl 返回后完成的字符串。 如果驱动程序没有附加 MOF 资源,它可以保留 MofResourceName 不变。

[out] Pdo

指向传递给驱动程序 AddDevice 例程的物理设备对象的指针。 如果设置了WMIREG_FLAG_INSTANCE_PDO,WMI 将此 PDO 的设备实例路径用作生成静态实例名称的基础。 如果WMIREG_FLAG_INSTANCE_PDO清楚,WMI 将忽略 Pdo

返回值

DpWmiQueryReginfo 始终返回STATUS_SUCCESS。

言论

在驱动程序调用 WmiSystemControl 以响应 IRP_MN_REGINFOIRP_MN_REGINFO_EX 请求后,WMI 调用驱动程序的 DpWmiQueryReginfo 例程。 驱动程序必须将其 DpWmiQueryReginfo 例程的地址放置在传递给 WmiSystemControlWMILIB_CONTEXT 结构中。

WMI 使用 WMIREG_ACTION_REGISTER、WMIREG_ACTION_REREGISTER 或 WMIREG_ACTION_UPDATE 调用 ioWMIRegistrationControl IoWMIRegistrationControl 后发送 IRP。 WMI 以透明方式代表驱动程序处理 IRP_MN_REGINFOIRP_MN_REGINFO_EX 之间的差异。

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

驱动程序在传递给 WmiSystemControl WMILIB_CONTEXT结构中提供有关单个块的新注册或更新的注册信息,或指示要删除的块。 在初始调用(用于建立驱动程序的注册表路径和 MOF 资源名称)之后,驱动程序的 DpWmiQueryReginfo 例程可以更改驱动程序的所有块通用的标志,提供用于生成实例名称的不同基名称字符串,或者将实例名称的基础从字符串更改为 PDO 的设备实例路径。

驱动程序不得返回STATUS_PENDING或阻止请求。 驱动程序不能通过从其 DpWmiQueryReginfo 例程调用 WmiCompleteRequest 或通过 WmiSystemControl 返回后调用 IoCompleteRequest 来完成请求。

此例程可以分页。

有关实现此例程的详细信息,请参阅 调用 WmiSystemControl 来处理 WMI IRP

要求

要求 价值
目标平台 桌面
标头 wmilib.h (包括 Wmilib.h)
IRQL 在PASSIVE_LEVEL调用。

另请参阅

IRP_MN_REGINFO_EX

IoWMIRegistrationControl

WMIGUIDREGINFO

WMILIB_CONTEXT

WmiSystemControl