WOW64 實作詳細數據
WOW64 模擬器會在使用者模式中執行。 它提供32位版本的 Ntdll.dll 與處理器核心之間的介面,並攔截核心呼叫。 WOW64 模擬器包含下列 DLL:
- Wow64.dll 提供 Ntoskrnl.exe 進入點函式的核心模擬基礎結構和 Thunk。
- Wow64Win.dll 提供 Win32k.sys 進入點函式的 Thunk。
- (僅限 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 二進位檔的未修改複本,不過有些會因為效能原因而載入為 CHPE。 其中一些 DLL 在 WOW64 上的行為與 32 位 Windows 上的行為不同,通常是因為它們與 64 位系統元件共用記憶體。 系統會保留高於32位限制的所有使用者模式位址空間。 如需詳細資訊,請參閱 WOW64 下的效能和記憶體耗用量。
建立系統呼叫的 32 位二進位檔會重建為使用自定義呼叫序列,而不是使用 x86 系統服務呼叫序列。 由於 WOW64 完全處於使用者模式,因此此呼叫序列相當便宜。 偵測到自定義呼叫序列時,WOW64 CPU 會轉換回原生 64 位模式,並呼叫 Wow64.dll。 Thunking 是在使用者模式中完成,以減少對64位核心的影響,並降低Thunk中可能導致內核模式損毀、數據損毀或安全性漏洞的錯誤風險。 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: ProgramW6432 和 CommonProgramW6432 環境變數從 Windows 7 和 Windows Server 2008 R2 開始新增。 |
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 位攔截之前,可能會呼叫 32 位和 64 位攔截。 如需詳細資訊,請參閱使用攔截 。