Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 principale e i batchk per le funzioni del punto di ingresso Ntoskrnl.exe.
- Wow64Win.dll fornisce i batchk per le funzioni del 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 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. Tutto lo spazio degli indirizzi in modalità utente superiore al limite a 32 bit è riservato dal sistema. Per altre informazioni, vedere Prestazioni e Consumo di memoria in WOW64.
Anziché usare la sequenza di chiamata del servizio di sistema x86, i file binari a 32 bit che effettuano chiamate di sistema vengono ricompilati per usare una sequenza di chiamata personalizzata. Questa sequenza chiamante è economica 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 ridurre il rischio di un bug nel kernel che potrebbe causare un arresto anomalo in modalità kernel, danneggiamento dei dati o un buco di sicurezza. I kubernetes estraggono gli argomenti dallo stack a 32 bit, li estendono a 64 bit, quindi effettuano la chiamata di 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 del 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_SHELLe gli 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 entrambi 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.