Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.
Архивные примеры UMDF 1 можно найти в Windows 11, версия 22H2 — обновление драйверов за май 2022 года.
Дополнительные сведения см. в разделе Начало работы сUMDF.
Выполняющиеся операции ввода-вывода устройства (например, запрос на чтение нескольких блоков с диска) могут быть отменены приложением, системой или драйвером. Если операция ввода-вывода устройства отменена, диспетчер операций ввода-вывода пытается отменить все необработанные запросы ввода-вывода, связанные с операцией ввода-вывода. Драйверы устройства могут регистрироваться для получения уведомлений, когда диспетчер ввода-вывода пытается отменить запросы ввода-вывода, и могут отменять принадлежащие им запросы, завершив их со статусом завершения HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED).
Фреймворк обрабатывает часть работы по отмене для драйверов, основанных на фреймворке. Если операция ввода-вывода устройства была отменена, фреймворк завершает следующие запросы ввода-вывода, связанные с этой операцией, с состоянием завершения HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED).
Незавершенные запросы ввода-вывода, которые фреймворк помещал в очередь ввода-вывода драйвера по умолчанию.
Незавершенные запросы ввода-вывода, которые фреймворк перенаправил в другую очередь, так как драйвер вызвал IWDFIoQueue::ConfigureRequestDispatching.
Так как платформа отменяет эти запросы, она не доставляет их драйверу.
После того как платформа доставила драйверу запрос ввода-вывода, драйвер владеет запросом, и платформа не может отменить его. На этом этапе только драйвер может отменить запрос ввода-вывода, но платформа должна уведомить водителя о том, что запрос должен быть отменен. Драйверы получают это уведомление, предоставляя функцию обратного вызова IRequestCallbackCancel::OnCancel.
Иногда драйвер получает запрос ввода-вывода из очереди ввода-вывода, но вместо обработки запроса драйвер повторно запрашивает запрос к той же или другой очереди ввода-вывода для последующей обработки. Например, фреймворк может доставлять запрос ввода-вывода одному из обработчиков запросов драйвера, а драйвер может вызвать либо IWDFIoRequest::ForwardToIoQueue, чтобы поместить запрос в другую очередь, или IWDFIoRequest2::Requeue, чтобы поместить запрос обратно в ту же очередь.
В таких случаях платформа может отменить запрос ввода-вывода, так как запрос находится в очереди ввода-вывода. Однако если драйвер зарегистрировал функцию обратного вызова для очереди ввода-вывода, в которой находится запрос, платформа вызывает функцию обратного вызова вместо отмены запроса при отмене связанной операции ввода-вывода. Если платформа вызывает функцию обратного вызова драйвера, драйвер должен отменить запрос.
В итоге при отмене операции ввода-вывода платформа всегда отменяет все связанные запросы ввода-вывода, которые никогда не были доставлены драйверу. Если драйвер получает запрос, а затем повторно отправляет запрос, платформа отменит запрос (если запрос находится в очереди), если драйвер не предоставляет функцию обратного вызова для очереди ввода-вывода.
Совершён вызов MarkCancelable
Драйвер может вызывать IWDFIoRequest::MarkCancelable для регистрации функции обратного вызова IRequestCallbackCancel::OnCancel обратного вызова. Если драйвер вызвал MarkCancelableи если операция ввода-вывода, связанная с запросом, отменена, фреймворк вызывает функцию обратного вызова OnCancel, чтобы драйвер мог отменить запрос ввода-вывода.
Водитель должен позвонить по MarkCancelable, если он будет иметь запрос в течение относительно долгого времени. Например, драйверу может потребоваться дождаться ответа устройства или ожидать завершения набора запросов более низкими драйверами, которые были созданы драйвером при получении одного запроса.
Если драйвер не вызывает MarkCancelableили вызывает IWDFIoRequest::UnmarkCancelable после вызова MarkCancelable, драйвер не осведомлён об отмене и поэтому обрабатывает запрос как обычно.
Вызов метода IsCanceled
Если драйвер не вызвал MarkCancelable, чтобы зарегистрировать функцию обратного вызова OnCancel, он может вызвать IWDFIoRequest2::IsCanceled, чтобы определить, пытался ли диспетчер ввода-вывода отменить запрос ввода-вывода. Если IsCanceled возвращает TRUE, драйвер должен отменить запрос.
Например, драйвер, который получает большой запрос на чтение или запись и разбивает его на несколько небольших запросов, может вызвать IsCanceled после того, как целевой объект драйвера завершит каждый из небольших запросов, если драйвер не сделал запрос отменяемым с помощью MarkCancelable.
Отмена запроса
Отмена запроса ввода-вывода может включать любой из следующих действий:
Остановка выполняющейся операции ввода-вывода.
Запрос не перенаправляется на целевой объект ввода-вывода.
Вызов IWDFIoRequest::CancelSentRequest, чтобы попытаться отменить запрос, который драйвер ранее отправил в целевой объект ввода-вывода.
Если драйвер отменяет запрос ввода-вывода для объекта запроса, полученного от фреймворка, драйвер должен всегда выполнять запрос путем вызова IWDFIoRequest::Complete или IWDFIoRequest::CompleteWithInformation с параметром CompletionStatus HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED). (Если драйвер вызывает IWDFDevice::CreateRequest для создания объекта запроса, драйвер вызывает IWDFObject::DeleteWdfObject вместо завершения запроса.)