コンテキストのリリース
ミニフィルターは、FltReleaseContext を呼び出してコンテキストを解放します。 次のいずれかのルーチンの呼び出しが成功するたびに、FltReleaseContext の呼び出しによって最終的に一致する必要があります。
コンテキスト作成ルーチン。
コンテキスト取得ルーチン。
コンテキスト設定ルーチン。
コンテキスト参照増分ルーチン。
FltSetXxxContext によって返される OldContext ポインターと、FltDeleteContext によって返されるコンテキスト ポインターも、不要になったら解放する必要があることに注意してください。
CTX サンプル ミニフィルターから取得した次のコード例では、CtxInstanceSetup ルーチンによってインスタンス コンテキストが作成および設定され、FltReleaseContext が呼び出されます。
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //Operation
instanceContext, //NewContext
NULL); //OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
FltSetInstanceContext の呼び出しが成功したかどうかに関係なく、FltReleaseContext が呼び出されることに注意してください。
FltSetInstanceContext が成功すると、インスタンス コンテキストへの独自の参照が追加されます (つまり、インスタンス コンテキストの参照カウントがインクリメントされます)。 したがって、FltAllocateContext によって設定された参照は不要になり、FltReleaseContext の呼び出しによって削除されます。
FltSetInstanceContext が失敗した場合、インスタンス コンテキストには、FltAllocateContext によって設定された参照が 1 つだけ存在します。 FltReleaseContext が返されると、インスタンス コンテキストの参照カウントは 0 になり、フィルター マネージャーによって解放されます。