次の方法で共有


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 可変優先度属性を持つシステム・スレッドが作業項目を処理するキューに作業項目を挿入します。

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 マクロを使用します。

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. 事前操作コールバックは 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
対象プラットフォーム ユニバーサル
Header fltkernel.h (Fltkernel.h を含む)
Library 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