共用方式為


Windows 機密:發展歷史 — 長期探索歷程

加入我們的 Windows 機密專欄作家行列,讓我們共同體驗名稱帶有“System”的所有目錄的曲折歷程吧!

Raymond Chen

過去,在還是 16 位 Windows 時,只有一個名為 C:\Windows\System 的目錄。 隨後就變得越來越複雜。

在引入 Win32 之後,又增加了另一個名為 C:\Windows\System32 的系統目錄。 增加的這個目錄用於容納 32 位系統檔, 而 16 位系統檔仍然位於舊系統目錄中。 除了 Windows 95 之外,其他系統中的 32 位和 16 位系統檔都在相同的目錄中,即保留其舊名稱 C:\Windows\System。 我們將不再贅述 Windows 95。

批次檔從 C:\Windows\System32 中運行程式,預期隨之運行的程式將與本機作業系統匹配。 雖然這些預期不是很明確,但是可根據活動的性質確定。 如果 System32 目錄中都是 32 位程式,則運行 C:\Windows\System32\REG.EXE 程式以重新設置系統登錄設置的批次檔將運行 32 位版本的 REG.EXE,這意味著系統將更新 32 位類比版本的註冊表,而不是更新真正的 64 位版本。 其他類型的腳本編寫檔(如 REG 檔)也存在相同的問題。

此外,還有大量現有的 32 位程式對 System32 路徑採用了硬編碼,而不是調用 GetSystemDirectory 函數。 當針對 64 位 Windows 重新編譯這些程式時,這些程式仍會嘗試訪問 System32 目錄,希望找到 64 位檔(因為此程式現在正在進行 64 位編譯)。 寫入到設定檔或註冊表的路徑需要對 32 位和 64 位進程都有意義,還需要根據執行詢問任務的程式的“位數”引用相應的目錄。

還是一頭霧水?

為了將其與容易混淆的情況區分開,Windows 團隊決定 System32 目錄在 64 位系統中存放 64 位檔,而在 32 位系統中存放 32 位檔。 32 只是名稱的一部分而已,並不具有任何意義。 這類似于 DVD 僅僅是一個名稱,而沒有任何實際含義,或許多大公司將其名稱正式更改為一串字母,這些字母曾經代表過某些具體含義,而如今只是一個名稱而已,例如 HSBC、KFC、BP 和 KPMG。

面向 32 位進程的檔案系統重定向增加了這已令人困惑的過程的複雜性。 當 32 位進程訪問 64 位系統中的 C:\Windows\System32 目錄時,其操作將重定向到 C:\Windows\SysWOW64 目錄,您可以在該目錄下找到 32 位系統 DLL。

因此,您應該將 System32 視為“與正在運行的應用程式具有相同位數的系統 DLL”目錄的有些奇怪的名稱。 在更真實的世界中,與這種類型類似的情況應該稱為 SysExec 目錄,因為其中包含與執行環境相匹配的檔。

別急,還有一些內容需要討論

如果您想從 32 位進程訪問實際的 64 位系統目錄,該怎麼辦? 檔案系統重定向將嘗試訪問 C:\Windows\System32 目錄,並將其重定向到 C:\Windows\SysWOW64 目錄。 您可以以程式設計方式使用這些採用繁瑣名稱(如 Wow64­Disable­Wow64­Fs­Redirection)的函數,但這些函數可能對所有操作都禁用了重定向,直到對其重新啟用重定向功能。 如果您執行的操作比打開單個檔複雜,這可能會出現問題。 執行複雜操作可能會導致訪問多個檔,還可能導致創建工作執行緒。

名字帶有“System”的各個目錄的曲折歷程,現在介紹完了。 如果還是不很明白,只需記住目錄的意義很少與其名稱相匹配即可。

Raymond Chen

Raymond Chen 的網站“The Old New Thing”及同名著作(Addison-Wesley,2007)講述了 Windows 的發展史、Win32 程式設計和其他有趣的內容。

相關內容