EVT_WDF_IO_IN_CALLER_CONTEXT回调函数 (wdfdevice.h)

[仅适用于 KMDF]

驱动程序的 EvtIoInCallerContext 事件回调函数在框架将 I/O 请求放入 I/O 队列之前对其进行预处理。

语法

EVT_WDF_IO_IN_CALLER_CONTEXT EvtWdfIoInCallerContext;

void EvtWdfIoInCallerContext(
  [in] WDFDEVICE Device,
  [in] WDFREQUEST Request
)
{...}

参数

[in] Device

框架设备对象的句柄。

[in] Request

框架请求对象的句柄。

返回值

备注

框架调用驱动程序的 EvtIoInCallerContext 回调函数,以便驱动程序可以检查每个 I/O 请求,并可能在框架将其放入 I/O 队列之前对请求执行初步处理。 若要为设备注册 EvtIoInCallerContext 回调函数,驱动程序调用 WdfDeviceInitSetIoInCallerContextCallback

如果驱动程序为设备注册 EvtIoInCallerContext 回调函数,框架会在每次收到设备的 I/O 请求时调用回调函数。 回调函数在将 I/O 请求发送到驱动程序的进程线程上下文中调用。 此过程是下一个更高级别的驱动程序,或者,如果驱动程序位于驱动程序堆栈的顶部,则为用户模式应用程序。

此回调函数的主要用途是使基于框架的驱动程序支持缓冲区访问方法,该方法 既不调用缓冲,也不调用直接 I/O。 对于此缓冲区访问方法,驱动程序必须访问发起方进程上下文中收到的缓冲区。

回调函数获取请求的缓冲区后,可以将缓冲区地址或句柄存储在请求对象的上下文存储中。 (驱动程序通过调用 WdfDeviceInitSetRequestAttributes.)

由于请求尚不属于 I/O 队列,因此框架不会锁定或同步请求。 驱动程序负责任何可能需要的同步。 有关同步的详细信息,请参阅 Framework-Based 驱动程序的同步技术

回调函数完成对请求的预处理后,必须通过调用 WdfDeviceEnqueueRequest 将 请求排入队列,或者如果) 检测到错误,则通过调用 WdfRequestComplete (来完成该请求。

有关 EvtIoInCallerContext 回调函数的详细信息,请参阅在 I/O 请求排队和访问 Framework-Based 驱动程序中的数据缓冲区之前截获 I/O 请求。

如果驱动程序已配置 I/O 队列以支持 有保证的前进进度,则框架可能不会在内存不足的情况下调用驱动程序的 EvtIoInCallerContext 回调函数。 如果框架的所有保留请求对象都在使用中,框架将推迟处理 I/O 请求,直到保留的请求对象可用。 在这种情况下,框架无法为延迟的 I/O 请求调用 EvtIoInCallerContext 回调函数,因为当保留请求对象变为可用时,框架将不再在向驱动程序发送 I/O 请求的进程线程上下文中运行。

EvtIoInCallerContext 回调函数在调用线程的 IRQL 上调用。 如果调用线程来自用户模式应用程序,则回调函数在 IRQL = PASSIVE_LEVEL中调用。 如果调用线程来自更高级别的内核模式驱动程序,则可以在 IRQL <= DISPATCH_LEVEL调用驱动程序的 EvtIoInCallerContext 回调函数,前提是回调函数和更高级别驱动程序都设计为在 IRQL <= DISPATCH_LEVEL 传递请求。

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
标头 wdfdevice.h (包括 Wdf.h)
IRQL 请参见“备注”部分。

另请参阅

EvtDeviceWdmIrpPreprocess