функция обратного вызова EVT_WDF_IO_IN_CALLER_CONTEXT (wdfdevice.h)
[Применимо только к KMDF]
Функция обратного вызова событий драйвера EvtIoInCallerContext предварительно обрабатывает запрос ввода-вывода, прежде чем платформа помещает его в очередь ввода-вывода.
Синтаксис
EVT_WDF_IO_IN_CALLER_CONTEXT EvtWdfIoInCallerContext;
void EvtWdfIoInCallerContext(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
)
{...}
Параметры
[in] Device
Дескриптор объекта устройства платформы.
[in] Request
Дескриптор объекта запроса платформы.
Возвращаемое значение
Никакой
Замечания
Платформа вызывает функцию обратного вызова драйвера EvtIoInCallerContext, чтобы драйвер мог проверить каждый запрос ввода-вывода и, возможно, выполнить предварительную обработку запроса, прежде чем платформа помещает ее в очередь ввода-вывода. Чтобы зарегистрировать функцию обратного вызова EvtIoInCallerContext для устройства, драйвер вызывает WdfDeviceInitSetIoInCallerContextCallback.
Если драйвер регистрирует функцию обратного вызова EvtIoInCallerContext для устройства, платформа вызывает функцию обратного вызова при каждом получении запроса ввода-вывода для устройства. Функция обратного вызова вызывается в контексте потока процесса, отправляющего запрос ввода-вывода драйверу. Этот процесс является драйвером следующего уровня или, если драйвер находится в верхней части стека драйверов, приложение в пользовательском режиме.
Основная цель этой функции обратного вызова — включить драйверы на основе платформы для поддержки метода доступа к буферу, который вызывается не буферизованной или прямойввода-вывода. Для этого метода доступа к буферу драйвер должен получить доступ к полученным буферам в контексте процесса инициатора.
После получения буферов запроса функция обратного вызова может хранить адреса буферов или дескрипторы в хранилище контекста объекта запроса. (Драйвер задает размер области хранилища контекста объекта запроса путем вызова WdfDeviceInitSetRequestAttributes.)
Так как запрос еще не принадлежит очереди ввода-вывода, платформа не блокирует или синхронизирует запрос. Драйвер отвечает за любую синхронизацию, которая может потребоваться. Дополнительные сведения о синхронизации см. в разделе Методы синхронизации драйверов Framework-Based.
После завершения предварительной обработки запроса функция обратного вызова должна либо очередь, вызвав WdfDeviceEnqueueRequest или выполнив вызов WdfRequestComplete (если обнаружена ошибка).
Дополнительные сведения о функции обратного вызова EvtIoInCallerContext см. в перехвате запроса ввода-вывода перед очереди и доступ к буферам данных в Framework-Based драйверах.
Если драйвер настроил очередь ввода-вывода для поддержки гарантированного хода выполнения пересылки, платформа может не вызывать функцию обратного вызова драйвера EvtIoInCallerContext во время ситуаций с низкой памятью. Если все зарезервированные объекты запросов платформы используются, платформа откладывает обработку запроса ввода-вывода до тех пор, пока не будет доступен зарезервированный объект запроса. В этой ситуации платформа не может вызывать функцию обратного вызова EvtIoInCallerContext для отложенного запроса ввода-вывода, так как, когда объект зарезервированного запроса становится доступным, платформа больше не будет работать в контексте потока процесса, отправляющего запрос ввода-вывода драйверу.
Функция обратного вызова EvtIoInCallerContext вызывается в IRQL вызываемого потока. Если вызывающий поток выполняется из приложения пользовательского режима, функция обратного вызова вызывается в IRQL = PASSIVE_LEVEL. Если вызывающий поток получен из драйвера режима ядра более высокого уровня, функция обратного вызова драйвера EvtIoInCallerContext может вызываться в IRQL <= DISPATCH_LEVEL, если функция обратного вызова и драйвер более высокого уровня предназначены для передачи запроса в IRQL <= DISPATCH_LEVEL.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
минимальная версия KMDF | 1.0 |
заголовка | wdfdevice.h (include Wdf.h) |
IRQL | См. раздел "Примечания". |