コンテキストの削除
set by a successful call to FltSetXxxContext を正常に呼び出して設定するすべてのコンテキストを、最終的には削除する必要があります。
次のような状況が発生すると、フィルター マネージャーによってコンテキストが自動的に削除されます。
- コンテキストがアタッチされているオブジェクトが削除される
- ミニフィルター インスタンスがボリュームからデタッチされる
- ミニフィルター ドライバーがアンロードされる
したがって、ミニフィルターがコンテキストを明示的に削除する必要はほとんどありません。
ミニフィルターは、次のいずれかのコンテキスト削除ルーチンを呼び出すことによってコンテキストを削除できます。
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
コンテキストを削除できるのは、その時点でそれがオブジェクトに対して設定されている場合のみです。 コンテキストを削除できないのは、それがまだ設定されていない場合、または FltSetXxxContext の呼び出しが正常に行われて既に置き換えられている場合です。
FltDeleteXxxContext ルーチンが OldContext パラメーターの古いコンテキストへのポインターを返すのは、OldContext が NULL 以外で、NULL_CONTEXT を指していない場合です。 OldContext が NULL の場合、フィルター マネージャーがコンテキストの参照カウントを 1 つ減らします。その後、コンテキストに対する未処理の参照がミニフィルターにない限り、コンテキストが解放されます。
次のコード例は、ストリーム コンテキストを削除する方法を示しています。
status = FltDeleteStreamContext(
FltObjects->Instance, //Instance
FltObjects->FileObject, //FileObject
&oldContext); //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
FltReleaseContext(oldContext);
}
この例で、FltDeleteStreamContext によって以下が行われます。
- ストリームからストリーム コンテキストを削除します。
- コンテキストの参照カウントを減らしません。OldContext パラメーターが NULL ではないためです。
- 削除済みコンテキスト (ストリームから削除されたコンテキスト) のアドレスを OldContext パラメーターに返します。
OldContext パラメーターが NULL 以外であるため、必要な処理を実行した後で、フィルターが FltReleaseContext を呼び出して削除済みコンテキストを解放する必要があります。