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


Обработчики запросов

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

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

EvtIoRead
Фреймворк вызывает функцию обратного вызова EvtIoRead очереди ввода-вывода, когда запрос на чтение доступен в очереди.

EvtIoWrite
Фреймворк вызывает функцию обратного вызова очереди ввода-вывода EvtIoWrite, когда запрос на запись доступен в очереди.

EvtIoDeviceControl
Платформа вызывает функцию обратного вызова EvtIoDeviceControl очереди ввода-вывода, когда запрос на управление вводом-выводом устройства доступен в очереди.

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

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

Драйвер регистрирует функции обратного вызова при вызове WdfIoQueueCreate для создания очереди ввода-вывода для устройства.

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

Платформа вызывает обработчики запросов драйвера в произвольном контексте потока. Драйвер не должен ждать длительного периода времени при выполнении в произвольном контексте потока. В некоторых случаях драйвер может использовать объекты диспетчера ядра в качестве механизмов синхронизации. Сведения о том, когда драйвер может ожидать объектов диспетчера и что делать, когда он не может, см. в разделе "Введение в объекты диспетчера ядра".