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


Отправка запросов ввода-вывода в общий целевой объект ввода-вывода в 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 (форматирование запроса для сброса)

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

#B0 #A1 IWDFIoTarget2::FormatRequestForQueryInformation #A2 #C3

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

IWDFIoTarget2::FormatRequestForSetInformation

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

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

Драйвер, вызывающий IWDFIoRequest::Send для отправки запроса ввода-вывода, может попытаться отменить запрос позже, вызвав метод IWDFIoRequest::CancelSentRequest. Если драйвер отменяет запрос ввода-вывода, полученный драйвером от фреймворка, драйвер всегда должен завершить запрос, вызвав метод #B0 #A1 IWDFIoRequest::Complete #A2 #C3 или #B4 #A5 IWDFIoRequest::CompleteWithInformation #A6 #C7 с параметром #B8 CompletionStatus #C9, установленным в значение STATUS_CANCELLED. Если драйвер создал объект запроса, он вызывает IWDFObject::DeleteWdfObject вместо завершения запроса.