次の方法で共有


コンテキストのリリース

ミニフィルターは、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 になり、フィルター マネージャーによって解放されます。