次の方法で共有


コンテキストの設定

新しいコンテキストを作成した後、ミニフィルター ドライバーは、次のセット ルーチンのいずれかを呼び出すことによって、それをオブジェクトに接続できます。

設定ルーチンは「操作」パラメーターの値に応じて、次の処理を行います。

  • 操作 == 」が FLT_SET_CONTEXT_KEEP_IF_EXISTS の場合。

    • ミニフィルターがオブジェクトに対して同じ型のコンテキストをまだ設定していない場合、設定ルーチンは次のようになります。
      • 新しく割り当てられたコンテキストをオブジェクトに接続します。
      • 参照カウントをインクリメントします。
    • それ以外の場合、ミニフィルターでコンテキストが既に設定されている場合、設定ルーチンは次のようになります。
      • STATUS_FLT_CONTEXT_ALREADY_DEFINED (NTSTATUS エラー コード) を返します。
      • 既存のコンテキストを置き換えません。
      • 参照カウントを増分しません。
      • NULL 以外の場合は、OldContext パラメーターに既存のコンテキストへのポインターを格納します。 このポインターが不要になったら、ミニフィルター ドライバーは FltReleaseContext を呼び出して解放する必要があります。
  • 操作 == 」が FLT_SET_CONTEXT_REPLACE_IF_EXISTS の場合。

    • 設定ルーチンは、常に新しいコンテキストをオブジェクトに接続します。
    • ミニフィルター ドライバーでコンテキストが既に設定されている場合、設定ルーチンは次のようになります。
      • 既存のコンテキストを削除し、新しいコンテキストを設定し、新しいコンテキストの参照カウントを増分します。
      • OldContext パラメーターが NULL でない場合は、削除されたコンテキストへのポインターを受け取ります。 このポインターが不要になったら、ミニフィルター ドライバーは FltReleaseContext を呼び出して解放する必要があります。

コンテキストの種類が設定されると、ミニフィルターは後続の I/O 操作中にコンテキストを取得して、何らかのアクションを実行する必要があるかどうかを判断できます。

成功したすべてのコンテキスト設定は、最終的に削除する必要があります。

CTX サンプル ミニフィルターから取得した次のコード例では、CtxInstanceSetup ルーチンによってインスタンス コンテキストが作成および設定されます。

status = FltAllocateContext(
           FltObjects->Filter,              //in: Filter
           FLT_INSTANCE_CONTEXT,            //in: ContextType
           CTX_INSTANCE_CONTEXT_SIZE,       //in: ContextSize
           NonPagedPool,                    //in: PoolType
           &instanceContext);               //out: ReturnedContext
...
status = FltSetInstanceContext(
           FltObjects->Instance,            //in: Instance
           FLT_SET_CONTEXT_KEEP_IF_EXISTS,  //in: Operation
           instanceContext,                 //in: NewContext
           NULL);                           //out: OldContext

if (instanceContext != NULL) {
  FltReleaseContext(instanceContext);
}
return status;

FltSetInstanceContext の呼び出し後、FltReleaseContext への呼び出しによって、FltAllocateContext (FltSetInstanceContextではなく) によって設定された参照カウントが解放されることに注意してください。 これについては「コンテキストのリリース」で説明します。