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 値を返します。
リターン コード | 説明 |
---|---|
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 を使用できます。
preoperation コールバックは 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 |
対象プラットフォーム | ユニバーサル |
Header | fltkernel.h (Fltkernel.h を含む) |
Library | Fltmgr.lib |
[DLL] | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |