次の方法で共有


コンテキストの作成

ミニフィルターは、使用するコンテキストの種類を登録してから、FltAllocateContext を呼び出してコンテキストを作成できます。 このルーチンは、「コンテキストの種類の登録」で説明されている条件に従って、使用する適切なコンテキスト定義を選択します。

ミニフィルターは、コンテキストを割り当てて設定を試行する前に次のルーチンを呼び出して、基になるファイル システムが、ファイル コンテキスト、ストリーム コンテキスト、ストリーム ハンドルのうちどのコンテキストをサポートするかを決定できます。

次のコード例は、CTX サンプル ミニフィルター ドライバーのものですが、CtxInstanceSetup ルーチンが FltAllocateContext を呼び出してインスタンス コンテキストを作成します。

status = FltAllocateContext(
      FltObjects->Filter,           //Filter
      FLT_INSTANCE_CONTEXT,         //ContextType
      CTX_INSTANCE_CONTEXT_SIZE,    //ContextSize
      NonPagedPool,                 //PoolType
      &instanceContext);            //ReturnedContext

CTX サンプルでは、インスタンス コンテキストに対して次のコンテキスト定義が登録されています。

{ FLT_INSTANCE_CONTEXT,              //ContextType
  0,                                 //Flags
  CtxContextCleanup,                 //ContextCleanupCallback
  CTX_INSTANCE_CONTEXT_SIZE,         //Size
  CTX_INSTANCE_CONTEXT_TAG },        //PoolTag

このコンテキスト定義は固定サイズです。Size メンバーが CTX_INSTANCE_CONTEXT_SIZE であるためです (これに対して、 FLT_VARIABLE_SIZED_CONTEXTS は可変サイズのコンテキスト定義を指定するために使用されます)。 FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH フラグが Flags メンバーに設定されていないことに注意してください。 このケースでは、FltAllocateContextContextSize パラメーターが、コンテキスト定義の Size メンバーのものと一致すると、FltAllocateContext が適切な非ページ ルックアサイド リストからインスタンス コンテキストを割り当てます。 値が一致しない場合、FltAllocateContext は STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND という戻り値で失敗します。

成功すると、FltAllocateContext は、新しいコンテキストの参照カウントを 1 に初期化します。 コンテキストが不要になると、ミニフィルター ドライバーはこの参照を解放する必要があります。 つまり、FltAllocateContext のすべての呼び出しには、後続の FltReleaseContext の呼び出しを対応させる必要があります。

コンテキストが作成されると、ミニフィルターはそれをオブジェクトに対して設定できます。