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.