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


Создание очередей ввода-вывода

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

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

Большинство драйверов создают очереди ввода-вывода в функции обратного вызова EvtDriverDeviceAdd. Чтобы создать очередь ввода-вывода для устройства, драйвер вызывает метод объекта очереди фреймворка WdfIoQueueCreate (который создает объект очереди фреймворка). Драйвер предоставляет структуру WDF_IO_QUEUE_CONFIG методу. Эта структура содержит сведения о конфигурации очереди, такие как метод отправки очереди и указатели на обработчики запросов , что платформа вызывает, когда запросы доступны в очереди. Структура также указывает, будет ли очередь с поддержкой управления энергопотреблением и способен ли драйвер обрабатывать буферы нулевой длины для запросов ввода-вывода в очереди.

Если драйвер задает элемент DefaultQueue структуры WDF_IO_QUEUE_CONFIG в значение TRUE, очередь становится очередью ввода-вывода устройства по умолчанию. Если драйвер создает очередь ввода-вывода по умолчанию, платформа помещает все запросы ввода-вывода устройства в эту очередь, если только вы не создаете дополнительные очереди для получения некоторых запросов. Драйвер может получить дескриптор очереди ввода-вывода устройства по умолчанию, вызвав метод WdfDeviceGetDefaultQueue.

Если вы хотите использовать несколько очередей ввода-вывода для устройства, драйвер может вызвать WdfIoQueueCreate, чтобы создать столько объектов очереди, сколько вам нужно. Если драйвер создает несколько очередей, он может вызывать WdfDeviceConfigureRequestDispatching, которая предписывает фреймворку направлять различные типы запросов в разные очереди. Например, можно указать, что все запросы на чтение будут доставлены в одну очередь, и все запросы на запись будут доставлены в другую очередь.

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

Если драйвер не предоставляет очередь ввода-вывода для запросов определенного типа, а если драйвер является драйвером функции, платформа завершает запросы этого типа со значением состояния завершения STATUS_INVALID_DEVICE_REQUEST. Если драйвер является драйвером фильтра и вызвал WdfFdoInitSetFilter, платформа автоматически перенаправит эти запросы в следующий нижний драйвер в стеке драйверов. Таким образом, например, драйвер фильтра, который не обрабатывает запросы на чтение, не должен предоставлять очередь ввода-вывода, которая получает запросы на чтение.

Чтобы узнать о примерах использования очередей ввода-вывода, см. Примеры использования очередей ввода-вывода.