Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйверы могут повторно запрашивать запросы ввода-вывода, полученные из очереди ввода-вывода. Драйвер может повторно запросить запрос ввода-вывода в другую очередь ввода-вывода, созданную драйвером для того же устройства. Кроме того, контроллер шины может перенаправить запрос ввода-вывода из очереди ввода-вывода дочернего устройства в очередь ввода-вывода родительского устройства.
Перенаправление запроса ввода-вывода в другую очередь ввода-вывода для устройства
После того как обработчики запросов драйвера получают запрос ввода-вывода из очереди ввода-вывода драйвера, драйвер может вызвать WdfRequestForwardToIoQueue , чтобы повторно отправить запрос в другую очередь.
Например, если вы хотите, чтобы драйвер выделяет ресурсы для запроса перед обработкой запроса, функция обратного вызова EvtIoDefault драйвера может получать все запросы, хранить сведения о ресурсах в памяти контекста каждого запроса, а затем вызывать WdfRequestForwardToIoQueue , чтобы повторно запросить каждый запрос в дополнительную очередь.
Если драйвер вызывает WdfRequestForwardToIoQueue для повторного запроса ввода-вывода, полученного драйвером из очереди ввода-вывода, использующим последовательный метод диспетчеризации, платформа доставляет следующий запрос ввода-вывода из последовательной очереди драйверу, не ожидая завершения повторного запроса.
Если драйвер использует метод ручной диспетчеризации, он может вызвать метод WdfRequestRequeue , чтобы вернуть запрос ввода-вывода в голову очереди ввода-вывода, из которой драйвер получил его. После вызова WdfRequestRequeue следующий вызов драйвера к WdfIoQueueRetrieveNextRequest извлекает повторно полученный запрос.
Повторная постановка запроса ввода-вывода в очередь ввода-вывода родительского устройства
Функциональный драйвер родительского устройства может выступать в качестве драйвера шины, который перечисляет дочерние устройства родительского устройства и создает объекты физического устройства (PDOs) для дочерних устройств. Такие драйверы иногда могут получать запросы ввода-вывода для дочернего устройства, которое должно обрабатывать родительское устройство.
Например, шина протокола (например, USB) обычно управляет аппаратными ресурсами, назначенными каждому подключенного устройства. Поэтому драйвер-функция родительской шины обычно обрабатывает операции ввода-вывода для каждого дочернего устройства. Когда диспетчер ввода-вывода отправляет запрос ввода-вывода в стек устройств одного из дочерних устройств, функциональный драйвер для шины получает этот запрос в одной из очередей ввода-вывода дочернего устройства, поскольку именно этот драйвер создал PDO дочернего устройства. Прежде чем драйвер может обработать запрос ввода-вывода в контексте родительского устройства шины, он должен повторно отправить запрос ввода-вывода из очереди ввода-вывода дочернего устройства в очередь ввода-вывода, принадлежащую родительскому устройству.
Однако драйверы не могут вызывать WdfRequestForwardToIoQueue для перемещения запросов из очереди дочернего объекта в очередь родителя. Так как диспетчер ввода-вывода создает отдельные стеки устройств для родительских и дочерних устройств, базовый объект устройства WDM сначала должен быть изменен с одного, представляющего дочернее устройство, на одно, представляющее родительское.
До версии 1.9 KMDF драйверы могут отправлять запросы ввода-вывода с дочернего устройства на родительское устройство только путем создания удаленных целевых объектов ввода-вывода, увеличения размера стека устройств дочернего устройства и указания правильного объекта устройства WDM.
Начиная с KMDF версии 1.9 драйвер может вызвать WdfPdoInitAllowForwardingRequestToParent перед созданием дочернего устройства, а затем вызвать WdfRequestForwardToParentDeviceIoQueue , чтобы повторно запросить запрос из очереди ввода-вывода ребенка в родительскую очередь. Если драйвер использует WdfPdoInitAllowForwardingRequestToParent и WdfRequestForwardToParentDeviceIoQueue, фреймворк увеличивает размер стека устройств дочернего объекта и назначает правильный объект устройства WDM запросу ввода-вывода.