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


Настройка режима отправки для очереди ввода-вывода

Предупреждение

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 в параметре DispatchTypeIWDFDevice::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, который извлекает повторно поставленный запрос.

Для всех режимов отправки объект очереди ввода-вывода получает и отслеживает запрос, пока драйвер не обработает запрос или запрос будет отменен.

Если драйвер настраивает очередь для последовательной или параллельной отправки, платформа уведомляет драйвер запроса с помощью функций обратного вызова, зарегистрированных драйвером при создании очереди или настройке очереди по умолчанию. Для получения дополнительной информации см. функции обратного вызова очереди событий ввода-вывода.