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

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

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

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

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

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

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

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

Примеры использования очередей ввода-вывода драйверами см. в разделе Примеры использования очередей ввода-вывода.