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作的回调数据结构的指针。
- 上下文 是作为 FltQueueDeferredIoWorkItem的 Context 参数传递的可选上下文信息指针。
[in] QueueType
指定要在其中插入 FltWorkItem 指向的工作项的队列。 QueueType 可以是以下值之一。
价值 | 意义 |
---|---|
CriticalWorkQueue | 将工作项插入队列中,系统线程使用实时优先级属性处理工作项。 |
DelayedWorkQueue | 将工作项插入队列中,其中具有变量优先级属性的系统线程处理工作项。 |
QueueType 值 HyperCriticalWorkQueue 保留供系统使用。
[in] Context
指向要作为 Context 参数传递给 WorkerRoutine 参数中指定的回调例程的调用方定义的上下文信息的指针。
返回值
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 宏。
FltQueueDeferredIoWorkItem 在 I/O作无法安全地发布到工作线程时返回STATUS_FLT_NOT_SAFE_TO_POST_OPERATION。 可能的原因包括:
FltQueueDeferredIoWorkItem 无法将分页 I/O作发布到工作线程。
FltQueueDeferredIoWorkItem 如果当前线程的 TopLevelIrp 字段未 NULL,则无法将 I/O作发布到工作线程,因为生成的文件系统递归可能会导致死锁或堆栈溢出。 有关详细信息,请参阅 IoGetTopLevelIrp。
微型筛选器驱动程序可以在预作回调(PFLT_PRE_OPERATION_CALLBACK)例程中使用 FltQueueDeferredIoWorkItem,如下所示:
预作回调调用 FltAllocateDeferredIoWorkItem 来分配工作项。
预作回调调用 FltQueueDeferredIoWorkItem 将作发布到工作队列。
预作回调返回FLT_PREOP_PENDING。
处理 I/O作后,工作例程 FltCompletePendedPreOperation 将 I/O作返回到筛选器管理器。
工作例程调用 FltFreeDeferredIoWorkItem 来释放工作项。
微型筛选器驱动程序可以在作后回调(PFLT_POST_OPERATION_CALLBACK)例程中使用 FltQueueDeferredIoWorkItem,如下所示:
作后回调调用 FltAllocateDeferredIoWorkItem 来分配工作项。
作后回调调用 FltQueueDeferredIoWorkItem 将作发布到工作队列。
作后回调返回FLT_POSTOP_MORE_PROCESSING_REQUIRED。
处理 I/O作后,工作例程调用 FltCompletePendedPostOperation 以将 I/O作返回到筛选器管理器。
工作例程调用 FltFreeDeferredIoWorkItem 来释放工作项。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 |
目标平台 | 普遍 |
标头 | fltkernel.h (包括 Fltkernel.h) |
库 | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |