許多開發者以為 32 位→64 位移植是大工程,實則 絕大多數 32 位應用程式可在 64 位 Windows 上零修改運行。關鍵在於理解 WOW64 子系統與少數需人工介入的邊界情況。
ntdll.dll 與核心之間),非核心模式| 資源 | 32 位視角 | 64 位實際位置 | WOW64 處理 |
|---|---|---|---|
| 系統目錄 | C:\Windows\System32 | C:\Windows\SysWOW64 | 攔截 GetSystemDirectory 返回 SysWOW64 |
| Program Files | C:\Program Files | C:\Program Files (x86) | 檔案系統重導向器自動映射 |
| 註冊表 | HKLM\SOFTWARE\... | HKLM\SOFTWARE\Wow6432Node\... | 註冊表重導向自動映射 |
; 32 位程式寫入
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp
; 64 位系統實際存放
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\MyApp
; 32 位程式讀取時,WOW64 透明重導向,無感知
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
BOOL IsWow64() {
BOOL bIsWow64 = FALSE;
LPFN_ISWOW64PROCESS fnIsWow64Process =
(LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(_T("kernel32")), "IsWow64Process");
if (fnIsWow64Process != NULL) {
if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) {
AfxMessageBox(_T("IsWow64 error!"));
}
}
return bIsWow64; // TRUE = 運行在 64 位系統的 WOW64 中
}
注意:
IsWow64Process從 Windows XP 64-bit / Server 2003 SP1 開始可用,舊系統需檢查函式指標是否為 NULL。
SOFTWARE、Uninstall 等):WOW64 完全透明化,**既有代碼無需修改**KEY_WOW64_64KEY 旗標(RegOpenKeyEx)KEY_WOW64_32KEY 旗標| 類別 | 原因 | 對策 |
|---|---|---|
| 核心模式驅動程式 | 32 位驅動無法載入 64 位核心 | 原始碼重編為 64 位,簽名認證 |
| 載入 32 位 DLL 的 64 位進程(或反向) | 進程位數與 DLL 位數必須一致 | DLL 提供雙版本,或進程拆分為 32/64 位雙進程 + IPC |
| 高效能計算/大量記憶體 | WOW64 有參數擴展/模式切換開銷 | 原生 64 位編譯,使用 64 位暫存器與 >4GB 記憶體 |
| Shell Extension / COM 進程內伺服器 | Explorer 是 64 位進程,只能載入 64 位擴充 | 編譯 64 位版本 |
DWORD 存放指標 → 改 DWORD_PTR/ULONG_PTR/uintptr_t#pragma pack、__int64 對齊變化%d 印指標 → %p、%Iu (size_t)GetWindowLong → GetWindowLongPtr)本文出自原博客,內容經整理優化發布