次の方法で共有


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 を使用できます。

  1. preoperation コールバックは、FltAllocateDeferredIoWorkItem呼び出して作業項目を割り当てます。

  2. Preoperation コールバックは、FltQueueDeferredIoWorkItem 呼び出して、操作を作業キューにポストします。

  3. 事前操作コールバックは、FLT_PREOP_PENDINGを返します。

  4. I/O 操作を処理した後、作業ルーチンは FltCompletePendedPreOperationを呼び出して、フィルター マネージャーに I/O 操作を返します。

  5. 作業ルーチンは、FltFreeDeferredIoWorkItem呼び出して作業項目を解放します。

ミニフィルター ドライバーは、FltQueueDeferredIoWorkItem 操作後コールバック (PFLT_POST_OPERATION_CALLBACK) ルーチンで次のように を使用できます。

  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