Windows Vista里面延遲刪除技術的變更
在 Windows 2000/XP/Server 2003 里面,包括Microsoft在內的各個軟件廠商在碰到文件被占用無法馬上替換問題的時候,都會使用MoveFileEx API函數讓系統在注冊表
Key:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerValue:PendingFileRenameOperations
鍵值下面建立一個延遲刪除列表,系統在下次啟動的時候,CSRSS.EXE進程將根據這個列表對文件進行延遲更新或者延遲刪除操作。
注:PendingFileRenameOperations是一個REG_MULTI_SZ類型的注冊表鍵值,不能直接通過注冊表編輯器編輯,否則會造成延遲刪除列表被破壞。要查看這個鍵值的內容,可以使用注冊表編輯器或者使用我以前開發的 PendMove 工具,
對于Windows XP和Windows Vista兩個操作系統在安裝完需要重啟的補丁以后的PendingFileRenameOperations鍵值數據以后會發現,Windows XP是利用PendingFileRenameOperations控制被占用文件進行被占用文件的升級和刪除操作的。而Windows Vista并沒有使用這個鍵值控制被占用文件的升級和刪除操作。那么Windows Vista 補丁程序是怎么實現的延遲刪除呢?
首先,需要明確的一點就是Windows Vista 新增的 Restart Manager 機制并沒有完全被使用如果按照以前的說法,Windows Vista 在安裝完補丁程序以后基本上是不需要重啟的,但是現在看來每次打補丁都必須重啟系統,至少進幾個月的補丁都是這樣的。
那么Windows Vista是如何得知被占用文件的目標文件和源文件信息,如何進行升級的呢?
在進行一番搜索以后,發現Windows Vista是利用一個/多個XML文件記錄數據信息,在一個特別的目錄里面存放臨時文件和升級文件的。我們知道,以前打完Windows 補丁,都會在Windows目錄下出現在$KB目錄,但是Windows Vista好像沒有這個內容,看不見嗎?不是看不見,是因為根本就沒有生成。
實際上,Windows Vista 是利用 %SystemRoot%WinSxS 目錄來存放臨時文件、備份文件和配置信息的,Windows 會在適當的時候根據配置文件來完成文件的更新操作。
打開 %SystemRoot%WinSxS 目錄,會看到兩個XML文件,pending.xml 和 cleanup.xml。前者記錄了文件的新版本信息和舊版本信息,后者用途好像是用于清理環境的。
根據XML文件的描述,很容易得知:
%SystemRoot%WinSxSBackup 目錄存放舊版本的文件 %SystemRoot%WinSxSTemp 目錄存放需要升級到的新版本文件 注意:Windows Vista 的升級機制又不同于以前版本的Windows,是增量升級哦。也就是只需要下載不同的片段內容,Windows Vista 會根據片段內容和原始文件進行拼接以后,生成新的文件。最后留一個問題給大家:Windows Vista 之前的操作系統是利用 CSRSS.EXE 實現文件更新的,那么Windows Vista呢?
本文轉自:http://blogs.itecn.net/,作者:smallfrogs
