篩選管理員會使用參考計數來管理迷你篩選內容的存留期。 參考計數是指出內容狀態的數位。
每當成功建立內容時,FltMgr 會將內容的參考計數初始化為一個。 這稱為對上下文的初始參考。
每當引用上下文,例如成功的上下文設定或取得,FltMgr 會將上下文的引用計數遞增一個。
當不再需要上下文時,其參考計數必須遞減。 正的參考計數表示上下文是可用的。 當引用計數變成零時,該上下文無法使用,並且 FltMgr 最終會釋放它。
FltMgr 會在物件被拆毀時釋放內容的初始參考(遞減參考計數為零),然後呼叫篩選條件的選擇性 內容清除回呼。 雖然這種情況很少發生,但如果迷你篩選必須在卸除之前從物件中移除內容,迷你篩選必須藉由呼叫 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,然後呼叫篩選器的內容清理回呼。 篩選條件現在有機會改善其情境。 |