Delen via


WOW64-implementatiedetails

De WOW64-emulator wordt uitgevoerd in de gebruikersmodus. Het biedt een interface tussen de 32-bits versie van Ntdll.dll en de kernel van de processor, en het onderschept kernelaanroepen. De WOW64-emulator bestaat uit de volgende DLL's:

  • Wow64.dll biedt de kernemulatie-infrastructuur en de thunks voor de Ntoskrnl.exe invoerpuntfuncties.
  • Wow64Win.dll biedt donks voor de Win32k.sys invoerpuntfuncties.
  • (alleen x64) Wow64Cpu.dll biedt ondersteuning voor het uitvoeren van x86-programma's op x64.
  • (Alleen Intel Itanium) IA32Exec.bin bevat de x86-softwareemulator.
  • (Alleen Intel Itanium) Wowia32x.dll biedt de interface tussen IA32Exec.bin en WOW64.
  • (alleen ARM64) xtajit.dll de x86-softwareemulator bevat.
  • (alleen ARM64) wowarmw.dll biedt ondersteuning voor het uitvoeren van ARM32-programma's op ARM64.

Deze DLL's, samen met de 64-bits versie van Ntdll.dll, zijn de enige 64-bits binaire bestanden die kunnen worden geladen in een 32-bits proces. In Windows 10 op ARM kunnen binaire bestanden van CHPE (gecompileerd hybride draagbaar uitvoerbaar bestand) ook worden geladen in een x86 32-bits proces.

Bij het opstarten laadt Wow64.dll de x86-versie van Ntdll.dll (of de CHPE-versie, indien ingeschakeld) en voert de initialisatiecode uit, waarmee alle benodigde 32-bits DLL's worden geladen. Bijna alle 32-bits DLL's zijn ongewijzigde kopieën van binaire 32-bits Windows-bestanden, hoewel sommige om prestatieredenen als CHPE worden geladen. Sommige van deze DLL's zijn geschreven om zich anders te gedragen op WOW64 dan op 32-bits Windows, meestal omdat ze geheugen delen met 64-bits systeemonderdelen. Alle adresruimte in de gebruikersmodus boven de 32-bits limiet wordt door het systeem gereserveerd. Zie Prestaties en geheugenverbruik onder WOW64voor meer informatie.

In plaats van de x86-systeemserviceaanroepreeks te gebruiken, worden 32-bits binaire bestanden die systeemaanroepen maken, opnieuw opgebouwd om een aangepaste aanroepvolgorde te gebruiken. Deze oproepvolgorde is goedkoop voor WOW64 om te onderscheppen, omdat deze volledig in de gebruikersmodus blijft. Wanneer de aangepaste belvolgorde wordt gedetecteerd, wordt de WOW64-CPU teruggezet naar de systeemeigen 64-bits modus en wordt aangeroepen naar Wow64.dll. Thunking wordt uitgevoerd in de gebruikersmodus om de impact op de 64-bits kernel te verminderen en om het risico van een bug in de thunk te verminderen die een kernelmoduscrash, gegevensbeschadiging of een beveiligingsgat kan veroorzaken. De thunks extraheren argumenten uit de 32-bits stack, breiden ze uit naar 64 bits en maken vervolgens de systeemeigen systeemoproep.

Omgevingsvariabelen

Wanneer een 32-bits proces wordt gemaakt door een 64-bits proces of wanneer een 64-bits proces wordt gemaakt door een 32-bits proces, stelt WOW64 de omgevingsvariabelen in voor het gemaakte proces, zoals wordt weergegeven in de volgende tabel.

Proces Omgevingsvariabelen
64-bits proces
PROCESSOR_ARCHITECTURE=AMD64 of PROCESSOR_ARCHITECTURE=IA64 of PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 en Windows XP: De omgevingsvariabelen ProgramW6432 en CommonProgramW6432 zijn toegevoegd vanaf Windows 7 en Windows Server 2008 R2.
32-bits proces
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Globale hooks

De functie SetWindowsHookEx kan worden gebruikt om een DLL in een ander proces te injecteren als aan de volgende voorwaarden wordt voldaan:

  • Een 32-bits DLL kan alleen worden geïnjecteerd in een 32-bits proces en een 64-bits DLL kan alleen worden geïnjecteerd in een 64-bits proces. Het is niet mogelijk om een 32-bits DLL in een 64-bits proces of omgekeerd te injecteren.
  • De 32-bits en 64-bits DLL's moeten verschillende namen hebben.
  • De architecturen van het DLL-bestand en het proces moeten overeenkomen. U kunt bijvoorbeeld geen 32-bits x86-DLL in een 32-bits ARM-proces injecteren.

Zie SetWindowsHookExvoor meer informatie.

Houd er rekening mee dat de WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELLen haken op laag niveau kunnen worden aangeroepen op de thread die de haak heeft geïnstalleerd in plaats van de thread die de haak verwerkt. Voor deze haken is het mogelijk dat zowel de 32-bits als de 64-bits haken worden aangeroepen als een 32-bits haak voor een 64-bits haak in de haakketen staat. Zie Hooks gebruikenvoor meer informatie.