Настройка режима диспетчеризации для очереди ввода-вывода
Предупреждение
UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.
Архивные примеры UMDF 1 можно найти в Windows 11 версии 22H2 — обновление примеров драйверов за май 2022 г.
Дополнительные сведения см. в разделе начало работы с помощью UMDF.
При поступлении запросов ввода-вывода от приложений платформа помещает каждый запрос в соответствующую очередь ввода-вывода. Способ и время доставки запросов драйверу зависит от того, как драйвер настраивает диспетчеризацию для очереди ввода-вывода, и от того, как драйвер задает синхронизацию функции обратного вызова. Очередь ввода-вывода также взаимодействует с PnP и подсистемой управления питанием UMDF для хранения запросов ввода-вывода в очереди до тех пор, пока устройство не достигнет нужного состояния.
Примечание Режим диспетчеризации для очереди ввода-вывода не связан с режимом синхронизации. Конфигурация диспетчеризации очереди ввода-вывода управляет количеством запросов, которые драйвер может принять для обработки в любой момент времени, а синхронизация управляет одновременным выполнением функций обратного вызова событий, которые представляют или отменяют запросы. Однако несколько режимов работы создаются путем объединения режимов диспетчеризации и синхронизации.
Драйвер настраивает диспетчеризацию для очереди ввода-вывода, когда драйвер вызывает метод IWDFDevice::CreateIoQueue для настройки очереди по умолчанию или создания вторичной очереди. Драйвер может указать одно из значений из типа перечисления WDF_IO_QUEUE_DISPATCH_TYPE в параметре DispatchTypeобъекта IWDFDevice::CreateIoQueue для определения режима диспетчеризации. Объект очереди ввода-вывода может поддерживать следующие режимы диспетчеризации:
Последовательные
Режим последовательной диспетчеризации задается с помощью значения WdfIoQueueDispatchSequential . В этом режиме диспетчеризации очередь в состоянии обработки вызывает события, так что драйвер обрабатывает только один запрос за раз. Очередь откладывает все дополнительные запросы до тех пор, пока драйвер не завершит обработку своего текущего запроса или не вызовет метод IWDFIoRequest::ForwardToIoQueue для повторной отправки запроса. Когда текущий запрос завершается или пересылается, очередь вызывает событие для предоставления следующего запроса.
Параллельные
Режим параллельной отправки задается с помощью значения WdfIoQueueDispatchParallel . В этом режиме диспетчеризации очередь в состоянии обработки вызывает события, как только запросы ввода-вывода будут готовы для драйвера. Когда драйвер получает запрос ввода-вывода, он может обработать запрос ввода-вывода одним из следующих способов:
- Драйвер вызывает метод IWDFIoRequest::Complete или IWDFIoRequest::CompleteWithInformation для немедленного завершения запроса ввода-вывода. Драйвер немедленно завершает запрос ввода-вывода, если запрос ввода-вывода недопустим, не может быть обслуживаться или может быть выполнен путем копирования данных из буфера или кэша, в который есть данные.
- Драйвер вызывает метод IWDFIoRequest::ForwardToIoQueue , чтобы повторно отправить запрос ввода-вывода.
- Драйвер вызывает метод IWDFIoRequest::Send для передачи запроса ввода-вывода драйверу более низкого уровня.
Вручную
Режим отправки вручную указывается с помощью значения WdfIoQueueDispatchManual . В этом режиме диспетчеризации очередь ввода-вывода не уведомляет драйвер автоматически о поступлении запросов в очередь. Драйвер должен вызвать метод IWDFIoQueue::RetrieveNextRequest , чтобы получить запросы из очереди вручную. Это модель опроса.
В UMDF версии 1.9 и более поздних, если драйвер использует режим отправки вручную, он может вызвать IWDFIoRequest2::Requeue , чтобы вернуть запрос ввода-вывода в головку очереди ввода-вывода, из которой драйвер получил его. После вызова IWDFIoRequest2::Requeue следующий вызов драйвера к IWDFIoQueue::RetrieveNextRequest извлекает запрос, полученный в очереди.
Для всех режимов диспетчеризации объект очереди ввода-вывода получает и отслеживает запрос до тех пор, пока драйвер не обработает запрос или запрос не будет отменен.
Если драйвер настраивает очередь для последовательной или параллельной диспетчеризации, платформа уведомляет драйвер о запросе с помощью функций обратного вызова, зарегистрированных драйвером, когда драйвер создает очередь или настраивает очередь по умолчанию. Дополнительные сведения см. в разделе Функции обратного вызова событий очереди ввода-вывода.