次の方法で共有


FltCbdqInitialize 関数 (fltkernel.h)

FltCbdqInitialize は、ミニフィルター ドライバーのコールバック データ キュー ディスパッチ テーブルを初期化します。

構文

NTSTATUS FLTAPI FltCbdqInitialize(
  [in]      PFLT_INSTANCE                                 Instance,
  [in, out] PFLT_CALLBACK_DATA_QUEUE                      Cbdq,
  [in]      PFLT_CALLBACK_DATA_QUEUE_INSERT_IO            CbdqInsertIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO            CbdqRemoveIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO         CbdqPeekNextIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_ACQUIRE              CbdqAcquire,
  [in]      PFLT_CALLBACK_DATA_QUEUE_RELEASE              CbdqRelease,
  [in]      PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO CbdqCompleteCanceledIo
);

パラメーター

[in] Instance

コールバック データ キューを初期化するインスタンスの不透明なインスタンス ポインター。

[in, out] Cbdq

ミニフィルター ドライバーによって割り当てられたコールバック データ キューへのポインター。

[in] CbdqInsertIo

呼び出し元が指定した挿入コールバック ルーチンへのポインター。 Filter Manager は、このルーチンを呼び出して、指定されたコールバック データ構造をキューに挿入します。 このルーチンは、次のように宣言されています。

typedef NTSTATUS
(*PFLT_CALLBACK_DATA_QUEUE_INSERT_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID InsertContext
      );

Cbdq

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

Cbd

キューに挿入されるコールバック データ構造へのポインター。

InsertContext

InsertContext パラメーターとして FltCbdqInsertIo に渡されたコンテキスト情報ポインター。

[in] CbdqRemoveIo

呼び出し元から提供された削除コールバック ルーチンへのポインター。 Filter Manager は、このルーチンを呼び出して、指定されたコールバック データ構造をキューから削除します。 このルーチンは、次のように宣言されています。

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd
      );

Cbdq

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

Cbd

キューから削除するコールバック データ構造へのポインター。

[in] CbdqPeekNextIo

呼び出し元から提供されたピーク コールバック ルーチンへのポインター。 Filter Manager は、この関数を呼び出して、キュー内の PeekContext に一致する次の I/O 操作へのポインターを取得します。または、 CbdNULL の場合は、キュー内の最初に一致する I/O 操作へのポインターを取得します。 ミニフィルター ドライバーは、 PeekContext の意味を完全に定義し、I/O 操作が特定の PeekContext と一致するタイミングを定義します。 このルーチンは、次のように宣言されています。

typedef PFLT_CALLBACK_DATA
(*PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO)(
      _In_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID PeekContext
      );

Cbdq

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

Cbd

PeekContext との一致の検索を開始するキュー内の位置を示すコールバック データ構造へのポインター。 CbdNULL の場合、検索はキューの先頭から開始されます。

PeekContext

PeekContext パラメーターとして FltCbdqRemoveNextIo に渡されたコンテキスト情報ポインター。

[in] CbdqAcquire

呼び出し元から提供された取得キュー ロック コールバック ルーチンへのポインター。 フィルター マネージャーは、このルーチンを呼び出して、キューに対するロックを取得してから、キューに項目を挿入または削除します。 このルーチンは、次のように宣言されています。

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_ACQUIRE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Out_opt_ PKIRQL Irql
      );

Cbdq

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

Irql

現在の IRQL を受け取るシステム提供の変数へのポインター。 同じ変数が、対応する CbdqRelease ルーチンに渡されます。

[in] CbdqRelease

呼び出し元が指定したリリース キュー ロック コールバック ルーチンへのポインター。 フィルター マネージャーは、このルーチンを呼び出して、対応する CbdqAcquire ルーチンを呼び出して取得したロックを解放します。 このルーチンは、次のように宣言されています。

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_RELEASE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ KIRQL Irql
      );

Cbdq

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

Irql

現在の IRQL を、対応する CbdqAcquire ルーチンに Irql パラメーターとして受け取ったのと同じシステム提供の変数。

[in] CbdqCompleteCanceledIo

呼び出し元から提供されたキャンセル ルーチンへのポインター。 フィルター マネージャーは、このルーチンを呼び出して、取り消された I/O 操作を完了するようにミニフィルター ドライバーに通知します。 このルーチンは、次のように宣言されています。

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Inout_ PFLT_CALLBACK_DATA Cbd
      );

Cbdq

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

Cbd

取り消された I/O 操作のコールバック データ構造へのポインター。

戻り値

FltCbdqInitialize は、STATUS_SUCCESSまたは適切な NTSTATUS 値を返します。

注釈

新しく初期化されたコールバック データ キューは有効な状態です。つまり、コールバック データ構造項目をキューに挿入できます。 キューを無効にするには、 FltCbdqDisable を呼び出し、 FltCbdqEnable を呼び出して再度有効にします。

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

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

ミニフィルター ドライバーは、キューに対して任意の内部実装を使用できます。 フィルター マネージャーは、 FltCbdqInitialize によって提供されるディスパッチ ルーチンのセットを介してのみミニフィルター ドライバーのキューの実装と対話します。

システムは、必要に応じてキューを自動的にロックおよびロック解除します。 ミニフィルター ドライバーは、 CbdqInsertIoCbdqRemoveIoおよび CbdqPeekNextIo ルーチン内にロックを実装しません。

ミニフィルター ドライバーは、スピン ロックミューテックス オブジェクトリソース変数など、CbdqAcquire ルーチンと CbdqRelease ルーチンのロック メカニズムとして、オペレーティング システムの同期プリミティブのいずれかを使用できます。 ミニフィルター ドライバーがミューテックスまたはリソースではなくスピン ロックを使用してキューを保護する場合、IRQL <= DISPATCH_LEVEL で FltCbdqXxx ルーチンを呼び出すことができることに注意してください。 ミューテックスまたはリソースを使用する場合、ミニフィルター ドライバーは、FltCbdqInitialize を除くこれらのルーチンのいずれかを呼び出すときに、IRQL <= APC_LEVELで実行されている必要があります。

ミニフィルター ドライバーは、キューを直接操作しません。 代わりに、 FltCbdqInsertIoFltCbdqRemoveIo、および FltCbdqRemoveNextIo を呼び出して、コールバック データ構造を追加または削除します。 これらのルーチンは、ミニフィルター ドライバーが FltCbdqInitialize に提供したコールバック関数を呼び出します。

ミニフィルター ドライバーは、次のようにキュー ルーチンを実装する必要があります。

Cbdq ルーチン 実装
CbdqInsertIo 指定したコールバック データ構造をキューに挿入します。
CbdqRemoveIo 指定したコールバック データ構造をキューから削除します。
CbdqPeekNextIo このルーチンを使用すると、キュー内の PeekContext に一致するコールバック データ構造をシステムがループ処理できるようになります。 Cbd = CbdqPeekNextIo(Cbdq, NULL, PeekContext) はキュー内の最初の一致するエントリを返す必要があり、 CbdqPeekNextIo(Cbdq, Cbd, PeekContext) は、キュー内の指定されたコールバック データ構造の後に次の一致するエントリを返す必要があります。 ミニフィルター ドライバーは、 PeekContext の意味を完全に定義し、コールバック データ構造が PeekContext 値と一致するタイミングを定義します。
CbdqAcquire このルーチンは、他のスレッドがキューにアクセスできないようにキューをロックする必要があります。 ミニフィルター ドライバーは、任意のロック メカニズムを使用してキューをロックできます。 ミニフィルター ドライバーが KeAcquireSpinLock ルーチンを使用する場合、ミニフィルター ドライバーは、ルーチンの Irql パラメーターによって指されるメモリ位置を使用して IRQL を格納できます。 それ以外の場合、ミニフィルター ドライバーはそのパラメーターを無視できます。
CbdqRelease このルーチンは、 CbdqAcquire によって作成されたキューのロックを解除する必要があります。 ミニフィルター ドライバーがスピン ロックを使用し、CbdqAcquireIrql パラメーターで IRQL 値を返した場合、システムはその値を CbdqReleaseIrql パラメーターに渡します。 ミニフィルター ドライバーは、IRQL を使用して 、KeReleaseSpinLock を呼び出してスピン ロックのロックを解除できます。 それ以外の場合、ミニフィルター ドライバーは Irql パラメーターを無視できます。
CbdqCompleteCanceledIo このルーチンは、取り消された I/O 操作を完了する必要があります。 通常、ミニフィルター ドライバーは FltCompletePendedPreOperation(Data, FLT_PREOP_COMPLETE, NULL) を呼び出すことができます。 ミニフィルター ドライバーでは、コールバック データ構造をデキューする必要はありません。フィルター マネージャーは、CbdqCompleteCanceledIo を呼び出す前に、キューの CbdqRemoveIo を自動的に呼び出します。

要件

要件
対象プラットフォーム ユニバーサル
Header fltkernel.h (Fltkernel.h を含む)
IRQL 任意のレベル

こちらもご覧ください

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInsertIo

FltCbdqRemoveIo

FltCbdqRemoveNextIo

FltCompletePendedPreOperation

KeAcquireSpinLock

KeReleaseSpinLock