Обработчики запросов
Если драйвер указал последовательный или параллельный метод диспетчеризации для очереди ввода-вывода, платформа вызывает предоставленную драйвером функцию обратного вызова каждый раз, когда она готова доставить драйверу один из запросов очереди.
Для каждой очереди ввода-вывода драйвер может предоставить одну или несколько из следующих функций обратного вызова, которые называются обработчиками запросов:
EvtIoRead
Платформа вызывает функцию обратного вызова EvtIoRead очереди ввода-вывода, когда в очереди доступен запрос на чтение.
EvtIoWrite
Платформа вызывает функцию обратного вызова EvtIoWrite очереди ввода-вывода , когда в очереди доступен запрос на запись.
EvtIoDeviceControl
Платформа вызывает функцию обратного вызова EvtIoDeviceControl очереди ввода-вывода, когда в очереди доступен запрос на управление вводом-выводом устройства.
EvtIoInternalDeviceControl
Платформа вызывает функцию обратного вызова EvtIoInternalDeviceControl очереди ввода-вывода, когда в очереди доступен внутренний запрос управления вводом-выводом устройства.
EvtIoDefault
Платформа вызывает функцию обратного вызова EvtIoDefault очереди ввода-вывода при наличии любого запроса, если драйвер не предоставил соответствующую функцию обратного вызова для конкретного типа запроса.
Драйвер регистрирует функции обратного вызова при вызове WdfIoQueueCreate для создания очереди ввода-вывода для устройства.
Каждая из этих функций обратного вызова получает два входных аргумента: дескриптор запроса ввода-вывода, который платформа доставляет драйверу, и дескриптор очереди ввода-вывода, в которую был помещен запрос. Функция обратного вызова может определить целевое устройство, вызвав WdfIoQueueGetDevice.
Платформа вызывает обработчики запросов драйвера в произвольном контексте потока. Драйвер не должен ждать длительного периода времени при выполнении в произвольном контексте потока. В некоторых случаях драйвер может использовать объекты диспетчера ядра в качестве механизмов синхронизации. Сведения о том, когда драйвер может ждать объектов диспетчера, а также о том, что делать, если это не удается, см. в статье Общие сведения об объектах диспетчера ядра.