コンテキストの種類の登録

ミニフィルター ドライバーは、まず、使用するコンテキストの種類ごとに登録する必要があります。 ミニフィルターが使用するコンテキスト型を登録すると、コンテキストを作成できます。

コンテキストの種類を登録する手順

ミニフィルターは、DriverEntry ルーチンから FltRegisterFilter を呼び出して、使用するコンテキストの種類ごとに登録します。 FltRegisterFilter を呼び出す前に、ミニフィルター ドライバーは次の処理を行います。

  • FLT_CONTEXT_REGISTRATION 構造体の可変長配列を作成します。 この配列内の要素の順序は重要ではありません。ただし、配列内の最後の要素は {FLT_CONTEXT_END} である必要があります。
  • 作成された配列へのポインターを、FLT_REGISTRATION 構造体の ContextRegistration メンバーに格納します。 ミニフィルターは、FltRegisterFilter の「登録」パラメーターでこの構造体を渡します。

ミニフィルター ドライバーが使用するコンテキストの種類ごとに、少なくとも 1 つのコンテキスト定義を指定する必要があります。 定義は FLT_CONTEXT_REGISTRATION 構造体の形式であり、各構造体はコンテキストの型、サイズ、およびその他の情報を定義します。

ミニフィルター ドライバーが FltAllocateContext を呼び出して新しいコンテキストを作成すると、フィルター マネージャーは「サイズ」パラメーターと、FLT_CONTEXT_REGISTRATION 構造体の「サイズ」メンバーと「フラグ」メンバーを使用して、使用するコンテキスト定義を選択します。

  • 固定サイズ コンテキストの場合、 FLT_CONTEXT_REGISTRATION 構造体の「サイズ」メンバーは、ミニフィルター ドライバーによって定義されているコンテキスト構造の部分のサイズをバイト単位で指定します。 コンテキストの最大サイズは MAXUSHORT (64 KB) です。 0 は有効なサイズ値です。 フィルター マネージャーは、ルックアサイド リストを使用して固定サイズのコンテキストを実装します。 フィルター マネージャーは、サイズ値ごとに 2 つのルックアサイド リスト (1 ページと 1 つの非ページ) を作成します。

  • 可変サイズのコンテキストでは「サイズ」メンバーを FLT_VARIABLE_SIZED_CONTEXTS に設定する必要があります。 フィルター マネージャーは、ページ プールまたは非ページ プールから直接、可変サイズのコンテキストを割り当てます。

FLT_CONTEXT_REGISTRATION 構造体の「フラグ」メンバーでは、FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH フラグを指定できます。 ミニフィルター ドライバーが固定サイズのコンテキストを使用し、このフラグが指定されている場合、フィルター マネージャーは、コンテキストのサイズが要求されたサイズ以上の場合、ルックアサイド リストからコンテキストを割り当てます。 それ以外の場合、コンテキストのサイズは要求されたサイズと等しい必要があります。

特定のコンテキストの種類に対して、ミニフィルター ドライバーは最大 3 つの固定サイズ のコンテキスト定義を提供できます。それぞれ異なるサイズと 1 つの可変サイズの定義を持ちます。 詳細については「FLT_CONTEXT_REGISTRATION」を参照してください。

コンテキスト管理のためのミニフィルター コールバック ルーチン

ミニフィルター ドライバーは、必要に応じて、FltRegisterFilter にパラメーターとして渡される FLT_REGISTRATION 構造体に格納されている次のコンテキスト関連のコールバック ルーチンを提供できます。

コールバック ルーチン 説明
PFLT_CONTEXT_ALLOCATE_CALLBACK ごくまれに、ミニフィルターは、フィルター マネージャーに依存するのではなく、コンテキストを割り当てるために独自のコールバック ルーチンを定義する必要があります。
PFLT_CONTEXT_CLEANUP_CALLBACK コンテキストが解放される前に呼び出されるミニフィルターのクリーンアップ ルーチン。
PFLT_CONTEXT_FREE_CALLBACK ごくまれに、ミニフィルターは、フィルター マネージャーに依存するのではなく、コンテキストを解放するために独自のコールバック ルーチンを定義する必要があります。

コンテキスト登録コードの例

CTX サンプル ミニフィルター ドライバーから取得した次のコード例は、インスタンス、ファイル、ストリーム、およびファイル オブジェクト (ストリーム ハンドル) コンテキストの登録に使用される FLT_CONTEXT_REGISTRATION 構造体の配列を示しています。

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};