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


Пересылка запросов ввода-вывода

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

  • Он пересылает полученный запрос другому драйверу.

  • Он создает дополнительные запросы и отправляет их другому драйверу.

Драйверы на основе платформы пересылают запросы с помощью целевых объектов ввода-вывода, представляющих другие драйверы в системе. Драйверы могут использовать любой из следующих методов для пересылки запроса в целевой объект ввода-вывода:

  • Драйвер может пересылать запросы ввода-вывода на следующий уровень драйвера, вызвав WdfDeviceGetIoTarget, а затем WdfRequestFormatRequestUsingCurrentType и, наконец, WdfRequestSend.

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

  • Драйвер может вызвать WdfFdoInitSetFilter , чтобы зарегистрировать себя в качестве драйвера фильтра.

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

  • Как правило, драйвер функции проверяет содержимое каждого запроса ввода-вывода. Если драйвер функции не может обработать запрос, он может изменить запрос и перенаправить его в целевой объект ввода-вывода. Кроме того, он может создать один или несколько новых запросов и отправить их в целевой объект ввода-вывода.

    Целевой объект ввода-вывода платформы определяет несколько методов отправки запросов ввода-вывода другим драйверам. Например, драйвер может вызывать WdfIoTargetFormatRequestForRead, за которым следует WdfRequestSend, чтобы отправить запрос на чтение целевому объекту ввода-вывода. Дополнительные сведения о целевых объектах ввода-вывода см. в разделе Использование целевых объектов ввода-вывода.

    Редко автор драйвера может потребовать указать содержимое базового WDM расположения стека операций ввода-вывода перед отправкой запроса к целевому объекту ввода-вывода. В таких случаях драйвер может вызывать WdfRequestWdmFormatUsingStackLocation перед вызовом WdfRequestSend.

Иногда драйвер должен отправлять один и тот же запрос нескольким целевым объектам ввода-вывода, так как драйвер должен отправлять одну команду всем его устройствам. Перед отправкой запроса в целевой объект ввода-вывода драйвер может вызвать WdfRequestChangeTarget , чтобы убедиться, что целевой объект ввода-вывода доступен.

Драйвер должен в конечном итоге завершить каждый запрос, который он перенаправляет в целевой объект ввода-вывода, если только он не задает флаг WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET при вызове WdfRequestSend.

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