定义 WMI 实例名称
WMI 块的 实例 包含由特定物理设备或软件组件提供的数据。 正如块的 GUID 唯一标识块一样,实例的名称唯一标识块的实例。 WMI 客户端应用程序使用实例名称将数据块中返回的信息与提供数据的设备或组件相关联。 WMI 使用实例名称来确定应将请求发送到的设备。 强烈建议驱动程序在定义实例名称时使用其 PDO。
驱动程序可以通过以下两种方式之一为块定义实例名称:
驱动程序在注册块时将 静态实例名称 列表传递给 WMI。
注册块后,驱动程序和 WMI 都在此列表中按其索引指定实例名称。 静态实例名称可以基于驱动程序 PDO 的设备实例 ID ,也可以基于驱动程序定义的基名称;或驱动程序可以定义实例名称字符串的列表。 静态实例名称一直保留,直到驱动程序通过重新注册块来显式更改它们。
驱动程序在创建实例时生成 动态实例名称 。
驱动程序指示它会在注册块时为块生成动态实例名称。 注册块后,驱动程序和 WMI 在 Parameters.WMI.Buffer 的缓冲区中以字符串的形式传递动态实例名称。
仅当数据块的实例数或实例名称在运行时频繁更改时,驱动程序才应生成动态实例名称。 例如,驱动程序可能会使用进程 ID 或 TCP/IP 连接的 IP 地址作为实例名称。 此类实例名称应是动态的;如果它们是静态的,则驱动程序将产生相当大的开销,因为它必须调用 IoWMIRegistrationControl ,以便在每次发生更改时更新实例的数量和名称。
在大多数情况下,静态实例名称优于动态实例名称,原因如下:
静态实例名称提高了驱动程序的性能,因为驱动程序不需要返回实例名称字符串来响应 WMI 请求,因为动态实例名称必须返回该字符串。
WMI 可以在注册时检测静态实例名称冲突,并在必要时自动修改实例名称,以便无论有多少驱动程序注册该块,所有实例名称对于给定块都是唯一的。
WMI 无法检测动态实例名称的实例名称冲突,因此驱动程序负责使用 IoWMIAllocateInstanceIds 生成唯一名称。
只要名称基于驱动程序的 PDO 或驱动程序定义的基名称,驱动程序就可以使用 WMI 库例程来处理使用静态实例名称的块的 IRP。
驱动程序不能使用 WMI 库例程来处理使用动态实例名称的数据块的 IRP。
驱动程序通过在注册块时传递给 WMI 的 WMIREGGUID 或 WMIGUIDREGINFO 结构中设置或清除 WMIREG_FLAG_XXX 来指示块是使用静态实例名称还是动态实例名称以及静态实例名称的类型。 有关详细信息,请参阅 注册为 WMI 数据提供程序。