IRP_MN_QUERY_CAPABILITIES

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

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

Значение

0x09

Основной код

IRP_MJ_PNP

При отправке

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

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

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

Элемент 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 до завершения работы с более низкими драйверами см. в разделе Plug and Play.

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

При обработке IRP_MN_QUERY_CAPABILITIES IRP драйвер, который является диспетчером политик питания для устройства, должен задать подпрограмму IoCompletion и скопировать возможности питания устройства, такие как сопоставления состояний питания S-D, на пути IRP резервное копирование стека устройств. Чтобы определить возможности питания дочернего устройства, драйвер родительской шины создает другой IRP-capabilities query-capabilities и отправляет IRP его родительскому драйверу. Дополнительные сведения см. в статье Возможности управления питанием устройств отчетов.

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

Драйверы, обрабатывающие этот IRP, могут задавать некоторые DEVICE_CAPABILITIES поля, но не должны задавать поля Размер и Версия . Эти поля задаются только компонентом, отправляющим IRP.

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

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

Водитель автобуса отправляет это IRP родительскому стеку устройств при обработке запроса IRP_MN_QUERY_CAPABILITIES для одного из своих дочерних устройств. Кроме того, драйвер может отправить это IRP, чтобы получить возможности устройства для одного из своих устройств. Один драйвер в стеке содержит только часть сведений о возможностях устройства; Отправка IRP в стек устройств позволяет ему собирать полную картину, включая изменения любых драйверов фильтров и т. д.

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

  • Выделите структуру DEVICE_CAPABILITIES из выстраивного пула и инициализируйте ее нулями, вызвав RtlZeroMemory. Инициализируйте значение Size равным sizeof(DEVICE_CAPABILITIES), version — 1, а для параметра Address and UINumber — значение -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)

См. также раздел

DEVICE_CAPABILITIES