Détails de l’implémentation WOW64

L’émulateur WOW64 s’exécute en mode utilisateur. Il fournit une interface entre la version 32 bits de Ntdll.dll et le noyau du processeur, et intercepte les appels du noyau. L’émulateur WOW64 se compose des DLL suivantes :

  • Wow64.dll fournit l’infrastructure d’émulation de base et les thunks pour les fonctions de point d’entrée Ntoskrnl.exe.
  • Wow64Win.dll fournit des thunks pour les fonctions de point d’entrée Win32k.sys.
  • (x64 uniquement) Wow64Cpu.dll prend en charge l’exécution de programmes x86 sur x64.
  • (Intel Itanium uniquement) IA32Exec.bin contient l’émulateur de logiciel x86.
  • (Intel Itanium uniquement) Wowia32x.dll fournit l’interface entre IA32Exec.bin et WOW64.
  • (ARM64 uniquement) xtajit.dll contient l’émulateur de logiciel x86.
  • (ARM64 uniquement) wowarmw.dll prend en charge l’exécution de programmes ARM32 sur ARM64.

Ces DLL, ainsi que la version 64 bits de Ntdll.dll, sont les seuls fichiers binaires 64 bits pouvant être chargés dans un processus 32 bits. Sur Windows 10 sur ARM, les fichiers binaires CHPE (Compiled Hybrid Portable Executable) peuvent également être chargés dans un processus x86 32 bits.

Au démarrage, Wow64.dll charge la version x86 de Ntdll.dll (ou la version CHPE, si elle est activée) et exécute son code d’initialisation, qui charge toutes les DLL 32 bits nécessaires. Presque toutes les DLL 32 bits sont des copies non modifiées de fichiers binaires Windows 32 bits, bien que certains soient chargés en tant que CHPE pour des raisons de performances. Certaines de ces DLL sont écrites pour se comporter différemment sur WOW64 et sur Windows 32 bits, généralement parce qu’elles partagent de la mémoire avec des composants système 64 bits. Tout l’espace d’adressage en mode utilisateur au-dessus de la limite de 32 bits est réservé par le système. Pour plus d’informations, consultez Performances et consommation de mémoire sous WOW64.

Au lieu d’utiliser la séquence d’appels de service système x86, les binaires 32 bits qui effectuent des appels système sont reconstruits pour utiliser une séquence d’appels personnalisée. Cette séquence d’appel est peu coûteuse pour que WOW64 intercepte, car elle reste entièrement en mode utilisateur. Lorsque la séquence d’appels personnalisée est détectée, le processeur WOW64 revient en mode 64 bits natif et appelle dans Wow64.dll. Le thunking est effectué en mode utilisateur pour réduire l’impact sur le noyau 64 bits et pour réduire le risque d’un bogue dans le thunk qui peut provoquer un plantage du mode noyau, une altération des données ou un trou de sécurité. Les thunks extraient les arguments de la pile 32 bits, les étendent à 64 bits, puis effectuent l’appel système natif.

Variables d'environnement

Lorsqu’un processus 32 bits est créé par un processus 64 bits ou lorsqu’un processus 64 bits est créé par un processus 32 bits, WOW64 définit les variables d’environnement du processus créé, comme indiqué dans le tableau suivant.

Process Variables d'environnement
Processus 64 bits
PROCESSOR_ARCHITECTURE=AMD64 ou PROCESSOR_ARCHITECTURE=IA64 ou PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP : Les variables d’environnement ProgramW6432 et CommonProgramW6432 ont été ajoutées à partir de Windows 7 et Windows Server 2008 R2.
Processus 32 bits
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Global Hooks

La fonction SetWindowsHookEx peut être utilisée pour injecter une DLL dans un autre processus si les conditions suivantes sont remplies :

  • Une DLL 32 bits peut être injectée uniquement dans un processus 32 bits, et une DLL 64 bits peut être injectée uniquement dans un processus 64 bits. Il n’est pas possible d’injecter une DLL 32 bits dans un processus 64 bits ou vice versa.
  • Les DLL 32 bits et 64 bits doivent avoir des noms différents.
  • Les architectures de la DLL et du processus doivent correspondre. Par instance, vous ne pouvez pas injecter une DLL x86 32 bits dans un processus ARM 32 bits.

Pour plus d’informations, consultez SetWindowsHookEx.

N’oubliez pas que les crochets WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL et de bas niveau peuvent être appelés sur le thread qui a installé le crochet plutôt que sur le thread qui traite le crochet. Pour ces crochets, il est possible que les crochets 32 bits et 64 bits soient appelés si un crochet 32 bits est en avance sur un crochet 64 bits dans la chaîne de crochet. Pour plus d’informations, consultez Utilisation de crochets.