Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.