Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эмулятор WOW64 выполняется в пользовательском режиме. Он предоставляет интерфейс между 32-разрядной версией Ntdll.dll и ядром процессора, и он перехватывает вызовы ядра. Эмулятор WOW64 состоит из следующих библиотек DLL:
- Wow64.dll предоставляет базовую инфраструктуру эмуляции и thunks для функций точки входа Ntoskrnl.exe.
- Wow64Win.dll предоставляет thunks для функций точки входа 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. 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-разрядную библиотеку DLL x86 в 32-разрядный процесс ARM.
Дополнительные сведения см. в разделе SetWindowsHookEx.
Помните, что WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELLи низкоуровневые перехватчики можно вызывать на потоке, который установил крючок, а не поток обработки крючка. Для этих крюков, возможно, что 32-разрядные и 64-разрядные крючки будут вызываться, если 32-разрядный крючок впереди 64-разрядного крючка в цепочке крючка. Дополнительные сведения см. в разделе Использование перехватчиков.