Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Диспетчер PnP отправляет этот запрос, чтобы определить определенные связи между устройствами. Следующие типы драйверов обрабатывают этот запрос:
Водители шины должны обрабатывать запросы BusRelations для адаптера или контроллера (FDO шины). Драйверы фильтров могут обрабатывать запросы BusRelations .
Водители шины должны обрабатывать запросы TargetDeviceRelation для своих дочерних устройств (дочерние PDOS).
Драйверы функций и фильтров могут обрабатывать запросы RemovalRelations и PowerRelations .
Водители шины могут обрабатывать запросы EjectionRelations для своих дочерних устройств (дочерние PDOS).
Ценность
0x07
Основной код
При отправке
Диспетчер PnP отправляет этот IRP для сбора сведений об устройствах с отношением к указанному устройству.
Диспетчер PnP запрашивает busRelations устройства (дочерние устройства) при перечислении устройства и в другое время, когда устройство активно, например, когда драйвер вызывает подпрограмму IoInvalidateDeviceRelations , чтобы указать, что дочернее устройство прибыло или ушел.
Диспетчер PnP запрашивает удаление устройства перед удалением драйверов устройства. Диспетчер PnP запрашивает удалениеRelations и EjectionRelations перед извлечением устройства.
Диспетчер PnP запрашивает targetDeviceRelation устройства, когда драйвер или приложение пользовательского режима регистрирует уведомление PnP о событии EventCategoryTargetDeviceChange на устройстве. Диспетчер PnP запрашивает устройство, связанное с определенным объектом файла. IRP_MN_QUERY_DEVICE_RELATIONS является единственным PnP IRP с допустимым параметром объекта файла. Драйвер может запрашивать стек устройств для TargetDeviceRelation. Драйверу не нужно предоставлять объект файла при отправке запроса TargetDeviceRelation .
Диспетчер PnP запрашивает powerRelations устройства, когда драйвер для устройства вызывает IoInvalidateDeviceRelations , чтобы указать, что набор устройств, с которым это устройство имеет неявную связь управления питанием, изменилось. Запросы PowerRelations поддерживаются начиная с Windows 7.
Для запросов BusRelations, RemovalRelations, EjectionRelations и PowerRelations диспетчер PnP отправляет IRP_MN_QUERY_DEVICE_RELATIONS в IRQL = PASSIVE_LEVEL в контексте системного потока.
Для запросов TargetDeviceRelation диспетчер PnP отправляет этот IRP в IRQL = PASSIVE_LEVEL в произвольном контексте потока.
Входные параметры
Элемент Parameters.QueryDeviceRelations.Type структуры IO_STACK_LOCATION указывает тип связей, запрашиваемых. Возможные значения: BusRelations, EjectionRelations, RemovalRelations, TargetDeviceRelation и PowerRelations.
Элемент FileObject текущей структуры IO_STACK_LOCATION указывает на допустимый объект файла, только если Parameters.QueryDeviceRelations.Type — TargetDeviceRelation.
Выходные параметры
Возвращается в блоке состояния ввода-вывода.
Блок состояния ввода-вывода
Драйвер задает состояние STATUS_SUCCESS irp-IoStatus.Status> или состояние сбоя, например STATUS_INSUFFICIENT_RESOURCES.
При успешном выполнении драйвер задает Irp-IoStatus.Information> указатель PDEVICE_RELATIONS, указывающий на запрошенные сведения о отношениях. Структура DEVICE_RELATIONS определяется следующим образом:
typedef struct _DEVICE_RELATIONS {
ULONG Count;
PDEVICE_OBJECT Objects[1]; // variable length
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
Операция
Если драйвер возвращает отношения в ответ на эту IRP_MN_QUERY_DEVICE_RELATIONS, драйвер выделяет DEVICE_RELATIONS структуру из страницной памяти, содержащей количество и соответствующее количество указателей объектов устройства. Диспетчер PnP освобождает структуру, когда она больше не нужна. Если драйвер заменяет DEVICE_RELATIONS структуру, выделенную другим драйвером, драйвер должен освободить предыдущую структуру.
Драйвер должен ссылаться на PDO любого устройства, которое оно сообщает в этом IRP (ObReferenceObject). Диспетчер PnP удаляет ссылку при необходимости.
Драйвер функции или фильтра должен быть готов обрабатывать этот IRP для устройства в любое время после завершения процедуры AddDevice для устройства. Водители шины должны быть готовы обрабатывать запрос для BusRelations сразу после перечисления устройства.
Общие правила обработки дополнительных irps Plug and Play см. в разделе Plug and Play.
В следующих подразделах описываются конкретные действия по обработке различных запросов.
Запрос busRelations
Когда диспетчер PnP запрашивает связи шины (дочерние устройства) адаптера или контроллера, водитель шины должен вернуть список указателей на PDOS любых устройств, физически присутствующих на шине. Водитель шины сообщает всем устройствам независимо от того, были ли они запущены. Водителю шины может потребоваться включить устройство шины, чтобы определить, какие дети присутствуют.
Предупреждение Объект устройства нельзя передать в любую подпрограмму, которая принимает PDO в качестве аргумента, пока диспетчер PnP не создаст узел устройства (devnode) для этого объекта. (Если драйвер передает объект устройства, система будет проверять ошибку с помощью проверки ошибок 0xCA: PNP_DETECTED_FATAL_ERROR.) Диспетчер PnP создает devnode в ответ на запрос IRP_MN_QUERY_DEVICE_RELATIONS . Драйвер может безопасно предположить, что devnode PDO был создан при получении запроса IRP_MN_QUERY_RESOURCE_REQUIREMENTS .
Драйвер шины, реагирующий на этот IRP, является драйвером функции для адаптера шины или контроллера, а не родительского драйвера шины для шины, к которому подключен адаптер или контроллер. Драйверы функций для устройств, отличных от шины, не обрабатывают этот запрос. Такие водители просто передают IRP следующему нижнему драйверу. (См. следующий рисунок.) Драйверы фильтров обычно не обрабатывают этот запрос.
В Windows Vista и более поздних операционных системах рекомендуется, чтобы драйверы всегда задали IRP_MN_QUERY_DEVICE_RELATIONS IRP и завершают обработку позже. Этот порядок позволяет системе обрабатывать запросы отношения шины асинхронно. (В операционных системах до Windows Vista водители могут безопасно вернуть STATUS_PENDING из своих подпрограмм отправки, но диспетчер PnP не перекрывает запрос на связь шины с любой другой операцией.)
На следующей схеме показано, как водители обрабатывают запрос к отношениям шины.
В примере, показанном на рисунке, диспетчер PnP отправляет IRP_MN_QUERY_DEVICE_RELATIONS для BusRelations драйверам устройства USB-концентратора. Диспетчер PnP запрашивает список дочерних устройств концентратора.
Как и во всех PnP IRP, диспетчер PnP отправляет IRP в верхний драйвер в стеке устройств для устройства.
Дополнительный драйвер фильтра может быть главным драйвером в стеке. Драйвер фильтра обычно не обрабатывает этот IRP; он передает IRP вниз по стеку. Драйвер фильтра может обработать этот IRP, например, если драйвер предоставляет неумеримое устройство на шине.
Драйвер шины USB-концентратора обрабатывает IRP.
Драйвер шины USB-концентратора:
Создает PDO для любого дочернего устройства, которое еще не имеет одного.
Помечает неактивное PDO для любого устройства, которое больше не присутствует на шине. Драйвер шины не удаляет такие PDOS.Дополнительные сведения о том, когда нужно удалить PDOS, см. в разделе "Удаление устройства".
Сообщает о всех дочерних устройствах, присутствующих на шине.
Для каждого дочернего устройства драйвер шины ссылается на PDO и помещает указатель на PDO в структуру DEVICE_RELATIONS.
В этом примере есть два PDOS: один для устройства джойстика и один для устройства клавиатуры.
Водитель автобуса должен проверить, уже ли другой водитель создал DEVICE_RELATIONS структуру для этого IRP. В этом случае водитель автобуса должен добавить в существующую информацию.
Если на шине нет дочернего устройства, драйвер задает число нулю в структуре DEVICE_RELATIONS и возвращает успешное выполнение.
Задает соответствующие значения в блоке состояния ввода-вывода и передает IRP следующему нижнему драйверу. Драйвер шины для адаптера или контроллера не завершает IRP.
Необязательный нижний фильтр, если он присутствует, обычно не обрабатывает этот IRP. Такой драйвер фильтра передает IRP вниз по стеку. Если драйвер нижнего фильтра обрабатывает этот IRP, он может добавить PDO-адреса в список дочерних устройств, но он не должен удалять какие-либо PDOS, созданные другими драйверами.
Родительский драйвер шины не обрабатывает этот IRP, если только он не является единственным драйвером в стеке устройств (устройство находится в необработанном режиме). Как и во всех PnP IRP, родительский водитель шины завершает IRP с IoCompleteRequest.
Если в стеке устройств есть один или несколько драйверов фильтров шины, такие водители могут обрабатывать IRP на пути к водителю шины и /или на пути IRP резервного копирования стека устройств (если существуют подпрограммы IoCompletion ). Согласно правилам IRP PnP, такой драйвер может добавлять pdos в IRP на пути вниз по стеку и/или изменять список связей на пути резервного копирования стека (в подпрограммах IoCompletion ).
Запрос EjectionRelations
Драйвер возвращает указатели на POS любых устройств, которые могут быть физически удалены из системы при извлечении указанного устройства. Не сообщайте о дочерних файлах устройства; Диспетчер PnP всегда запрашивает удаление дочерних устройств перед родительским устройством.
Диспетчер PnP отправляет IRP_MN_EJECT IRP на устройство, которое удаляется. Драйвер для такого устройства также получает удаление IRP. Отношения извлечения устройства получают IRP_MN_REMOVE_DEVICE IRP (а не IRP_MN_EJECT IRP).
Только родительский водитель шины может отвечать на запрос EjectionRelations для одного из дочерних устройств. Драйверы функций и фильтров должны передать его следующему нижнему драйверу в стеке устройств. Если водитель шины получает этот IRP в качестве драйвера функции для своего адаптера или контроллера, водитель шины выполняет задачи водителя-функции и должен передать IRP следующему водителю ниже.
Запрос PowerRelations
Начиная с Windows 7 запрос PowerRelations позволяет водителю указать связь управления питанием вне обычной связи между родительской шиной, поддерживающей перечисление PnP и перечисленное дочернее устройство на шине. Например, если водитель автобуса не может перечислить дочернее устройство на автобусе или если устройство является дочерним из нескольких автобусов, запрос PowerRelations может описать отношения питания дочернего устройства с шиной или автобусами.
Диспетчер PnP выдает запрос PowerRelations для устройства, когда драйвер для устройства вызывает подпрограмму IoInvalidateDeviceRelations и задает значение параметра TypePowerRelations.
В ответ на этот запрос драйвер целевого устройства (т. е. устройство, которое является целевым объектом для запроса), предоставляет DEVICE_RELATIONS структуру , содержащую указатели на POS любых других устройств, которые должны быть включены диспетчером питания перед включением целевого устройства. И наоборот, эти другие устройства должны быть отключены только после отключения целевого устройства. Диспетчер питания использует данные из запроса, чтобы гарантировать, что эти устройства включены и отключены в правильном порядке.
Эта гарантия порядка применяется только к переходам состояния сна глобальной системы, которые включают переходы на состояния питания системы S1, S2, S3 (спящий режим), S4 (спящий режим) и S5 (завершение работы). Гарантия упорядочения PowerRelations не применяется к переходу состояния питания устройства Dx, пока система остается в состоянии системы S0 (запущено), за исключением случаев перехода управления питанием (DFx).
Если целевое устройство находится на пути к устройству для специального файла (например, разбиения по страницам, файла гибернации или файла аварийного дампа), драйвер целевого устройства должен выполнить дополнительный шаг при обработке IRP_MN_DEVICE_USAGE_NOTIFICATION IRP, в котором InPath имеет значение TRUE. Этот драйвер должен гарантировать, что устройства, чьи PDOS предоставляются для запроса PowerRelations , также могут поддерживаться в пути устройства для специального файла. Чтобы подтвердить эту поддержку, драйвер целевого устройства должен сначала отправить IRP_MN_DEVICE_USAGE_NOTIFICATION IRP на каждое из этих устройств, и этот IRP должен указать то же значение UsageNotification.Type , что и целевое устройство. Только если все устройства, получающие этот IRP, завершают IRP с кодом состояния успешного выполнения, драйвер целевого устройства успешно завершает свой IRP_MN_DEVICE_USAGE_NOTIFICATION IRP. В противном случае этот драйвер должен завершить этот IRP с кодом состояния сбоя.
Если этот же драйвер обрабатывает IRP_MN_DEVICE_USAGE_NOTIFICATION IRP, для которого InPath имеет значение FALSE, драйвер должен отправить IRP_MN_DEVICE_USAGE_NOTIFICATION IRP в тот же набор зависимых устройств, что и в случае, когда InPath имеет значение TRUE. Однако драйвер никогда не должен завершить этот IRP с кодом состояния сбоя, если InPath имеет значение FALSE.
Драйвер, реагирующий на запрос PowerRelations , должен зарегистрировать уведомления об изменении целевого устройства на всех устройствах, чей PDOS предоставляется для запроса PowerRelations . Чтобы зарегистрировать эти уведомления, драйвер может вызвать подпрограмму IoRegisterPlugPlayNotification и указать значение параметра EventCategoryTargetDeviceChange.
Запрос на удалениеRelations
Драйвер возвращает указатели на POS любых устройств, драйверы которых должны быть удалены при удалении драйверов для указанного устройства. Не сообщайте о дочерних файлах устройства; Диспетчер PnP уже запрашивает удаление дочерних устройств перед удалением устройства.
Порядок удаления, в котором удаляются отношения удаления, не определен.
Любой драйвер в стеке устройств может обрабатывать этот тип запроса отношений. Функция или драйвер фильтра обрабатывает IRP перед передачей его следующему нижнему драйверу. Водитель автобуса обрабатывает IRP, а затем завершает его.
Запрос TargetDeviceRelation
Запрос TargetDeviceRelation позволяет диспетчеру PnP запрашивать стек устройств, отличный от PnP, для PDO в стеке устройств PnP, который управляет оборудованием.
Как правило, драйверы перенаправят IRP_MN_QUERY_DEVICE_RELATIONS IRP вниз по стеку, пока IRP не достигнет нижней части определенного стека устройств. Драйвер в нижней части стека, отличного от PnP, перенаправит или повторно выдает IRP в соответствующий стек PnP. Например, диспетчер PnP может отправить запрос TargetDeviceRelation в объект устройства в верхней части стека файловой системы, который является стеком, отличным от PnP. Каждый объект устройства в стеке файловой системы передает запрос объекту устройства под ним, пока запрос не достигнет объекта устройства в нижней части стека. Самый низкий объект устройства в стеке перенаправит или повторно выдает запрос TargetDeviceRelation объекту устройства в верхней части стека томов хранилища PnP, а затем запрос будет передан в PDO в нижней части стека томов хранилища.
В следующем списке приведены ситуации, в которых можно безопасно получить указатель на PDO в нижней части стека устройств PnP:
Объект устройства в PnP
Объект устройства, который находится в стеке устройств PnP, узнает о PDO стека при вызове подпрограммы AddDevice для устройства. Драйвер может безопасно кэшировать указатель на PDO, если использование указателя правильно синхронизировано с входящими IRP_MN_REMOVE_DEVICE сообщениями с помощью подпрограмм блокировки удаления.
Объект устройства в стеке, отличном от PnP, а не в нижней части стека
Для объекта устройства, который не находится в нижней части стека, отличного от PnP, драйвер может отправить запрос TargetDeviceRelation , чтобы получить указатель на PDO в нижней части соответствующего стека устройств PnP.
Файловый объект для устройства
Учитывая объект файла для устройства, драйвер может вызвать IoGetRelatedDeviceObject , чтобы получить объект устройства, а затем следуйте инструкциям в предыдущем элементе списка.
Обработка объекта устройства
Учитывая дескриптор объекта устройства, драйвер может вызвать ObReferenceObjectByHandle , чтобы получить объект файла для устройства, а затем следовать инструкциям в предыдущем элементе списка.
Родительский драйвер шины должен обрабатывать запрос отношений TargetDeviceRelation для своих дочерних устройств. Драйвер шины ссылается на PDO дочернего устройства с ObReferenceObject и возвращает указатель на PDO в структуре DEVICE_RELATIONS . Существует только один указатель PDO в структуре для этого типа отношения. Диспетчер PnP удаляет ссылку на PDO при отмене регистрации драйвера или приложения для уведомления на устройстве.
Только родительский драйвер шины отвечает на запрос TargetDeviceRelation . Драйверы функций и фильтров должны передать его следующему нижнему драйверу в стеке устройств. Если водитель шины получает этот IRP в качестве драйвера функции для своего адаптера или контроллера, водитель шины выполняет задачи водителя-функции и должен передать IRP следующему водителю ниже.
Если драйвер не находится в стеке на основе PDO, драйвер отправляет новый запрос на отношение целевого устройства к объекту устройства, связанному с дескриптором файла, на котором драйвер выполняет операции ввода-вывода.
Отправка этого IRP
Драйверы не должны отправлять IRP_MN_QUERY_DEVICE_RELATIONS для запроса BusRelations. Драйверы не ограничены отправкой этого IRP для удаленияRelations или EjectionRelations, но, скорее всего, драйвер сделает это не так.
Драйверы могут запрашивать стек устройств для TargetDeviceRelation. Сведения об отправке IRP см. в разделе об обработке IRP . Следующие действия применяются специально к этому IRP:
Задайте значения в следующем расположении стека операций ввода-вывода iRP: задайте для параметра MajorFunctionзначение IRP_MJ_PNP, задайте значение MinorFunctionдля IRP_MN_QUERY_DEVICE_RELATIONS, задайте параметр Parameters.QueryDeviceRelations.Type значение TargetDeviceRelation и задайте для объекта файла Irp-FileObject> допустимый объект файла.
Инициализация IoStatus.Status в STATUS_NOT_SUPPORTED.
Если драйвер отправил этот IRP, чтобы получить PDO для отчета в ответ на IRP_MN_QUERY_DEVICE_RELATIONS для TargetDeviceRelation , полученный драйвером, драйвер сообщает PDO и освобождает возвращаемую структуру отношений после завершения IRP. Если драйвер инициировал этот IRP по другой причине, драйвер освобождает структуру отношений, когда IRP завершает и разыменовывает PDO, когда он больше не нужен.
Требования
Заголовок |
Wdm.h (включая Wdm.h, Ntddk.h или Ntifs.h) |
См. также
IoRegisterPlugPlayNotification
IRP_MN_DEVICE_USAGE_NOTIFICATION