Dettagli implementazione WOW64
L'emulatore WOW64 viene eseguito in modalità utente. Fornisce un'interfaccia tra la versione a 32 bit di Ntdll.dll e il kernel del processore e intercetta le chiamate del kernel. L'emulatore WOW64 è costituito dalle DLL seguenti:
- Wow64.dll fornisce l'infrastruttura di emulazione di base e i kubernetes per le funzioni del punto di ingresso Ntoskrnl.exe.
- Wow64Win.dll fornisce i kubernetes per le funzioni di punto di ingresso Win32k.sys.
- (solo x64) Wow64Cpu.dll fornisce supporto per l'esecuzione di programmi x86 in x64.
- (solo Intel Itanium) IA32Exec.bin contiene l'emulatore software x86.
- (solo Intel Itanium) Wowia32x.dll fornisce l'interfaccia tra IA32Exec.bin e WOW64.
- (solo ARM64) xtajit.dll contiene l'emulatore software x86.
- (solo ARM64) wowarmw.dll fornisce supporto per l'esecuzione di programmi ARM32 in ARM64.
Queste DLL, insieme alla versione a 64 bit di Ntdll.dll, sono gli unici file binari a 64 bit che possono essere caricati in un processo a 32 bit. In Windows 10 su ARM, i file binari CHPE (Compiled Hybrid Portable Executable) possono anche essere caricati in un processo a 32 bit x86.
All'avvio, Wow64.dll carica la versione x86 di Ntdll.dll (o la versione CHPE, se abilitata) ed esegue il codice di inizializzazione, che carica tutte le DLL a 32 bit necessarie. Quasi tutte le DLL a 32 bit sono copie non modificate di file binari di Windows a 32 bit, anche se alcuni vengono caricati come CHPE per motivi di prestazioni. Alcune di queste DLL vengono scritte per comportarsi in modo diverso in WOW64 rispetto a quelle eseguite in Windows a 32 bit, in genere perché condividono memoria con componenti di sistema a 64 bit. Tutti gli spazi indirizzi in modalità utente superiori al limite a 32 bit sono riservati dal sistema. Per altre informazioni, vedere Prestazioni e consumo di memoria in WOW64.
Invece di usare la sequenza di chiamata del servizio di sistema x86, i file binari a 32 bit che eseguono chiamate di sistema vengono ricompilati per usare una sequenza chiamante personalizzata. Questa sequenza chiamante è poco costosa per l'intercettazione WOW64 perché rimane interamente in modalità utente. Quando viene rilevata la sequenza di chiamata personalizzata, la CPU WOW64 torna alla modalità nativa a 64 bit e chiama in Wow64.dll. La modalità utente viene eseguita in modalità utente per ridurre l'impatto sul kernel a 64 bit e per ridurre il rischio di un bug nel kernel che potrebbe causare un arresto anomalo in modalità kernel, danneggiamento dei dati o un problema di sicurezza. I kubernetes estraggono gli argomenti dallo stack a 32 bit, li estendono a 64 bit, quindi effettuano la chiamata al sistema nativo.
Variabili di ambiente
Quando un processo a 32 bit viene creato da un processo a 64 bit o quando un processo a 64 bit viene creato da un processo a 32 bit, WOW64 imposta le variabili di ambiente per il processo creato, come illustrato nella tabella seguente.
Processo | Variabili di ambiente |
---|---|
Processo a 64 bit |
PROCESSOR_ARCHITECTURE=AMD64 o PROCESSOR_ARCHITECTURE=IA64 o PROCESSOR_ARCHITECTURE=ARM64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles% Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Le variabili di ambiente ProgramW6432 e CommonProgramW6432 sono state aggiunte a partire da Windows 7 e Windows Server 2008 R2. |
Processo a 32 bit |
PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE% ProgramFiles=%ProgramFiles(x86)% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles(x86)% CommonProgramW6432=%CommonProgramFiles% |
Hook globali
La funzione SetWindowsHookEx può essere usata per inserire una DLL in un altro processo se vengono soddisfatte le condizioni seguenti:
- Una DLL a 32 bit può essere inserita solo in un processo a 32 bit e una DLL a 64 bit può essere inserita solo in un processo a 64 bit. Non è possibile inserire una DLL a 32 bit in un processo a 64 bit o viceversa.
- Le DLL a 32 bit e a 64 bit devono avere nomi diversi.
- Le architetture della DLL e il processo devono corrispondere. Ad esempio, non è possibile inserire una DLL x86 a 32 bit in un processo ARM a 32 bit.
Per altre informazioni, vedere SetWindowsHookEx.
Tenere presente che i WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL e hook di basso livello possono essere chiamati sul thread che ha installato l'hook anziché sul thread che elabora l'hook. Per questi hook, è possibile che gli hook a 32 bit e a 64 bit vengano chiamati se un hook a 32 bit è davanti a un hook a 64 bit nella catena di hook. Per altre informazioni, vedere Uso di hook.