IRP_MN_QUERY_ID

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

从 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(s)以响应此 IRP,它将从分页池分配 WCHAR 结构以包含 ID(s)。 不再需要 PnP 管理器时释放结构。

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

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

  • 响应 BusQueryHardwareIDs 或 BusQueryCompatibleIDs 请求的REG_MULTI_SZ字符串。

如果驱动程序返回具有非法字符的 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 终止符。

  • 如果总线驱动程序为其子设备(即驱动程序设置DEVICE_CAPABILITIES)提供全局唯一实例 ID。设备的 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 的字符串。 Windows 和总线驱动程序使用实例 ID 和其他信息来区分计算机上的两个相同设备。 实例 ID 在整个计算机上是唯一的,或者只是在设备的父总线上是唯一的。

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

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

指定 BusQueryHardwareIDs 和 BusQueryCompatibleIDs

总线驱动程序为 BusQueryHardwareID 和 BusQueryCompatibleID 提供的值允许 Windows 找到总线的子设备的相应驱动程序。

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

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

Windows 根据 INF 文件中列出的 ID 检查 ID 是否存在可能的匹配。 Windows 首先扫描硬件 ID 列表,然后扫描兼容的 ID 列表。 早期条目被视为设备的更具体说明,以后的条目被视为更常规(因此不太最佳)的匹配项。 如果在硬件 ID 列表中找不到匹配项,Windows 可能会在转到兼容 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