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


Отправка запросов ввода-вывода в общий целевой объект ввода-вывода в UMDF

Предупреждение

UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.

Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — обновление примеров драйверов за май 2022 г.

Дополнительные сведения см. в разделе начало работы с помощью UMDF.

Драйвер UMDF может отправлять запросы ввода-вывода общим целевым объектам ввода-вывода синхронно или асинхронно.

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

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

Прежде чем драйвер UMDF сможет отправить запрос ввода-вывода целевому объекту ввода-вывода, драйвер должен отформатировать запрос. В следующей таблице перечислены методы, которые драйвер может вызывать для форматирования запросов ввода-вывода. Драйвер может использовать эти методы для форматирования запроса, полученного драйвером в одной из очередей ввода-вывода или созданного драйвером.

Метод Цель

IWDFIoRequest::FormatUsingCurrentType

Форматирует запрос, полученный драйвером от платформы, чтобы драйвер смог отправить запрос без изменений в целевой объект.

IWDFIoTarget::FormatRequestForIoctl

Форматирует запрос на управление устройством

IWDFIoTarget::FormatRequestForRead

Форматирует запрос на чтение

IWDFIoTarget::FormatRequestForWrite

Форматирует запрос на запись

IWDFIoTarget2::FormatRequestForFlush

Форматирует запрос на очистку буферов.

IWDFIoTarget2::FormatRequestForQueryInformation

Форматирует запрос для получения сведений о файле.

IWDFIoTarget2::FormatRequestForSetInformation

Форматирует запрос для задания сведений о файле.

Чтобы отправить запрос ввода-вывода целевому объекту ввода-вывода, драйвер вызывает метод IWDFIoRequest::Send . Чтобы отправить запрос ввода-вывода синхронно, драйвер передает флаг WDF_REQUEST_SEND_OPTION_SYNCHRONOUS в параметр Flags . В противном случае драйвер отправляет запрос ввода-вывода асинхронно. Если драйвер отправляет запрос ввода-вывода асинхронно, драйвер обычно требует уведомления, когда другой драйвер завершает запрос. Драйвер должен определить функцию обратного вызова IRequestCallbackRequestCompletion::OnCompletion и зарегистрировать ее, вызвав метод IWDFIoRequest::SetCompletionCallback . Дополнительные сведения см. в разделе Завершение запросов ввода-вывода.

Драйвер, вызывающий IWDFIoRequest::Send для отправки запроса ввода-вывода, может попытаться отменить запрос позже, вызвав метод IWDFIoRequest::CancelSentRequest . Если драйвер отменяет запрос ввода-вывода, полученный драйвером от платформы, драйвер всегда должен завершить запрос, вызвав метод IWDFIoRequest::Complete или IWDFIoRequest::CompleteWithInformation с параметром CompletionStatus, для STATUS_CANCELLED. Если драйвер создал объект запроса, драйвер вместо завершения запроса вызывает IWDFObject::D eleteWdfObject .