Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
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::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 вместо завершения запроса.