在 64 位元 Windows (x64) 系統中,存在兩個關鍵系統資料夾:C:\Windows\System32 與 C:\Windows\SysWOW64。直覺上會以為 System32 裝 32 位檔案,SysWOW64 裝 64 位檔案,**但事實完全相反**。本文從 CPU 架構演進、WoW64 技術原理、相容性設計三個層面,徹底講透這個「反直覺」的設計決策。
Windows x64 版本建立在 AMD64/Intel 64 架構上,**硬體原生支援 32 位應用執行**,作業系統只需提供系統呼叫轉換層。
WoW64 (Windows 32-bit on Windows 64-bit) 是 x64 Windows 內建的**輕量級轉換層**,讓 32 位應用「以為」自己運行在 32 位系統上:
%windir%\System32 → 自動重導向至 %windir%\SysWOW64HKLM\Software → HKLM\Software\Wow6432Node**關鍵點**:WoW64 **不是模擬器**,是系統呼叫轉譯器,CPU 直接執行 32 位指令,效能接近原生。
C:\Windows\System32 路徑 (如 LoadLibrary("C:\Windows\System32\xxx.dll"))System64,所有硬編碼路徑的 32 位應用**全部失效**# 64 位系統下
dir C:\Windows\System32\notepad.exe
# 檔案屬性 → 詳細資料 → 檔案版本/描述 → 顯示 64 位
dir C:\Windows\SysWOW64\notepad.exe
# 同樣檔名,但屬性顯示 32 位
# 32 位應用 (如 32 位 cmd.exe) 執行
%windir%\SysWOW64\cmd.exe
dir %windir%\System32\notepad.exe
# 實際列出的是 SysWOW64 下的 32 位 notepad.exe (重導向生效)
# 64 位應用 (預設 cmd.exe) 執行
dir %windir%\System32\notepad.exe
# 列出的是 System32 下的 64 位 notepad.exe
| 場景 | 陷阱 | 正確做法 |
|---|---|---|
| 批次檔/腳本檢查檔案存在 | if exist %windir%\System32\xxx.dll 在 32 位腳本中檢查的是 SysWOW64 | 使用 %windir%\Sysnative\xxx.dll (僅 32 位進程有效,強制存取真正的 System32) |
| 註冊表讀寫 | 32 位應用寫 HKLM\Software 實際進入 Wow6432Node | 需 64 位視圖用 reg add HKLM\Software /reg:64 或 64 位進程操作 |
| 安裝程式部署 DLL | 32 位安裝程式將 64 位 DLL 複製到 System32 失敗 (被重導向到 SysWOW64) | 安裝程式必須為 64 位,或使用 Sysnative 別名 |
| ODBC 資料來源 | 32 位 ODBC 管理員 (odbcad32.exe) 只看 32 位驅動 | 分別執行 32/64 位 odbcad32.exe (%windir%\SysWOW64\odbcad32.exe / %windir%\System32\odbcad32.exe) |
GetVersion() >> 16 == 5 (XP/2003),若 Vista/7 為 6.0/7.0,邏輯判斷「非 XP 以下」→ 拒絕執行或功能受限SysWOW64 的存在,是 Microsoft 為了**在不破壞數百萬既有 32 位應用的前提下**,順利推廣 64 位 Windows 所做的極致相容性工程。理解其背後的**重導向機制、命名邏輯、硬編碼路徑困境**,能讓開發者避開部署陷阱,運維人員精準定位檔案與註冊表問題。**相容性,永遠是作業系統演進中最難、最貴、最值得投資的課題。**