Windows 機密文件檔案系統矛盾說

Raymond Chen

如果您稍微看看 自己的硬碟,應該會注意到在開機磁碟機的根目錄中,有不少作業系統檔案根本無所事事。如果再仔細看看那些檔案,就會發現一個重點:boot.ini、NTLDR 和 NTDETECT.COM 是關鍵開機檔,hiberfil.sys 是休眠檔。其實,在啟動作業系統前幾個關鍵階段,以及從休眠回復正常作業 (hiberfil.sys 檔) 時,最重要的就只有這幾個檔案,而這些檔案都必須放在開機磁碟機的根目錄下。為什麼不能把它們移到其他地方呢?

下面是我同事 Adrian Oney 的解釋:如果要從磁碟外面讀取開機檔,必須借助檔案系統驅動程式才行,但是檔案系統驅動程式存在於磁碟上,必須等它們載入之後才能讀取。這不是自相矛盾嗎?

其實要解開這個矛盾,只需在那些關鍵開機檔內建一個迷你檔案系統驅動程式就行了。這個迷你驅動程式唯一的本事就是在根目錄尋找檔案,把它們載入到記憶體中。之後就由那些檔案啟動作業系統,然後再由真正的檔案系統驅動程式接手,到更特別的地方 (例如,子目錄) 尋找檔案。

  

休眠的情況也很類似。讓作業系統休眠,就是把整個記憶體內容倒進休眠檔中,而從休眠恢復正常作業,就是把檔案再塞回記憶體,假裝什麼都沒發生過。這跟開機一樣,也是一個雞生蛋蛋生雞的問題:要載入休眠檔,必須借助檔案系統驅動程式,但是檔案系統驅動程式卻在休眠檔中,該怎麼辦呢?如果休眠檔仍然留在開機磁碟機的根目錄,這時候就可以改用迷你檔案系統驅動程式。

使用舊版 MS-DOS® 的人,都很清楚作業系統開機檔的位置限制。舊的 SYS 命令將無趣的舊式磁片做成神奇的開機磁片。但是如果您在已有資料的磁片上執行它,可能無法進行轉換作業,因為舊版 MS-DOS 的開機檔必須放在磁片的特定位置上,開機磁區才找得到它們。 較新版的 MS-DOS 雖然改善了開機載入器,放寬限制,但是系統檔案仍舊必須放在根目錄下。

就有一位客戶問我:「我能把休眠檔移到子目錄嗎?」,反正檔案在哪裡還不都一樣嗎?無論把它放在哪裡,檔案上的 ACL 都是一樣的。但是當他們想把檔案放在開機磁碟機以外的磁碟機時,卻被告知行不通。那是因為他們沒有真正明白這項限制的原因,所以才會規避正常程序:如果我把它移到子目錄下,就可以建立一個目錄,把它作為連接點,指向我真正希望放置休眠檔的地方。嘩~ 我把休眠檔移位了!

當然嘍,迷你檔案系統驅動程式是不會認得掛接點的,因為掛接點的任務是要和磁碟管理服務交談,而在系統開機時,電腦連作業系統都尚未載入,更別提其他知道如何將磁碟機代號對應回 ARC 路徑的進階服務了。即使碰巧執行了這個服務,也要找出其他硬碟的裝置驅動程式,載入對應的檔案系統驅動程式才行。

其實這些矛盾都有解決的一天,一切只是時間問題罷了,就算哪天有人把休眠檔放在 DFS 連接點上,也不是不可能的對吧。

Raymond Chen 的網站「The Old New Thing」以及同名著作(Addison-Wesley,2007 年) 均探討 Windows 的歷史和 Win32 程式設計。他在 Web 2.0 所用的名字是 Raymond,要不然就是 Chenster。

© 2008 Microsoft Corporation and CMP Media, LLC. 保留所有權利;未經允許,嚴禁部分或全部複製.