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

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

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

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

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

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

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

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

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

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

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