FltPerformAsynchronousIo 函数 (fltkernel.h)
微筛选器驱动程序调用 FltPerformAsynchronousIo 来启动异步 I/O 操作。
语法
NTSTATUS FLTAPI FltPerformAsynchronousIo(
[in, out] PFLT_CALLBACK_DATA CallbackData,
[in] PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
[in] PVOID CallbackContext
);
参数
[in, out] CallbackData
指向回调数据的指针 (FLT_CALLBACK_DATA) 上一次调用 FltAllocateCallbackData 分配的结构。 此参数是必需的,不能为 NULL。 调用方负责通过调用 FltFreeCallbackData 不再需要此结构时释放此结构。
[in] CallbackRoutine
指向在完成 I/O 操作时调用 的PFLT_COMPLETED_ASYNC_IO_CALLBACK类型的回调例程的指针。 注意:筛选器管理器在调用操作后回调 (PFLT_POST_OPERATION_CALLBACK) 例程后调用此例程,这些驱动程序的实例附加到实例参数中指定的启动实例 (到 FltAllocateCallbackData) 。 此参数是必需的,不能为 NULL。 筛选器管理器始终调用此例程,即使 FltPerformAsynchronousIo 失败。
[in] CallbackContext
要传递给 CallbackRoutine 的上下文指针 此参数是可选的,可以为 NULL。
返回值
FltPerformAsynchronousIo 返回STATUS_SUCCESS以指示文件系统已完成 I/O 操作,并且已调用 CallbackRoutine 指向的回调例程。 否则,它将返回相应的 NTSTATUS 值,例如以下值之一:
返回代码 | 说明 |
---|---|
STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST | IRP_MJ_CREATE请求不能异步执行。 这是错误代码。 |
STATUS_PENDING | 操作返回STATUS_PENDING。 当 I/O 操作完成时,筛选器管理器将调用 CallbackRoutine 指向的回调例程。 此代码仅指示操作已启动。 |
STATUS_FLT_IO_COMPLETE | 该操作由微型筛选器驱动程序的预操作回调例程完成,该驱动程序的实例附加到启动实例下方。 |
注解
微筛选器驱动程序调用 FltPerformAsynchronousIo 以在调用 FltAllocateCallbackData 为操作分配回调数据结构后启动异步 I/O 操作。
FltPerformAsynchronousIo 仅将 I/O 操作发送到在 实例参数中指定的 启动实例 (下附加到 FltAllocateCallbackData) 和文件系统的微筛选器驱动程序实例。 附加到指定实例上方的微筛选器驱动程序不会接收 I/O 操作。
微筛选器驱动程序只能启动基于 IRP 的 I/O 操作。 它们无法启动快速 I/O 或文件系统筛选器 (FSFilter) 回调操作。
微筛选器驱动程序应仅将 FltPerformAsynchronousIo 用于无法使用以下例程的异步 I/O 操作:
IRP_MJ_CREATE请求不能异步执行。
在调用 (CallbackRoutine 指向的回调例程后,可随时释放或重用FLT_CALLBACK_DATA) 结构的回调数据。 调用方可以通过调用 FltFreeCallbackData 释放回调数据结构,也可以通过调用 FltReuseCallbackData 来准备其重用。
注意
STATUS_SUCCESS和STATUS_FLT_IO_COMPLETE指示 I/O 操作已完成,但不指示 I/O 操作的最终状态。 若要确定基础微筛选器驱动程序、筛选器驱动程序和文件系统返回的实际操作状态,CallbackRoutine 应检查 CallbackRoutine 的 CallbackContext 参数中收到的回调数据结构的 IoStatus 成员。
由于筛选器管理器始终调用 CallbackRoutine 指向的回调例程,即使 FltPerformAsynchronousIo 失败,微筛选器驱动程序也可以直接在回调例程中执行释放或重用操作。
如果在操作的 FLT_IO_PARAMETER_BLOCK 结构的 IrpFlags 成员中设置了IRP_PAGING_IO标志,则 FltPerformAsynchronousIo 的调用方可以在 IRQL <= APC_LEVEL 运行。 (此标志仅对IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_QUERY_INFORMATION和IRP_MJ_SET_INFORMATION operations 有效。) 否则,调用方必须在 IRQL PASSIVE_LEVEL运行。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | fltkernel.h (包括 Fltkernel.h) |
Library | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | 请参见“备注”部分。 |