Поделиться через


IRP_MN_QUERY_ID

Водители шины должны обрабатывать запросы для BusQueryDeviceID для своих дочерних устройств (дочерние PDOS). Водители шины могут обрабатывать запросы для идентификаторов BusQueryHardwareID, BusQueryCompatibleID и BusQueryInstanceID для своих дочерних устройств.

Начиная с Windows 7 водители автобусов также должны обрабатывать запросы для BusQueryContainerID для своих дочерних PDOS.

Дополнительные сведения об этих идентификаторах см. в разделе "Строки идентификации устройств".

Заметка: Драйверы функций и драйверы фильтров не обрабатывают этот IRP.

Ценность

0x13

Основной код

IRP_MJ_PNP

При отправке

Диспетчер PnP отправляет этот IRP при перечислении устройства. Драйвер может отправить этот идентификатор IRP, чтобы получить идентификатор экземпляра для одного из его устройств.

Диспетчер PnP и драйверы отправляют этот IRP в IRQL PASSIVE_LEVEL в произвольном контексте потока.

Входные параметры

Элемент Parameters.QueryId.IdType структуры IO_STACK_LOCATION указывает тип запрошенных идентификаторов. Возможные значения: BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID и BusQueryContainerID. Зарезервирован следующий тип идентификатора: BusQueryDeviceSerialNumber.

Выходные параметры

Возвращается в блоке состояния ввода-вывода.

Блок состояния ввода-вывода

Драйвер задает для Irp-IoStatus.Status> значение STATUS_SUCCESS или соответствующее состояние ошибки.

При успешном выполнении драйвер задает указатель WCHAR Irp-IoStatus.Information>, указывающий на запрошенную информацию. При ошибке драйвер задает значение Irp-IoStatus.Information> равным нулю.

Операция

Если драйвер возвращает идентификаторы в ответ на этот IRP, он выделяет структуру WCHAR из страничного пула, чтобы содержать идентификаторы. Диспетчер PnP освобождает структуру, когда она больше не нужна.

Драйвер возвращает одно из следующих элементов:

  • Строка REG_SZ в ответ на запрос BusQueryDeviceID, BusQueryInstanceID или BusQueryContainerID.

  • Строка REG_MULTI_SZ в ответ на запрос BusQueryHardwareID или BusQueryCompatibleIDs.

Если драйвер возвращает идентификатор с недопустимым символом, система будет проверять ошибку. Символы со следующими значениями являются незаконными в идентификаторе для этого IRP:

  • Меньше или равно 0x20 (')

  • Больше 0x7F

  • Равно 0x2C (',')

Драйвер должен соответствовать следующим ограничениям длины для идентификаторов:

  • Каждый идентификатор оборудования или совместимый идентификатор , возвращаемые драйвером в этом IRP, должен быть меньше MAX_DEVICE_ID_LEN символов. Эта константа в настоящее время имеет значение 200, как определено в sdk\inc\cfgmgr32.h.

  • Идентификатор контейнера, возвращаемого драйвером в этом IRP, должен быть отформатирован как глобальный уникальный идентификатор (GUID) и должен быть MAX_GUID_STRING_LEN символов, включая терминатор NULL.

  • Если водитель автобуса предоставляет идентификаторы глобально уникальных экземпляров для своих дочерних устройств (то есть драйвер устанавливает DEVICE_CAPABILITIES. UniqueID для устройств, то сочетание идентификатора устройства и идентификатора экземпляра должно быть меньше символов (MAX_DEVICE_ID_LEN – 1). Операционная система требует дополнительного символа для разделителя путей.

  • Если драйвер шины не предоставляет идентификаторы глобально уникальных экземпляров для своих дочерних устройств, то сочетание идентификатора устройства и идентификатора экземпляра должно быть меньше (MAX_DEVICE_ID_LEN – 28). Значение этого уравнения в настоящее время равно 172.

Водители шины должны быть готовы к обработке этого IRP для дочернего устройства сразу после перечисления устройства.

Указание BusQueryDeviceID и BusQueryInstanceID

Значения драйвера шины для BusQueryDeviceID и BusQueryInstanceID позволяют операционной системе различать устройство от других устройств на компьютере. Операционная система использует идентификатор устройства и идентификатор экземпляра , возвращаемые в IRP_MN_QUERY_ID IRP, и уникальное поле идентификатора, возвращаемое в IRP_MN_QUERY_CAPABILITIES IRP, чтобы найти сведения о реестре для устройства.

Для BusQueryDeviceID драйвер шины предоставляет идентификатор устройства. Идентификатор устройства должен содержать наиболее конкретное описание устройства, включив имя перечислителя и строк, определяющих производителя, устройства, редакции, упакователя и упакованный продукт, где это возможно. Например, драйвер шины PCI отвечает на идентификаторы устройств формы PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, кодируя все пять элементов, упомянутых выше. Однако идентификатор устройства не должен содержать достаточно сведений, чтобы различать два идентичных устройства. Эти сведения должны быть закодированы в идентификаторе экземпляра.

Для BusQueryInstanceID драйвер шины должен указать строку, содержащую идентификатор экземпляра устройства. Драйверы Windows и шины используют идентификатор экземпляра с другими сведениями, чтобы различать два идентичных устройства на компьютере. Идентификатор экземпляра является уникальным для всего компьютера или просто уникальным на родительской шине устройства.

Если идентификатор экземпляра является уникальным только на шине, драйвер шины указывает, что строка для BusQueryInstanceID, но также указывает значение UniqueIDfalse в ответ на запрос IRP_MN_QUERY_CAPABILITIES устройства. Если UniqueID имеет значение FALSE, диспетчер PnP улучшает идентификатор экземпляра путем добавления сведений о родительском устройстве и таким образом делает идентификатор уникальным на компьютере. В этом случае водитель автобуса не должен предпринимать дополнительных действий, чтобы сделать идентификаторы экземпляров своих устройств глобально уникальными; просто верните соответствующие сведения о возможностях, а операционная система заботится об этом.

Если водитель шины может предоставить глобальный уникальный идентификатор для каждого дочернего устройства, например серийный номер, драйвер шины указывает эти строки для BusQueryInstanceID и указывает значение UniqueIDв ответ на запрос IRP_MN_QUERY_CAPABILITIES для каждого устройства.

Указание идентификаторов BusQueryHardwareID и BusQueryCompatibleID

Значения драйвера шины предоставляются для идентификаторов BusQueryHardwareID и BusQueryCompatibleID, которые позволяют Windows находить подходящих драйверов для дочернего устройства автобуса.

Водитель шины отвечает на каждый из этих запросов с REG_MULTI_SZ списком идентификаторов, описывающих устройство. Максимальная длина в символах списка идентификаторов, включая два символа NULL, завершающих список, REGSTR_VAL_MAX_HCID_LEN.

При возврате нескольких идентификаторов оборудования и (или) нескольких совместимых идентификаторов драйвер шины должен перечислить идентификаторы в порядке наиболее конкретных наиболее общих, чтобы упростить выбор оптимального соответствия драйвера для устройства. Первая запись в списке идентификаторов оборудования — это наиболее конкретное описание устройства и, как правило, идентично идентификатору устройства.

Windows проверяет идентификаторы на идентификаторы, перечисленные в INF-файлах, для возможных совпадений. Windows сначала сканирует список идентификаторов оборудования, а затем список совместимых идентификаторов. Предыдущие записи рассматриваются как более конкретные описания устройства, а более поздние записи являются более общими (и, таким образом, менее оптимальными) совпадениями для устройства. Если совпадение не найдено в списке аппаратных идентификаторов, Windows может предложить пользователю установить носитель перед переходом к списку совместимых идентификаторов.

Ознакомьтесь с общими правилами для обработки дополнительных irps Plug and Play.

Указание идентификаторов BusQueryContainerID

Начиная с Windows 7 драйвер шины должен указать строку для BusQueryContainerID, содержащую идентификатор контейнера для устройства. Идентификатор контейнера позволяет операционной системе группировать все функциональные устройства с одного съемного физического устройства. Например, все функциональные устройства с съемным мультифункциональным устройством имеют один и тот же идентификатор контейнера. Дополнительные сведения об идентификаторах контейнеров в особых случаях, таких как устройство тома, которое может охватывать несколько дисков в нескольких контейнерах, но не принадлежит ни одному контейнеру, см. в разделе "Обзор идентификаторов контейнеров".

Съемное физическое устройство определяется как дочернее устройство, которое водитель шины задает съемный компонентTRUE в ответ на запрос IRP_MN_QUERY_CAPABILITIES . Дополнительные сведения о съемном значении см. в DEVICE_CAPABILITIES.

Драйвер шины создает идентификатор контейнера на основе уникального идентификатора шины, который предоставляет устройство. Дополнительные сведения см. в разделе "Создание идентификаторов контейнеров".

Драйвер должен завершить запрос IRP и задать для состояния IoStatus.Status значение STATUS_NOT_SUPPORTED если одно из следующих значений имеет значение true:

  • Устройство не поддерживает уникальный идентификатор шины, который водитель шины может использовать для создания идентификатора контейнера.

  • Водитель шины ранее указал возможность съемной функции FALSE в ответ на запрос IRP_MN_QUERY_CAPABILITIES устройства.

Отправка этого IRP

Как правило, только диспетчер PnP отправляет этот IRP.

Чтобы получить идентификаторы оборудования или совместимые идентификаторы для устройства, вызовите IoGetDeviceProperty вместо отправки этого IRP.

Драйвер может отправить этот идентификатор IRP, чтобы получить идентификатор экземпляра для одного из его устройств. Например, рассмотрим многофункционное устройство ISA PnP, функции которого не работают независимо. Диспетчер PnP перечисляет функции как отдельные устройства, но драйвер для такого устройства может потребоваться для связывания одной или нескольких функций. Так как ISA PnP гарантирует уникальный идентификатор экземпляра, драйвер для такого многофункционированного устройства может использовать идентификаторы экземпляров для поиска функций, находящихся на одном устройстве. Драйвер для такого устройства также должен получить имя перечислителя устройства, вызвав IoGetDeviceProperty, чтобы убедиться, что устройство является устройством ISA PnP.

Сведения об отправке IRP см. в разделе об обработке IRP . Следующие действия применяются специально к этому IRP:

  • Задайте значения в следующем расположении стека операций ввода-вывода iRP: задайте для параметра MajorFunctionзначение IRP_MJ_PNP, задайте значение MinorFunction для IRP_MN_QUERY_ID и задайте параметр Parameters.QueryId.IdType значение BusQueryInstanceID.

  • Задайте для IoStatus.Status значение STATUS_NOT_SUPPORTED.

Помимо отправки идентификатора запроса IRP, драйвер должен вызвать IoGetDeviceProperty , чтобы получить DevicePropertyEnumeratorName для устройства.

После завершения IRP и завершения работы драйвера с идентификатором драйвер должен освободить структуру идентификатора, возвращаемую драйвером, обрабатывающим IRP запроса.

Требования

Заголовок

Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h)

См. также

Строки идентификации устройства

IoGetDeviceProperty