IRP_MN_QUERY_CAPABILITIES
Диспетчер PnP отправляет эту функцию IRP, чтобы получить возможности устройства, например, можно ли заблокировать или извлечь устройство.
Драйверы функций и фильтров могут обрабатывать этот запрос, если они изменяют возможности, поддерживаемые драйвером шины. Водители шины должны обрабатывать этот запрос для своих дочерних устройств.
Значение
0x09
Основной код
При отправке
Диспетчер PnP отправляет этот IRP водителю шины для устройства сразу после перечисления устройства. Диспетчер PnP снова отправляет этот IRP после запуска устройства всех драйверов для устройства. Драйвер может отправить этот IRP, чтобы получить возможности для устройства.
Диспетчер PnP и драйверы отправляют этот IRP в IRQL PASSIVE_LEVEL в произвольном контексте потока.
Входные параметры
Элемент Parameters.DeviceCapabilities.Capabilities структуры IO_STACK_LOCATION указывает на DEVICE_CAPABILITIES структуру, содержащую сведения о возможностях устройства.
Выходные параметры
Parameters.DeviceCapabilities.Capabilities указывает на структуру DEVICE_CAPABILITIES , которая отражает любые изменения, внесенные драйверами, обрабатывающими IRP.
Блок состояния ввода-вывода
Драйвер задает состояние Irp-IoStatus.Status> STATUS_SUCCESS или соответствующее состояние ошибки, например STATUS_UNSUCCESSFUL.
Если функция или драйвер фильтра не обрабатывает этот IRP, он вызывает IoSkipCurrentIrpStackLocation и передает IRP до следующего драйвера. Такой драйвер не должен изменять Irp-IoStatus.Status> и не должен завершить IRP.
Драйвер шины задает Irp-IoStatus.Status> и завершает IRP.
Операция
При перечислении устройства, но до загрузки драйверов функций и фильтров для устройства диспетчер PnP отправляет запрос IRP_MN_QUERY_CAPABILITIES драйверу родительской шины для устройства. Драйвер шины должен задать все соответствующие значения в структуре DEVICE_CAPABILITIES и вернуть его диспетчеру PnP.
После создания стека устройств и запуска драйверов диспетчер PnP снова отправляет этот IRP, чтобы обрабатываться драйвером в верхней части стека устройств, а затем каждым нижним драйвером в стеке. Драйверы функций и фильтров могут задавать подпрограмму IoCompletion и обрабатывать эту функцию IRP на пути резервного копирования стека устройств.
Драйверы должны добавить возможности перед передачей IRP следующему нижнему драйверу.
Драйверы должны удалить возможности после завершения работы всех более низких драйверов с помощью IRP. Драйвер обычно не удаляет возможности, которые были установлены другими драйверами, но это может сделать, если у него есть специальные сведения о возможностях устройства в определенной конфигурации. Сведения об отложении обработки IRP до завершения обработки более низких драйверов см. в самонастраивающийся.
После перечисления устройства и загрузки драйверов его возможности не должны изменяться. Возможности устройства могут измениться, если устройство удалено и переначислено.
При обработке IRP_MN_QUERY_CAPABILITIES IRP драйвер, который является диспетчером политик питания для устройства, должен задать подпрограмму IoCompletion и скопировать возможности питания устройства, такие как сопоставления состояний питания "S-to-D", на пути резервного копирования стека устройств IRP. Чтобы определить возможности питания дочернего устройства, родительский драйвер шины создает еще одну функцию IRP запросов и отправляет IRP родительскому драйверу. Дополнительные сведения см. в разделе "Возможности питания устройств отчетов".
Если драйвер обрабатывает этот IRP, он должен проверить значение версии DEVICE_CAPABILITIES. Если это значение не является версией, которую поддерживает драйвер, драйвер должен завершиться ошибкой IRP. Если версия поддерживается, драйвер должен проверить поле "Размер ". Драйвер должен задать только те поля, которые находятся в пределах структуры возможностей, полученной в качестве входных данных.
Драйверы, обрабатывающие этот IRP, могут задавать некоторые поля DEVICE_CAPABILITIES , но не должны задавать поля "Размер " и "Версия ". Эти поля задаются только компонентом, отправляющим IRP.
Общие правила обработки самонастраивающийся дополнительных irps см. в самонастраивающийся.
Отправка этого IRP
Драйвер шины отправляет этот IRP в стек родительского устройства при обработке запроса IRP_MN_QUERY_CAPABILITIES для одного из дочерних устройств. Кроме того, драйвер может отправить этот IRP, чтобы получить возможности устройства для одного из его устройств. Один драйвер в стеке содержит только часть сведений о возможностях для устройства; Отправка IRP в стек устройств позволяет собирать полную картину, включая изменения любыми драйверами фильтров и т. д.
Сведения об отправке IRP см. в разделе об обработке IRP . Следующие действия применяются специально к этому IRP:
Выделите DEVICE_CAPABILITIES структуру из пула страниц и инициализировать ее до нуля, вызвав RtlZeroMemory. Инициализировать размер до sizeof(DEVICE_CAPABILITIES), версию до 1 и адрес и идентификатор пользовательского интерфейса до -1.
Задайте значения в следующем расположении стека операций ввода-вывода iRP: задайте значение MajorFunction для IRP_MJ_PNP, задайте значение MinorFunction для IRP_MN_QUERY_CAPABILITIES и задайте параметр Parameters.DeviceCapabilities указатель на выделенную структуру DEVICE_CAPABILITIES.
Инициализация IoStatus.Status в STATUS_NOT_SUPPORTED.
Отмените выделение IRP и DEVICE_CAPABILITIES структуры, когда они больше не нужны.
Требования
Верхний колонтитул |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |