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 | 優先度が可変の属性を持つシステム スレッドが作業項目を処理するキューに作業項目を挿入します。 |
HyperCriticalWorkQueue QueueType 値は、システムで使用するために予約されています。
[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呼び出して作業項目を割り当てます。
Preoperation コールバックは、FltQueueDeferredIoWorkItem 呼び出して、操作を作業キューにポストします。
事前操作コールバックは、FLT_PREOP_PENDINGを返します。
I/O 操作を処理した後、作業ルーチンは FltCompletePendedPreOperationを呼び出して、フィルター マネージャーに I/O 操作を返します。
ミニフィルター ドライバーは、FltQueueDeferredIoWorkItem 操作後コールバック (PFLT_POST_OPERATION_CALLBACK) ルーチンで次のように を使用できます。
操作後のコールバックは、FltQueueDeferredIoWorkItem 呼び出して、操作を作業キューにポストします。
操作後のコールバックは、FLT_POSTOP_MORE_PROCESSING_REQUIREDを返します。
I/O 操作の処理後、作業ルーチンは FltCompletePendedPostOperation呼び出して、フィルター マネージャーに I/O 操作を返します。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows 2000 |
ターゲット プラットフォーム の | 万国 |
ヘッダー | fltkernel.h (Fltkernel.h を含む) |
ライブラリ | Fltmgr.lib |
DLL | Fltmgr.sys |
IRQL | <= DISPATCH_LEVEL |
関連項目
FltAllocateDeferredIoWorkItemの
FltCompletePendedPostOperationの
FltCompletePendedPreOperationの
FltFreeDeferredIoWorkItemをする
IoGetTopLevelIrpの