Отправка запросов ввода-вывода в общий целевой объект ввода-вывода в 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::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 .