FltQueueDeferredIoWorkItem 函数 (fltkernel.h)

FltQueueDeferredIoWorkItem 例程将基于 IRP 的 I/O 操作发布到工作队列。

语法

NTSTATUS FLTAPI FltQueueDeferredIoWorkItem(
  [in] PFLT_DEFERRED_IO_WORKITEM         FltWorkItem,
  [in] PFLT_CALLBACK_DATA                Data,
  [in] PFLT_DEFERRED_IO_WORKITEM_ROUTINE WorkerRoutine,
  [in] WORK_QUEUE_TYPE                   QueueType,
  [in] PVOID                             Context
);

参数

[in] FltWorkItem

指向要添加到工作队列的工作项的指针。 工作项必须已通过调用 FltAllocateDeferredIoWorkItem 进行分配。

[in] Data

指向 I/O 操作 FLT_CALLBACK_DATA 结构的指针。 该操作必须是基于 IRP 的 I/O 操作。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O 操作,请使用 FLT_IS_IRP_OPERATION 宏。

[in] WorkerRoutine

指向调用方提供的工作器回调例程的指针。 此例程声明如下:

typedef VOID
(*PFLT_DEFERRED_IO_WORKITEM_ROUTINE) (
    _In_ PFLT_DEFERRED_IO_WORKITEM FltWorkItem,
    _In_ PFLT_CALLBACK_DATA CallbackData,
    _In_opt_ PVOID Context
    );

其中:

  • FltWorkItem 是指向延迟工作项结构的不透明指针。
  • CallbackData 是指向 I/O 操作的回调数据结构的指针。
  • Context 是作为 FltQueueDeferredIoWorkItem 的 Context 参数传递的可选上下文信息指针。

[in] QueueType

指定 将 FltWorkItem 指向的工作项插入到的队列。 QueueType 可以是以下值之一。

含义
CriticalWorkQueue 将工作项插入队列中,具有实时优先级属性的系统线程从该队列中处理工作项。
DelayedWorkQueue 将工作项插入队列中,具有可变优先级属性的系统线程从该队列中处理工作项。

QueueTypeHyperCriticalWorkQueue 保留供系统使用。

[in] Context

指向要作为 WorkerRoutine 参数中指定的回调例程的 Context 参数传递的调用方定义的上下文信息的指针。

返回值

FltQueueDeferredIoWorkItem 例程返回STATUS_SUCCESS或适当的 NTSTATUS 值,例如以下值之一:

返回代码 说明
STATUS_FLT_DELETING_OBJECT I/O 操作 (Data-Iopb-TargetInstance>>) 的目标实例正在被拆除。 这是错误代码。
STATUS_FLT_NOT_SAFE_TO_POST_OPERATION I/O 操作无法安全地发布到工作线程。 有关返回此错误代码的可能原因,请参阅备注。

注解

FltQueueDeferredIoWorkItem 例程将 I/O 操作发布到系统工作队列。 指定的 WorkerRoutine 回调例程在系统线程的上下文中调用,位于 IRQL PASSIVE_LEVEL。

该操作必须是基于 IRP 的 I/O 操作。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O 操作,请使用 FLT_IS_IRP_OPERATION 宏。

当 I/O 操作无法安全地发布到工作线程时,FltQueueDeferredIoWorkItem 返回STATUS_FLT_NOT_SAFE_TO_POST_OPERATION。 可能的原因包括:

  • FltQueueDeferredIoWorkItem 无法将分页 I/O 操作发布到工作线程。

  • 如果当前线程的 TopLevelIrp 字段不是 NULL则 FltQueueDeferredIoWorkItem 无法将 I/O 操作发布到工作线程,因为生成的文件系统递归可能会导致死锁或堆栈溢出。 有关详细信息,请参阅 IoGetTopLevelIrp

微筛选器驱动程序可以在预操作回调 (PFLT_PRE_OPERATION_CALLBACK) 例程中使用 FltQueueDeferredIoWorkItem,如下所示:

  1. 预操作回调调用 FltAllocateDeferredIoWorkItem 来分配工作项。

  2. 预操作回调调用 FltQueueDeferredIoWorkItem 将操作发布到工作队列。

  3. 预操作回调返回FLT_PREOP_PENDING。

  4. 处理 I/O 操作后,工作例程调用 FltCompletePendedPreOperation ,以将 I/O 操作返回到筛选器管理器。

  5. 工作例程调用 FltFreeDeferredIoWorkItem 来释放工作项。

微筛选器驱动程序可以在操作后回调中使用 FltQueueDeferredIoWorkItem , (PFLT_POST_OPERATION_CALLBACK) 例程,如下所示:

  1. 操作后回调调用 FltAllocateDeferredIoWorkItem 来分配工作项。

  2. 操作后回调调用 FltQueueDeferredIoWorkItem 将操作发布到工作队列。

  3. 操作后回调返回FLT_POSTOP_MORE_PROCESSING_REQUIRED。

  4. 处理 I/O 操作后,工作例程调用 FltCompletePendedPostOperation 以将 I/O 操作返回到筛选器管理器。

  5. 工作例程调用 FltFreeDeferredIoWorkItem 来释放工作项。

要求

要求
最低受支持的客户端 Windows 2000
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
Library Fltmgr.lib
DLL Fltmgr.sys
IRQL <= DISPATCH_LEVEL

另请参阅

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FltAllocateDeferredIoWorkItem

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltFreeDeferredIoWorkItem

IoGetTopLevelIrp

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK