Dela via


Wow64-implementeringsinformation

WOW64-emulatorn körs i användarläge. Den tillhandahåller ett gränssnitt mellan 32-bitarsversionen av Ntdll.dll och processorns kernel, och den fångar upp kernelanrop. WOW64-emulatorn består av följande DLL:er:

  • Wow64.dll tillhandahåller kärnemuleringsinfrastrukturen och thunks för Ntoskrnl.exe startpunktsfunktioner.
  • Wow64Win.dll tillhandahåller thunks för Win32k.sys startpunktsfunktioner.
  • (endast x64) Wow64Cpu.dll ger stöd för att köra x86-program på x64.
  • (Endast Intel Itanium) IA32Exec.bin innehåller x86-programvaruemulatorn.
  • (endast Intel Itanium) Wowia32x.dll tillhandahåller gränssnittet mellan IA32Exec.bin och WOW64.
  • (endast ARM64) xtajit.dll innehåller x86-programvaruemulatorn.
  • (endast ARM64) wowarmw.dll har stöd för att köra ARM32-program på ARM64.

Dessa DLL:er, tillsammans med 64-bitarsversionen av Ntdll.dll, är de enda 64-bitars binärfilerna som kan läsas in i en 32-bitarsprocess. I Windows 10 på ARM kan chpe-binärfiler (kompilerad bärbar körbar hybrid) också läsas in i en x86 32-bitarsprocess.

Vid start läser Wow64.dll in x86-versionen av Ntdll.dll (eller CHPE-versionen, om den är aktiverad) och kör dess initieringskod, som läser in alla nödvändiga 32-bitars DLL:er. Nästan alla 32-bitars DLL:er är oförändrade kopior av 32-bitars Windows-binärfiler, även om vissa läses in som CHPE av prestandaskäl. Vissa av dessa DLL:er skrivs för att bete sig annorlunda på WOW64 än på 32-bitars Windows, vanligtvis eftersom de delar minne med 64-bitars systemkomponenter. Allt adressutrymme i användarläge över 32-bitarsgränsen reserveras av systemet. Mer information finns i prestanda- och minnesförbrukning under WOW64.

I stället för att använda x86-systemtjänstanropssekvensen återskapas 32-bitars binärfiler som gör systemanrop för att använda en anpassad samtalssekvens. Den här anropssekvensen är billig för WOW64 att fånga upp eftersom den förblir helt i användarläge. När den anpassade samtalssekvensen identifieras övergår WOW64-processorn tillbaka till inbyggt 64-bitarsläge och anropar till Wow64.dll. Thunking görs i användarläge för att minska påverkan på 64-bitars kerneln och för att minska risken för en bugg i dunken som kan orsaka en krasch i kernelläge, skadade data eller ett säkerhetshål. Thunks extraherar argument från 32-bitarsstacken, utökar dem till 64 bitar och gör sedan det interna systemanropet.

Miljövariabler

När en 32-bitarsprocess skapas av en 64-bitarsprocess, eller när en 64-bitarsprocess skapas av en 32-bitarsprocess, anger WOW64 miljövariablerna för den skapade processen enligt följande tabell.

Process Miljövariabler
64-bitarsprocess
PROCESSOR_ARCHITECTURE=AMD64 eller PROCESSOR_ARCHITECTURE=IA64 eller PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 och Windows XP: Miljövariablerna ProgramW6432 och CommonProgramW6432 lades till från och med Windows 7 och Windows Server 2008 R2.
32-bitarsprocess
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Globala krokar

Funktionen SetWindowsHookEx kan användas för att mata in en DLL i en annan process om följande villkor uppfylls:

  • En 32-bitars DLL kan endast matas in i en 32-bitarsprocess, och en 64-bitars DLL kan endast matas in i en 64-bitarsprocess. Det går inte att mata in en 32-bitars DLL i en 64-bitarsprocess eller tvärtom.
  • DLL:er för 32-bitars och 64-bitars måste ha olika namn.
  • Arkitekturerna för DLL:en och processen måste matcha. Du kan till exempel inte mata in en 32-bitars x86 DLL i en 32-bitars ARM-process.

Mer information finns i SetWindowsHookEx.

Tänk på att WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELLoch lågnivåkrokar kan anropas på tråden som installerade kroken i stället för trådbearbetning av kroken. För dessa krokar är det möjligt att både 32-bitars och 64-bitars krokar kommer att kallas om en 32-bitars krok är före en 64-bitars krok i krokkedjan. Mer information finns i Using Hooks.