处理 IRP_MN_REGINFO 和 IRP_MN_REGINFO_EX 以注册块

在 Windows 98 和 Windows 2000 上,系统会向驱动程序发送 IRP_MN_REGINFO 请求,以允许驱动程序注册其 WMI 类。 在 Windows XP 及更高版本上,系统会改为发送 IRP_MN_REGINFO_EX 请求。 大多数驱动程序可以使用 WmiSystemControl 提供回调例程来处理这些请求。 有关详细信息 ,请参阅使用 WMI 库注册块

驱动程序必须处理 IRP_MN_REGINFOIRP_MN_REGINFO_EX 请求,以注册使用动态实例名称或使用驱动程序定义的静态实例名称列表的块;它不能调用 WmiSystemControl 来注册此类块。 驱动程序可以选择处理此请求,以注册基于 PDO 或驱动程序定义的基名称字符串使用静态实例名称的块。

在这种情况下,驱动程序:

  1. Parameters.WMI.Buffer 处填充 WMIREGINFO 结构,该结构指定:

    • 驱动程序提供的所有注册数据的字节数,包括代表另一个驱动程序提供的数据。

    • 驱动程序的注册表路径。

    • 驱动程序的 MOF 资源的名称。

    • 要注册的块数。

    • WMIREGGUID 结构的数组,每个块一个。

  2. 对于每个块,驱动程序将填充一个 WMIREGGUID 结构,该结构指定:

    • 表示块的 GUID。

    • 提供有关块的实例名称和其他特征的信息的标志,例如,块是否收集成本高昂。 有关详细信息,请参阅 WMI 注册标志

    如果块是使用静态实例名称注册的,驱动程序会设置以下成员之一,以指定块的静态实例名称数据:

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

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

    • 如果驱动程序使用 WMIREG_FLAG_INSTANCE_PDO 设置 标志 ,则会将 Pdo 设置为传递给驱动程序的 AddDevice 例程的 PDO。 WMI 使用 PDO 的设备实例路径为块生成静态实例名称。 处理IRP_MN_REGINFO_EX请求时,驱动程序必须在 Pdo 中传递的物理设备对象上调用 ObReferenceObject 例程。 (系统将自动调用 ObDereferenceObject 来取消引用对象;驱动程序不得这样做。)

    驱动程序分别在 InstanceNameList 或 BaseName 指示的偏移量处写入实例名称字符串或 基名称字符串。

  3. 如果驱动程序代表另一个驱动程序注册块, (类驱动程序可能代表微型类驱动程序) ,则驱动程序将填充另一个 WMIREGINFO 结构和 WMIREGGUID 结构列表,其中包含其他驱动程序块的注册信息,并将第一个 WMIREGINFO 中的 NextWmiRegInfo 设置为从第一个 WMIREGINFO 开头到第二个 WMIREGINFO 结构的开头的偏移量(以字节为单位)。