WOW64 實作詳細資料
WOW64 模擬器會在使用者模式中執行。 它提供 32 位版本的 Ntdll.dll 與處理器核心之間的介面,並攔截核心呼叫。 WOW64 模擬器包含下列 DLL:
- Wow64.dll提供Ntoskrnl.exe進入點函式的核心模擬基礎結構和 Thunks。
- Wow64Win.dll提供Win32k.sys進入點函式的 Thunks。
- (x64 僅) Wow64Cpu.dll支援在 x64 上執行 x86 程式。
- (Intel Itanium 僅) IA32Exec.bin 包含 x86 軟體模擬器。
- (Intel Itanium 僅) Wowia32x.dll提供 IA32Exec.bin 與 WOW64 之間的介面。
- (ARM64 僅) xtajit.dll包含 x86 軟體模擬器。
- (ARM64 僅) wowarmw.dll支援在 ARM64 上執行 ARM32 程式。
這些 DLL 以及 64 位版本的 Ntdll.dll,是唯一可載入至 32 位進程的 64 位二進位檔。 在 ARM 上的Windows 10上,CHPE (編譯的混合式可攜式可執行檔) 二進位檔也可能載入 x86 32 位進程。
啟動時,如果啟用) 並執行其初始化程式碼,Wow64.dll載入 x86 版本的 Ntdll.dll (或 CHPE 版本,這會載入所有必要的 32 位 DLL。 幾乎所有 32 位 DLL 都是 32 位 Windows 二進位檔的未修改複本,但有些 DLL 會因為效能原因而載入為 CHPE。 其中一些 DLL 會寫入 WOW64 上的行為與在 32 位 Windows 上的行為不同,通常是因為它們與 64 位系統元件共用記憶體。 系統會保留高於 32 位限制的所有使用者模式位址空間。 如需詳細資訊,請參閱 WOW64 下的效能和記憶體耗用量。
系統會重建進行系統呼叫的 32 位二進位檔,而不是使用 x86 系統服務呼叫序列。 此呼叫順序很便宜,WOW64 會攔截,因為它完全處於使用者模式。 偵測到自訂呼叫順序時,WOW64 CPU 會轉換回原生 64 位模式,並呼叫至 Wow64.dll。 Thunking 是在使用者模式中完成,以減少對 64 位核心的影響,並降低 Thunk 中可能導致核心模式損毀、資料損毀或安全性漏洞的 Bug 風險。 Thunks 會從 32 位堆疊擷取引數,並將其擴充至 64 位,然後進行原生系統呼叫。
環境變數
當 32 位進程由 64 位進程建立,或 64 位進程由 32 位進程建立時,WOW64 會設定所建立進程的環境變數,如下表所示。
處理序 | 環境變數 |
---|---|
64 位進程 |
PROCESSOR_ARCHITECTURE=AMD64 或 PROCESSOR_ARCHITECTURE=IA64 或 PROCESSOR_ARCHITECTURE=ARM64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles% Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 從 Windows 7 和 Windows Server 2008 R2 開始,已新增 ProgramW6432 和 CommonProgramW6432 環境變數。 |
32 位進程 |
PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE% ProgramFiles=%ProgramFiles (x86) % ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles (x86) % CommonProgramW6432=%CommonProgramFiles% |
全域勾點
如果符合下列條件, SetWindowsHookEx 函式可用來將 DLL 插入另一個進程:
- 32 位 DLL 只能插入 32 位進程,而 64 位 DLL 只能插入 64 位進程。 您無法將 32 位 DLL 插入 64 位進程,反之亦然。
- 32 位和 64 位 DLL 必須有不同的名稱。
- DLL 和進程的架構必須相符。 例如,您無法將 32 位 x86 DLL 插入 32 位 ARM 進程。
如需詳細資訊,請參閱 SetWindowsHookEx。
請注意,WH_MOUSE、WH_KEYBOARD、WH_JOURNAL*、WH_SHELL和低階勾點可以在安裝攔截的執行緒上呼叫,而不是處理攔截的執行緒。 針對這些勾點,如果 32 位和 64 位勾點在攔截鏈結中 64 位攔截之前,可能會呼叫 32 位攔截。 如需詳細資訊,請參閱 使用勾點。