Переадресация запросов ввода-вывода
Когда драйвер получает запрос ввода-вывода, который он не может обработать, он обычно выполняет одно из следующих действий:
Он перенаправит полученный запрос другому драйверу.
Он создает дополнительные запросы и отправляет их другому драйверу.
Драйверы на основе платформы перенаправляют запросы с помощью целевых объектов ввода-вывода, которые представляют другие драйверы в системе. Драйверы могут использовать любой из следующих методов для пересылки запроса в целевой объект ввода-вывода:
Драйвер может перенаправлять запросы ввода-вывода в следующий ниже драйвер, вызывая WdfDeviceGetIoTarget, затем WdfRequestFormatRequestUsingCurrentType и, наконец, WdfRequestSend.
Этот метод полезен, только если драйвер получает запрос, который ему не нужно изменять перед переадресовкой.
Драйвер может вызвать WdfFdoInitSetFilter , чтобы зарегистрировать себя в качестве драйвера фильтра.
Если драйвер фильтра не предоставляет очередь ввода-вывода для определенного типа запроса ввода-вывода, платформа автоматически перенаправит запросы этого типа в следующий драйвер ниже.
Как правило, драйвер функции проверяет содержимое каждого запроса ввода-вывода. Если драйвер функции не может обработать запрос, он может изменить запрос и перенаправить его в целевой объект ввода-вывода. Кроме того, он может создать один или несколько новых запросов и отправить их в целевой объект ввода-вывода.
Целевой объект ввода-вывода платформы определяет несколько методов отправки запросов ввода-вывода другим драйверам. Например, драйвер может вызвать WdfIoTargetFormatRequestForRead, а затем WdfRequestSend, чтобы отправить запрос на чтение целевому объекту ввода-вывода. Дополнительные сведения о целевых объектах ввода-вывода см. в разделе Использование целевых объектов ввода-вывода.
В редких случаях средству записи драйверов может потребоваться указать содержимое базового стека ввода-вывода WDM перед отправкой запроса в целевой объект ввода-вывода. В таких случаях драйвер может вызвать WdfRequestWdmFormatUsingStackLocation перед вызовом WdfRequestSend.
Иногда драйвер должен отправить один и тот же запрос нескольким целевым объектам ввода-вывода, как правило, потому, что драйвер должен отправить одну команду на все свои устройства. Перед отправкой запроса к целевому объекту ввода-вывода драйвер может вызвать WdfRequestChangeTarget , чтобы убедиться, что целевой объект ввода-вывода доступен.
В конечном итоге драйвер должен завершить каждый запрос, который он перенаправляет в целевой объект ввода-вывода, если он не устанавливает флаг WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET при вызове WdfRequestSend.
Обратите внимание, что когда драйвер перенаправит запрос, платформа не передает объект запроса платформы от отправляющего драйвера принимающему драйверу. Вместо этого платформа создает новый объект запроса в драйвере, который получает запрос. Только базовый пакет запроса ввода-вывода (IRP) запроса передается из одного драйвера в другой.