我有一個想法,我正在努力。我有一個我正在嘗試創建的 Windows 微型過濾器驅動程式,它將虛擬化某些行程對檔案的更改。我通過捕獲寫入并將寫入發送到位于虛擬化位置的檔案來做到這一點。問題是:如果行程試圖讀取,它需要對它沒有寫入的檔案部分進行未更改的讀取,但它需要從已寫入的部分中獲取更改的讀取。如何以有效的方式跟蹤已更改的檔案段?我似乎記得一種可以使用位掩碼來映射檔案段的方法,但我可能記錯了。無論如何,任何幫助將不勝感激。
uj5u.com熱心網友回復:
兩種解決方案:
只需將原始檔案復制到虛擬化存盤中,并僅使用該檔案即可。對于小檔案,它可能是最好和最快的解決方案。舉個例子,假設任何小于 65536 位元組的檔案都將被完全復制——在任何情況下都使用 2 的冪。如果檔案增長超過限制,請參閱解決方案 2。
對于大檔案,將覆寫的段保留在虛擬化存盤中,在需要時根據當前檔案位置使用它們。最簡單的方法是將其拆分為 65536 位元組的塊...您可以通過將檔案的位置向右移動 16 來獲得塊編號,并且通過僅屏蔽低 16 位來獲得塊內的位置。
例子:
file_position = 165 232 360
chunk_number = file_position >> 16 (== 2 521)
chunk_pos = file_position & 0xFFFF (== 16 104)
因此,您的虛擬化存盤成為一個目錄,存盤名為 trivially 的塊(例如,塊 #2521 = 2521.chunk)。
當發生寫入時,您開始將原始資料復制到虛擬化存盤中的新塊中,然后允許應用程式寫入其中。
顯然,如果檔案在增長,只需??添加僅存在于虛擬化存盤中的塊。
它并不完美——您可以使用增量塊而不是完整塊來節省磁盤空間——但這是一個好的開始,以后可以進行優化。此外,添加版本非常容易,并跟蹤:
- 使用該檔案的各種應用程式(保留多個虛擬化存盤),
- 連續啟動(運行#1 修改檔案開頭,運行#2 修改檔案結尾,您保留兩個虛擬化,并且可以輕松“恢復”上次啟動)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456453.html
