共用方式為


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 是選擇性的內容資訊指標,傳遞為 FltQueueDeferredIoWorkItemContext 參數。

[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 作業張貼至背景工作線程。

  • FltQueueDeferredIoWorkItem 如果目前線程的 TopLevelIrp 字段未 NULL,因為產生的文件系統遞歸可能會導致死結或堆棧溢位,所以無法將 I/O 作業張貼至背景工作線程。 如需詳細資訊,請參閱 IoGetTopLevelIrp

小型篩選驅動程式可以在預先作回呼 (PFLT_PRE_OPERATION_CALLBACK) 例程中使用 FltQueueDeferredIoWorkItem,如下所示:

  1. 預先作回呼會呼叫 FltAllocateDeferredIoWorkItem 來配置工作專案。

  2. 預先作回呼會呼叫 FltQueueDeferredIoWorkItem 將作業張貼至工作佇列。

  3. 預先作回呼會傳回FLT_PREOP_PENDING。

  4. 處理 I/O 作業之後,工作例程會呼叫 FltCompletePendedPreOperation,以將 I/O 作業傳回至篩選管理員。

  5. 工作例程會呼叫 FltFreeDeferredIoWorkItem 來釋放工作專案。

小型篩選驅動程式可以在作業後回呼 (PFLT_POST_OPERATION_CALLBACK) 例程中使用 FltQueueDeferredIoWorkItem,如下所示:

  1. 作業後回呼會呼叫 FltAllocateDeferredIoWorkItem 來配置工作專案。

  2. 作業後回呼會呼叫 FltQueueDeferredIoWorkItem 將作業張貼至工作佇列。

  3. 作業後回呼會傳回FLT_POSTOP_MORE_PROCESSING_REQUIRED。

  4. 處理 I/O 作業之後,工作例程會呼叫 FltCompletePendedPostOperation,以將 I/O 作業傳回至篩選管理員。

  5. 工作例程會呼叫 FltFreeDeferredIoWorkItem 來釋放工作專案。

要求

要求 價值
最低支援的用戶端 Windows 2000
目標平臺 普遍
標頭 fltkernel.h (包括 Fltkernel.h)
連結庫 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