Сведения о реализации 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-разрядный крючок в цепочке крючка. Дополнительные сведения см. в разделе Использование перехватчиков.