コンテキストの参照
「フィルター マネージャー」では、参照カウントを使用してミニフィルター コンテキストの有効期間を管理します。 参照カウントは、コンテキストの状態を示す数値です。
コンテキストが正常に作成されるたびに、FltMgr はコンテキストの参照カウントを 1 に初期化します。 これは、コンテキストへの初期参照と呼ばれます。
コンテキストが正常に設定または取得された場合など、コンテキストが参照されるたびに、FltMgr はコンテキストの参照カウントを 1 ずつインクリメントします。
コンテキストが不要になったら、その参照カウントを減らす必要があります。 正の参照カウントは、コンテキストが使用可能であることを意味します。 参照カウントが 0 になると、コンテキストは使用できず、FltMgr によって最終的に解放されます。
FltMgr は、オブジェクトが切り捨てられるときにコンテキストへの初期参照を解放し (参照カウントを 0 に減らします)、フィルターの省略可能なコンテキスト クリーンアップ コールバックを呼び出します。 これはめったに発生しませんが、ミニフィルターが破棄する前にオブジェクトからコンテキストを削除する必要がある場合、ミニフィルターは FltDeleteContext を呼び出してコンテキストへの最初の参照を安全に解放する必要があります。
ミニフィルターは、FltReferenceContext を呼び出してコンテキストの参照カウントをインクリメントすることで、コンテキストへの独自の参照を追加できます。 ミニフィルターは、FltReleaseContext を呼び出すことによって、この追加された参照を最終的に削除する必要があります。
一般的なオブジェクトの参照カウント履歴の簡単な例を次に示します。 すべての Flt API 呼び出しが成功するとします。
フィルター コールバック | 呼び出された Flt API | コンテキスト参照数 | 説明 |
---|---|---|---|
PreCreate | FltAllocateContext | 1 | フィルターは事前作成を処理しており、ファイルを追跡する場合があります。 ストリーム コンテキストを割り当てます。これにより、FltMgr は参照カウントを 1 に初期化します。 フィルターは、CompletionContext パラメーターを使用して PostCreate コールバックにコンテキストを渡します。 |
PostCreate | FltSetStreamContext | 2 | フィルターは、PreCreate 中に割り当てられたコンテキストを PostCreate コールバックに渡しました。 作成が成功したので、フィルターによってコンテキストが接続され、FltMgr によって参照カウントがインクリメントされます。 |
PostCreate | FltReleaseContext | 1 | FltSetStreamContext は参照カウントをインクリメントしたため、フィルターは余分なカウントを削除する必要があります。 参照カウントは、フィルターがコンテキストを解放した後も 1 であるため、コンテキストは有効なままです。 フィルターが結局このファイルを気にしないと判断した場合は、FltSetStreamContext の呼び出しをスキップし、単に FltReleaseContext を呼び出す可能性があります。 その場合、カウントは 0 になり、コンテキストの割り当てが解除されます。 |
PreRead | FltGetStreamContext | 2 | フィルターは読み取り I/O を確認し、このファイルを追跡しているかどうかを知りたいと考えています。 ストリーム コンテキストを要求して取得するため、このファイルを追跡する必要があります。 FltMgr は、参照カウントをインクリメントします。 |
PreRead | FltReleaseContext | 1 | フィルターはコンテキストを使用して実行されるため、解放され、参照カウントが減少されます。 すべての FltGet*Context は、FltReleaseContext とバランスを取る必要があります。 |
PreCleanup | FltGetStreamContext | 2 | フィルターは、参照カウントをインクリメントするコンテキストを要求して取得します。 |
PreCleanup | FltReleaseContext | 1 | フィルターはコンテキストを使用して実行されるため、参照カウントが減少されます。 |
コンテキスト クリーンアップ コールバック | 0 | ファイル システムが基になるストリーム オブジェクトを破棄しています。 (ストリーム オブジェクトの特定のケースでは、破棄は IRP_MJ_CLOSE によってトリガーされます)。 FltMgr は、参照カウントを 0 に減少し、フィルターのコンテキスト クリーンアップ コールバックを呼び出します。 フィルターにコンテキストをクリーンアップする機会を得ました。 |