次の方法で共有


FltCbdqInsertIo 関数 (fltkernel.h)

FltCbdqInsertIo は、I/O 操作のコールバック データ構造をフィルター ドライバーのコールバック データ キューに挿入します。

構文

NTSTATUS FLTAPI FltCbdqInsertIo(
  [in, out]      PFLT_CALLBACK_DATA_QUEUE            Cbdq,
  [in]           PFLT_CALLBACK_DATA                  Cbd,
  [in, optional] PFLT_CALLBACK_DATA_QUEUE_IO_CONTEXT Context,
  [in, optional] PVOID                               InsertContext
);

パラメーター

[in, out] Cbdq

呼び出し元の cancel-safe コールバック データ キューへのポインター。 このキューは 、FltCbdqInitialize を呼び出して初期化されている必要があります。

[in] Cbd

キューに入る I/O 操作のコールバック データ (FLT_CALLBACK_DATA) 構造体へのポインター。 操作は IRP ベースの I/O 操作である必要があります。

[in, optional] Context

I/O 要求の不透明なコンテキスト ポインターを受け取る呼び出し元が指定した変数。 フィルター ドライバーは、 FltCbdqRemoveIo を呼び出して削除できるように、このポインターを使用してキュー内の特定の項目を識別できます。 フィルター ドライバーがキューから特定の I/O 要求を削除する必要がない場合、このパラメーターは NULL にすることができます

[in, optional] InsertContext

フィルター ドライバーの CbdqInsertIo コールバック ルーチンに渡されるコンテキスト ポインター。

戻り値

FltCbdqInsertIo は、コールバック データ構造がコールバック データ キューに挿入されたときのSTATUS_SUCCESS、または次のような適切な NTSTATUS 値を返します。

リターン コード 説明
STATUS_FLT_CBDQ_DISABLED コールバック データ構造は、現在キューが無効になっているため、コールバック データ キューに挿入されませんでした。 キューを再度登録するには、 FltCbdqEnable を呼び出します。 これはエラー コードです。

注意

成功した場合、 FltCbdqInsertIo は フィルターの InsertIo コールバックが返す内容を返します。たとえば、フィルターは成功を示すためにSTATUS_SUCCESSまたはSTATUS_PENDINGを返す場合があります。 フィルターは、成功を示すために使用する値に対して自己一貫性を保つ必要があります。

注釈

FltCbdqInsertIo は 、指定したコールバック データ (FLT_CALLBACK_DATA) 構造体をフィルター ドライバーのコールバック データ キューに挿入します。

  • コールバック データを挿入するフィルター ドライバーと、関連付けられている IRP が取り消される間に競合状態が発生する可能性があることに注意してください。 これは、IRP が既に取り消されている場合にキューのキャンセル ルーチンをすぐに呼び出すことによって回避できます。

フィルター ドライバーは 、FltCbdqXxx ルーチンを使用して、IRP ベースの I/O 操作のコールバック データ キューを実装できます。 これらのルーチンを使用すると、フィルター ドライバーはキューをキャンセルセーフにすることができます。システムはフィルター ドライバーの I/O キャンセルを透過的に処理します。

FltCbdqXxx ルーチンは、IRP ベースの I/O 操作にのみ使用できます。 特定のコールバック データ構造が IRP ベースの I/O 操作を表すかどうかを確認するには、 FLT_IS_IRP_OPERATION マクロを使用します。

コールバック データ キューは、 FltCbdqInitialize を呼び出すことによって初期化されます。 FltCbdqInsertIo は、キューのディスパッチ テーブルに用意されている関数を使用してキューをロックし、コールバック データ構造をキューに挿入します。 挿入操作自体は、キューの CbdqInsertIo ルーチンによって実行されます。

コールバック データ キューを作成する方法の詳細については、「 FltCbdqInitialize 」を参照してください。 FltCbdqRemoveIo を使用してキューから特定の I/O 要求を削除するか、FltCbdqRemoveNextIo を使用して次に使用可能な I/O 要求を削除します。

キューがミューテックス オブジェクトまたはリソース変数ではなくスピン ロックによって保護されている場合、FltCbdqInsertIo の呼び出し元は IRQL <= DISPATCH_LEVELで実行できます。 ミューテックスまたはリソースを使用する場合、呼び出し元は IRQL <= APC_LEVELで実行されている必要があります。

要件

要件
対象プラットフォーム ユニバーサル
Header fltkernel.h (Fltkernel.h を含む)
IRQL 「解説」を参照してください。

こちらもご覧ください

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInitialize

FltCbdqRemoveIo

FltCbdqRemoveNextIo