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


Повторная постановка в очередь запросов ввода-вывода

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

Повторная постановка запроса ввода-вывода в другую очередь ввода-вывода для устройства

Когда обработчики запросов драйвера получают запрос ввода-вывода из очереди ввода-вывода драйвера, драйвер может вызвать WdfRequestForwardToIoQueue , чтобы повторно отправить запрос в другую очередь.

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

Если драйвер вызывает WdfRequestForwardToIoQueue для повторной отправки запроса ввода-вывода, полученного драйвером из очереди ввода-вывода, которая использует метод последовательной диспетчеризации, платформа доставляет следующий запрос ввода-вывода из последовательной очереди драйверу, не дожидаясь завершения повторного запроса.

Если драйвер использует метод диспетчеризации вручную, он может вызвать метод WdfRequestRequeue , чтобы вернуть запрос ввода-вывода руководителю очереди ввода-вывода, из которой драйвер получил его. После вызова WdfRequestRequeue следующий вызов драйвера к WdfIoQueueRetrieveNextRequest извлекает запрос повторной отправки.

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

Драйвер функции для родительского устройства может выступать в качестве драйвера шины , который перечисляет дочерние устройства родительского устройства и создает физические объекты устройств (PDO) для дочерних устройств. Такие драйверы иногда могут получать запросы ввода-вывода для дочернего устройства, которое должно обрабатывать родительское устройство.

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

Однако драйверы не могут вызывать WdfRequestForwardToIoQueue для перемещения запросов из дочерней очереди в родительскую. Так как диспетчер ввода-вывода создает отдельные стеки устройств для родительского и дочернего устройств, базовый объект устройства WDM необходимо сначала изменить с объекта, представляющего дочернее устройство, на объект, представляющий родительское устройство.

До версии 1.9 KMDF драйверы могли отправлять запросы ввода-вывода от дочернего устройства только его родительскому устройству, создавая удаленные целевые объекты ввода-вывода, увеличив размер стека устройств дочернего устройства и указывая правильный объект устройства WDM.

Начиная с KMDF версии 1.9 драйвер может вызвать WdfPdoInitAllowForwardingRequestToParent перед созданием дочернего устройства, а затем вызвать WdfRequestForwardToParentDeviceIoQueue , чтобы повторно отправить запрос из очереди ввода-вывода дочернего объекта в родительскую очередь. Если драйвер используетWdfPdoInitAllowForwardingRequestToParent и WdfRequestForwardToParentDeviceIoQueue, платформа увеличивает размер стека дочерних устройств и назначает правильный объект устройства WDM запросу ввода-вывода.