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


IRP_MN_QUERY_ID

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

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

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

Примечание Драйверы функций и драйверы фильтров не обрабатывают этот 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 или соответствующее состояние ошибки.

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

Операция

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

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

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

  • Строка REG_MULTI_SZ в ответ на запрос BusQueryHardwareIDs или 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 драйвер шины должен предоставить строку, содержащую идентификатор экземпляра для устройства. Драйверы установки и шины используют идентификатор экземпляра с другими сведениями, чтобы различать два идентичных устройства на компьютере. Идентификатор экземпляра уникален на всем компьютере или просто уникален в родительской шине устройства.

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

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

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

Значения, предоставляемые драйвером шины для BusQueryHardwareID и BusQueryCompatibleIDs, позволяют программе установки найти соответствующие драйверы для дочернего устройства шины.

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

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

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

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

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

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

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

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

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

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

  • Водитель автобуса ранее указал возможность съемных носителей false в ответ на запрос IRP_MN_QUERY_CAPABILITIES устройства.

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

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

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

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