Detalles de implementación de WOW64
El emulador WOW64 se ejecuta en modo de usuario. Proporciona una interfaz entre la versión de 32 bits de Ntdll.dll y el kernel del procesador, y intercepta las llamadas del kernel. El emulador WOW64 consta de los siguientes archivos DLL:
- Wow64.dll proporciona la infraestructura de emulación principal y los thunks para las funciones de punto de entrada de Ntoskrnl.exe.
- Wow64Win.dll proporciona thunks para las funciones de punto de entrada de Win32k.sys.
- (solo x64) Wow64Cpu.dll proporciona compatibilidad con la ejecución de programas x86 en x64.
- (Solo Intel Itanium) IA32Exec.bin contiene el emulador de software x86.
- (Solo Intel Itanium) Wowia32x.dll proporciona la interfaz entre IA32Exec.bin y WOW64.
- (solo ARM64) xtajit.dll contiene el emulador de software x86.
- (solo ARM64) wowarmw.dll proporciona compatibilidad con la ejecución de programas ARM32 en ARM64.
Estos archivos DLL, junto con la versión de 64 bits de Ntdll.dll, son los únicos archivos binarios de 64 bits que se pueden cargar en un proceso de 32 bits. En Windows 10 en ARM, los archivos binarios CHPE (ejecutable portable híbrido compilado) también se pueden cargar en un proceso de 32 bits x86.
En el inicio, Wow64.dll carga la versión x86 de Ntdll.dll (o la versión CHPE, si está habilitada) y ejecuta su código de inicialización, que carga todos los archivos DLL de 32 bits necesarios. Casi todos los archivos DLL de 32 bits no están modificados de archivos binarios de Windows de 32 bits, aunque algunos se cargan como CHPE por motivos de rendimiento. Algunos de estos archivos DLL se escriben para comportarse de forma diferente en WOW64 que en Windows de 32 bits, normalmente porque comparten memoria con componentes del sistema de 64 bits. El sistema reserva todo el espacio de direcciones en modo de usuario por encima del límite de 32 bits. Para obtener más información, consulte Consumo de memoria y rendimiento en WOW64.
En lugar de usar la secuencia de llamadas de servicio del sistema x86, se vuelven a generar archivos binarios de 32 bits que realizan llamadas del sistema para usar una secuencia de llamada personalizada. Esta secuencia de llamadas es económica para que WOW64 intercepte porque permanece completamente en modo de usuario. Cuando se detecta la secuencia de llamada personalizada, la CPU WOW64 vuelve al modo nativo de 64 bits y llama a Wow64.dll. Thunking se realiza en modo de usuario para reducir el impacto en el kernel de 64 bits y reducir el riesgo de un error en el thunk que podría provocar un bloqueo en modo kernel, daños en los datos o un agujero de seguridad. Los thunks extraen argumentos de la pila de 32 bits, los extienden a 64 bits y, a continuación, realizan la llamada del sistema nativo.
Variables de entorno
Cuando un proceso de 32 bits se crea mediante un proceso de 64 bits, o cuando un proceso de 64 bits se crea mediante un proceso de 32 bits, WOW64 establece las variables de entorno para el proceso creado, como se muestra en la tabla siguiente.
Proceso | Variables de entorno |
---|---|
Proceso de 64 bits |
PROCESSOR_ARCHITECTURE=AMD64 o PROCESSOR_ARCHITECTURE=IA64 o PROCESSOR_ARCHITECTURE=ARM64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles% Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: Las variables de entorno ProgramW6432 y CommonProgramW6432 se agregaron a partir de Windows 7 y Windows Server 2008 R2. |
Proceso de 32 bits |
PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE% ProgramFiles=%ProgramFiles(x86)% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles(x86)% CommonProgramW6432=%CommonProgramFiles% |
Enlaces globales
La función SetWindowsHookEx se puede usar para insertar un archivo DLL en otro proceso si se cumplen las condiciones siguientes:
- Un archivo DLL de 32 bits solo se puede insertar en un proceso de 32 bits y un archivo DLL de 64 bits solo se puede insertar en un proceso de 64 bits. No es posible insertar un archivo DLL de 32 bits en un proceso de 64 bits o viceversa.
- Los archivos DLL de 32 y 64 bits deben tener nombres diferentes.
- Las arquitecturas del archivo DLL y el proceso deben coincidir. Por ejemplo, no puede insertar un archivo DLL x86 de 32 bits en un proceso arm de 32 bits.
Para obtener más información, vea SetWindowsHookEx.
Tenga en cuenta que se puede llamar a los enlaces de WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL y de bajo nivel en el subproceso que instaló el enlace en lugar del subproceso que procesa el enlace. Para estos enlaces, es posible que se llame a los enlaces de 32 y 64 bits si un enlace de 32 bits está por delante de un enlace de 64 bits en la cadena de enlace. Para obtener más información, consulte Uso de enlaces.