コンテキストの作成
ミニフィルターは、使用するコンテキストの種類を登録してから、FltAllocateContext を呼び出してコンテキストを作成できます。 このルーチンは、「コンテキストの種類の登録」で説明されている条件に従って、使用する適切なコンテキスト定義を選択します。
ミニフィルターは、コンテキストを割り当てて設定を試行する前に次のルーチンを呼び出して、基になるファイル システムが、ファイル コンテキスト、ストリーム コンテキスト、ストリーム ハンドルのうちどのコンテキストをサポートするかを決定できます。
- FltSupportsFileContexts または FltSupportsFileContextsEx
- FltSupportsStreamContexts
- FltSupportsStreamHandleContexts
次のコード例は、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 メンバーに設定されていないことに注意してください。 このケースでは、FltAllocateContext の ContextSize パラメーターが、コンテキスト定義の Size メンバーのものと一致すると、FltAllocateContext が適切な非ページ ルックアサイド リストからインスタンス コンテキストを割り当てます。 値が一致しない場合、FltAllocateContext は STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND という戻り値で失敗します。
成功すると、FltAllocateContext は、新しいコンテキストの参照カウントを 1 に初期化します。 コンテキストが不要になると、ミニフィルター ドライバーはこの参照を解放する必要があります。 つまり、FltAllocateContext のすべての呼び出しには、後続の FltReleaseContext の呼び出しを対応させる必要があります。
コンテキストが作成されると、ミニフィルターはそれをオブジェクトに対して設定できます。