共用方式為


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_MOUSEWH_KEYBOARDWH_JOURNAL*WH_SHELL和低階攔截可以在安裝攔截的線程上呼叫,而不是處理攔截的線程。 針對這些攔截,如果 32 位勾點在勾點鏈結中的 64 位攔截之前,可能會呼叫 32 位和 64 位攔截。 如需詳細資訊,請參閱使用攔截