Сведения о реализации WOW64

Эмулятор WOW64 работает в пользовательском режиме. Он предоставляет интерфейс между 32-разрядной версией Ntdll.dll и ядром процессора и перехватывает вызовы ядра. Эмулятор WOW64 состоит из следующих библиотек DLL:

  • Wow64.dll предоставляет базовую инфраструктуру эмуляции и блоки для Ntoskrnl.exe функций точки входа.
  • Wow64Win.dll предоставляет фрагменты для функций точки входа Win32k.sys.
  • (только x64) Wow64Cpu.dll обеспечивает поддержку запуска программ x86 на x64.
  • (Только Intel Itanium) IA32Exec.bin содержит программный эмулятор x86.
  • (Только Intel Itanium) Wowia32x.dll предоставляет интерфейс между IA32Exec.bin и WOW64.
  • (только ARM64) xtajit.dll содержит программный эмулятор x86.
  • (Только ARM64) wowarmw.dll обеспечивает поддержку запуска программ ARM32 в ARM64.

Эти библиотеки DLL вместе с 64-разрядной версией Ntdll.dll являются единственными 64-разрядными двоичными файлами, которые можно загрузить в 32-разрядный процесс. На Windows 10 в ARM двоичные файлы CHPE (скомпилированный гибридный переносимый исполняемый файл) также могут быть загружены в 32-разрядный процесс x86.

При запуске Wow64.dll загружает x86-версию Ntdll.dll (или версию CHPE, если она включена) и запускает код инициализации, который загружает все необходимые 32-разрядные библиотеки DLL. Почти все 32-разрядные библиотеки DLL представляют собой неизмененные копии 32-разрядных двоичных файлов Windows, хотя некоторые из них загружаются как CHPE из соображений производительности. Некоторые из этих библиотек DLL в WOW64 работают иначе, чем в 32-разрядной версии Windows, обычно потому, что они совместно используют память с 64-разрядными системными компонентами. Все адресное пространство в пользовательском режиме выше 32-разрядного ограничения зарезервировано системой. Дополнительные сведения см. в разделе Производительность и потребление памяти в разделе WOW64.

Вместо использования последовательности вызовов системной службы x86 32-разрядные двоичные файлы, выполняющие системные вызовы, перестраиваются для использования пользовательской последовательности вызовов. Эта последовательность вызовов недорога для перехвата WOW64, так как она остается полностью в пользовательском режиме. При обнаружении пользовательской последовательности вызовов ЦП WOW64 переходит обратно в собственный 64-разрядный режим и вызывает Wow64.dll. Отключение выполняется в пользовательском режиме, чтобы уменьшить влияние на 64-разрядное ядро и снизить риск ошибки в системе, которая может привести к сбою режима ядра, повреждению данных или дыре в безопасности. Блоки извлекают аргументы из 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-разрядную библиотеку DLL x86 в 32-разрядный процесс ARM.

Дополнительные сведения см. в разделе SetWindowsHookEx.

Имейте в виду, что WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL и низкоуровневые перехватчики можно вызывать в потоке, который установил перехватчик, а не потоке, обрабатывающем перехватчик. Для этих крючков, возможно, что как 32-разрядные, так и 64-разрядные крючки будут вызваны, если 32-разрядный крючок опережает 64-разрядный крючок в цепочке крючка. Дополнительные сведения см. в разделе Использование перехватчиков.