функция обратного вызова 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
Дескриптор объекта запроса платформы.
Возвращаемое значение
None
Remarks
Платформа вызывает функцию обратного вызова EvtIoInCallerContext драйвера, чтобы драйвер мог изучить каждый запрос ввода-вывода и, возможно, выполнить предварительную обработку запроса, прежде чем платформа поместит его в очередь ввода-вывода. Чтобы зарегистрировать функцию обратного вызова EvtIoInCallerContext для устройства, драйвер вызывает WdfDeviceInitSetIoInCallerContextCallback.
Если драйвер регистрирует функцию обратного вызова EvtIoInCallerContext для устройства, платформа вызывает функцию обратного вызова каждый раз, когда получает запрос ввода-вывода для устройства. Функция обратного вызова вызывается в контексте потока процесса, отправляющего запрос ввода-вывода драйверу. Это либо драйвер следующего уровня, либо, если драйвер находится в верхней части стека драйверов, приложение в пользовательском режиме.
Основной целью этой функции обратного вызова является включение драйверов на основе платформы для поддержки метода доступа к буферу, который не вызывается ни буферным, ни прямым вводом-выводом. Для этого метода доступа к буферу драйвер должен обращаться к полученным буферам в контексте процесса инициатора.
После того как функция обратного вызова получила буферы запроса, она может хранить адреса буфера или дескрипторы в хранилище контекста объекта запроса. (Драйвер задает размер области хранения контекста объекта запроса, вызывая WdfDeviceInitSetRequestAttributes.)
Так как запрос еще не принадлежит к очереди ввода-вывода, платформа не блокирует и не синхронизирует запрос. Драйвер отвечает за любую синхронизацию, которая может потребоваться. Дополнительные сведения о синхронизации см. в статье Методы синхронизации для драйверов Framework-Based.
После того как функция обратного вызова завершит предварительную обработку запроса, она должна либо поместить его в очередь, вызвав WdfDeviceEnqueueRequestComplete (если обнаружена ошибка).
Дополнительные сведения о функции обратного вызова EvtIoInCallerContext см. в разделах Перехват запроса ввода-вывода до его постановки в очередь и Доступ к буферам данных в драйверах Framework-Based.
Если драйвер настроил очередь ввода-вывода для поддержки гарантированного прогресса вперед, платформа может не вызывать функцию обратного вызова EvtIoInCallerContext драйвера во время нехватки памяти. Если используются все зарезервированные объекты запросов платформы, платформа откладывает обработку запроса ввода-вывода до тех пор, пока не будет доступен зарезервированный объект запроса. В этом случае платформа не может вызвать функцию обратного вызова EvtIoInCallerContext для отложенного запроса ввода-вывода, так как, когда зарезервированный объект запроса становится доступным, платформа больше не будет выполняться в контексте потока процесса, отправляющего запрос ввода-вывода драйверу.
Функция обратного вызова EvtIoInCallerContext вызывается в irQL вызывающего потока. Если вызывающий поток выполняется из приложения пользовательского режима, функция обратного вызова вызывается в irQL = PASSIVE_LEVEL. Если вызывающий поток является драйвером в режиме ядра более высокого уровня, функция обратного вызова EvtIoInCallerContext драйвера может быть вызвана по irQL <= DISPATCH_LEVEL если и функция обратного вызова, и драйвер более высокого уровня предназначены для передачи запроса по IRQL <= DISPATCH_LEVEL.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Верхняя часть | wdfdevice.h (включая Wdf.h) |
IRQL | См. раздел "Примечания". |