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 | 將工作專案插入佇列中,其中具有變數優先順序屬性的系統線程會處理工作專案。 |
QueueType 值 HyperCriticalWorkQueue 會保留供系統使用。
[in] Context
要傳遞為 WorkerRoutine 參數中所指定回呼例程之 Context 參數之呼叫端定義內容資訊的指標。
傳回值
FltQueueDeferredIoWorkItem 例程會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項:
傳回碼 | Description |
---|---|
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。
迷你篩選驅動程式可以在預先操作回呼中使用 FltQueueDeferredIoWorkItem , (PFLT_PRE_OPERATION_CALLBACK) 例程,如下所示:
預先操作回呼會呼叫 FltAllocateDeferredIoWorkItem 來配置工作專案。
預先操作回呼會呼叫 FltQueueDeferredIoWorkItem ,將作業張貼到工作佇列。
預先操作回呼會傳回FLT_PREOP_PENDING。
處理 I/O 作業之後,工作例程會呼叫 FltCompletePendedPreOperation ,以將 I/O 作業傳回至篩選管理員。
工作例程會呼叫 FltFreeDeferredIoWorkItem 來釋放工作專案。
迷你篩選驅動程式可以在作業後回呼中使用 FltQueueDeferredIoWorkItem , (PFLT_POST_OPERATION_CALLBACK) 例程,如下所示:
作業後回呼會呼叫 FltAllocateDeferredIoWorkItem 來配置工作專案。
作業後回呼會呼叫 FltQueueDeferredIoWorkItem ,將作業張貼到工作佇列。
作業後回呼會傳回FLT_POSTOP_MORE_PROCESSING_REQUIRED。
處理 I/O 作業之後,工作例程會呼叫 FltCompletePendedPostOperation ,以將 I/O 作業傳回至篩選管理員。
工作例程會呼叫 FltFreeDeferredIoWorkItem 來釋放工作專案。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 |
目標平台 | Universal |
標頭 | fltkernel.h (包含 Fltkernel.h) |
程式庫 | Fltmgr.lib |
Dll | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |