IRP_MN_QUERY_ID

总线驱动程序必须处理其子设备的 BusQueryDeviceID 请求 (子 PDO) 。 总线驱动程序可以处理其子设备的 BusQueryHardwareID、BusQueryCompatibleIDBusQueryInstanceID 的请求。

从 Windows 7 开始,总线驱动程序还必须处理其子 PDO 的 BusQueryContainerID 请求。

有关这些标识符 (ID) 的详细信息,请参阅 设备标识字符串

注意 函数驱动程序和筛选器驱动程序不处理此 IRP。

0x13

主代码

IRP_MJ_PNP

发送时

枚举设备时,PnP 管理器会发送此 IRP。 驱动程序可能会发送此 IRP 来检索其某个设备的实例 ID。

PnP 管理器和驱动程序在任意线程上下文中的 IRQL PASSIVE_LEVEL发送此 IRP。

输入参数

IO_STACK_LOCATION 结构的 Parameters.QueryId.IdType 成员指定) 请求的 ID 类型 (。 可能的值包括 BusQueryDeviceID、BusQueryHardwareIDs、BusQueryCompatibleIDs、BusQueryInstanceID 和 BusQueryContainerID。 保留以下 ID 类型:BusQueryDeviceSerialNumber。

输出参数

在 I/O 状态块中返回。

I/O 状态块

驱动程序将 Irp-IoStatus.Status> 设置为STATUS_SUCCESS或相应的错误状态。

成功后,驱动程序会将 Irp-IoStatus.Information> 设置为指向所请求信息的 WCHAR 指针。 出现错误时,驱动程序将 Irp-IoStatus.Information> 设置为零。

操作

如果驱动程序返回 ID () 以响应此 IRP,则会从分页池中分配 WCHAR 结构,以包含 ID () 。 PnP 管理器在不再需要结构时释放该结构。

驱动程序返回以下项之一:

  • 用于响应 BusQueryDeviceID、BusQueryInstanceID 或 BusQueryContainerID 请求的REG_SZ字符串。

  • REG_MULTI_SZ字符串,用于响应 BusQueryHardwareIDs 或 BusQueryCompatibleIDs 请求。

如果驱动程序返回具有非法字符的 ID,系统会检查 bug。 具有以下值的字符在此 IRP 的 ID 中是非法的:

  • 小于或等于 0x20 (“)

  • 大于 0x7F

  • 等于 0x2C (',')

驱动程序必须符合以下 ID 长度限制:

  • 驱动程序在此 IRP 中返回的每个硬件 ID 或兼容 ID 的长度必须小于 MAX_DEVICE_ID_LEN 个字符。 此常量当前具有 sdk\inc\cfgmgr32.h 中定义的值 200。

  • 驱动程序在此 IRP 中返回的容器 ID 必须格式化为全局唯一标识符 (GUID) ,并且必须是MAX_GUID_STRING_LEN字符,其中包括 null 终止符。

  • 如果总线驱动程序为其子设备提供全局唯一的实例 ID (,则驱动程序将设置 DEVICE_CAPABILITIES。设备) 的 UniqueID ,则设备 ID 和实例 ID 的组合必须小于 (MAX_DEVICE_ID_LEN - 1) 字符。 操作系统需要路径分隔符的附加字符。

  • 如果总线驱动程序未为其子设备提供全局唯一实例 ID,则设备 ID 和实例 ID 的组合必须小于 (MAX_DEVICE_ID_LEN - 28) 。 此公式的值当前为 172。

总线驱动程序应准备好在枚举设备后立即处理子设备的此 IRP。

指定 BusQueryDeviceID 和 BusQueryInstanceID

总线驱动程序为 BusQueryDeviceID 和 BusQueryInstanceID 提供的值允许操作系统将设备与计算机上的其他设备区分开来。 操作系统使用 IRP_MN_QUERY_ID IRP 中返回的设备 ID 和实例 ID,以及 IRP_MN_QUERY_CAPABILITIES IRP 中返回的唯一 ID 字段来查找设备的注册表信息。

对于 BusQueryDeviceID,总线驱动程序提供设备的 设备 ID。 设备 ID 应尽可能包含设备最具体的说明,并包含枚举器的名称以及标识制造商、设备、修订、包装器和打包产品的字符串(如果可能)。 例如,PCI 总线驱动程序使用 PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx 形式的设备 ID 进行响应,对上述所有五项进行编码。 但是,设备 ID 不应包含足够的信息来区分两个相同的设备。 此信息应以实例 ID 进行编码。

对于 BusQueryInstanceID,总线驱动程序应提供包含设备的 实例 ID 的字符串。 安装程序和总线驱动程序使用实例 ID 和其他信息来区分计算机上的两个相同设备。 实例 ID 在整个计算机上是唯一的,或者在设备的父总线上是唯一的。

如果实例 ID 在总线上是唯一的,则总线驱动程序会为 BusQueryInstanceID 指定该字符串,但也指定 UniqueID 值为 FALSE 以响应设备的 IRP_MN_QUERY_CAPABILITIES 请求。 如果 UniqueIDFALSE,则 PnP 管理器通过添加有关设备父级的信息来增强实例 ID,从而使 ID 在计算机上唯一。 在这种情况下,总线驱动程序不应采取额外的步骤使其设备的实例 ID 全局唯一;只需返回相应的功能信息,操作系统会处理它。

如果总线驱动程序可以为每个子设备提供全局唯一 ID(如序列号),则总线驱动程序会为 BusQueryInstanceID 指定这些字符串,并将 UniqueID 值指定为 TRUE 以响应每个设备的 IRP_MN_QUERY_CAPABILITIES 请求。

指定 BusQueryHardwareIDs 和 BusQueryCompatibleIDs

总线驱动程序为 BusQueryHardwareIDs 和 BusQueryCompatibleID 提供的值允许安装程序为总线的子设备找到适当的驱动程序。

总线驱动程序使用描述设备的REG_MULTI_SZ ID 列表响应这些请求。 ID 列表(包括终止列表的两个 NULL 字符)的最大长度(以字符为单位)REGSTR_VAL_MAX_HCID_LEN。

返回多个 硬件 ID 和/或多个 兼容 ID 时,总线驱动程序应按最特定到最通用的顺序列出 ID,以便为设备选择最佳驱动程序匹配项。 硬件 ID 列表中的第一个条目是设备最具体的说明,因此,它通常与设备 ID 相同。

安装程序根据 INF 文件中列出的 ID 检查 ID 以查找可能的匹配项。 安装程序首先扫描硬件 ID 列表,然后扫描兼容的 ID 列表。 较早的条目被视为设备更具体的说明,较后的条目被视为更通用 (,因此对设备) 匹配效果较差。 如果在硬件 ID 列表中找不到匹配项,安装程序可能会提示用户输入安装媒体,然后再转到兼容 ID 列表。

有关处理即插即用次要 IRP 的一般规则,请参阅即插即用。

指定 BusQueryContainerIDs

从 Windows 7 开始,总线驱动程序应为 BusQueryContainerID 提供一个字符串,其中包含设备的 容器 ID 。 容器 ID 允许操作系统对单个可移动物理设备中的所有功能设备进行分组。 例如,可移动多功能设备中的所有功能设备具有相同的容器 ID。 有关在特殊情况下报告容器 ID 的详细信息,例如卷设备可能跨多个容器中的多个磁盘,但不属于任何容器,请参阅 容器 ID 概述

可移动物理设备定义为子设备,总线驱动程序指定可 移动 功能 TRUE 以响应 IRP_MN_QUERY_CAPABILITIES 请求。 有关 可移动 值的详细信息,请参阅 DEVICE_CAPABILITIES

总线驱动程序基于设备提供的特定于总线的唯一 ID 创建容器 ID。 有关详细信息,请参阅 如何生成容器 ID

如果满足以下任一条件,驱动程序必须失败 IRP 请求并将 IoStatus.Status 设置为 STATUS_NOT_SUPPORTED:

  • 设备不支持总线驱动程序可用于生成容器 ID 的特定于总线的唯一 ID。

  • 总线驱动程序之前指定了 可移动 功能 FALSE ,以响应对设备的 IRP_MN_QUERY_CAPABILITIES 请求。

发送此 IRP

通常,只有 PnP 管理器发送此 IRP。

若要获取设备的硬件 ID 或兼容 ID,请调用 IoGetDeviceProperty ,而不是发送此 IRP。

驱动程序可能会发送此 IRP 来检索其某个设备的实例 ID。 例如,假设其功能不独立运行的多功能 PnP ISA 设备。 PnP 管理器将函数枚举为单独的设备,但可能需要此类设备的驱动程序来关联一个或多个函数。 由于 PnP ISA 保证唯一的实例 ID,因此此类多功能设备的驱动程序可以使用实例 ID 来查找驻留在同一设备上的函数。 此类设备的驱动程序还必须通过调用 IoGetDeviceProperty 来获取设备的枚举器名称,以确认该设备是 PnP ISA 设备。

有关发送 IRP 的信息,请参阅处理 IRP。 以下步骤专门适用于此 IRP:

  • 设置 IRP 的下一个 I/O 堆栈位置中的值:将 MajorFunction 设置为 IRP_MJ_PNP,将 MinorFunction 设置为 IRP_MN_QUERY_ID,并将 Parameters.QueryId.IdType 设置为 BusQueryInstanceID

  • IoStatus.Status 设置为 STATUS_NOT_SUPPORTED。

除了发送查询 ID IRP 外,驱动程序还必须调用 IoGetDeviceProperty 以获取设备的 DevicePropertyEnumeratorName

在 IRP 完成后,驱动程序使用 ID 完成之后,驱动程序必须释放由处理查询 IRP 的驱动程序 () 返回的 ID 结构。

要求

标头

Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另请参阅

设备标识字符串

IoGetDeviceProperty