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_REGINFO 或 IRP_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_REGINFO 或 IRP_MN_REGINFO_EX 请求后,WMI 调用驱动程序的 DpWmiQueryReginfo 例程。 驱动程序必须将其 DpWmiQueryReginfo 例程的地址放置在传递给 WmiSystemControl的 WMILIB_CONTEXT 结构中。
WMI 使用 WMIREG_ACTION_REGISTER、WMIREG_ACTION_REREGISTER 或 WMIREG_ACTION_UPDATE 调用 ioWMIRegistrationControl IoWMIRegistrationControl 后发送 IRP。 WMI 以透明方式代表驱动程序处理 IRP_MN_REGINFO 和 IRP_MN_REGINFO_EX 之间的差异。
WMI 在驱动程序 使用 WMIREG_ACTION_DEREGISTER 调用 IoWMIRegistrationControl 后,不会发送 IRP_MN_REGINFO 或 IRP_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调用。 |