WOW64-Implementierungsdetails

Der WOW64-Emulator wird im Benutzermodus ausgeführt. Es stellt eine Schnittstelle zwischen der 32-Bit-Version von Ntdll.dll und dem Kernel des Prozessors bereit, und er fängt Kernelaufrufe ab. Der WOW64-Emulator besteht aus den folgenden DLLs:

  • Wow64.dll stellt die Kernemulationsinfrastruktur und die Thunks für die Ntoskrnl.exe Einstiegspunktfunktionen bereit.
  • Wow64Win.dll bietet Thunks für die Win32k.sys Einstiegspunktfunktionen.
  • (nur x64) Wow64Cpu.dll bietet Unterstützung für die Ausführung von x86-Programmen auf x64.
  • (Nur Intel Itanium) IA32Exec.bin enthält den x86-Software-Emulator.
  • (Nur Intel Itanium) Wowia32x.dll stellt die Schnittstelle zwischen IA32Exec.bin und WOW64 bereit.
  • (NUR ARM64) xtajit.dll enthält den x86-Software-Emulator.
  • (NUR ARM64) wowarmw.dll unterstützt die Ausführung von ARM32-Programmen auf ARM64.

Diese DLLs zusammen mit der 64-Bit-Version von Ntdll.dll sind die einzigen 64-Bit-Binärdateien, die in einen 32-Bit-Prozess geladen werden können. Bei Windows 10 auf ARM kann chPE (Kompilierte hybride ausführbare Datei) auch in einen x86 32-Bit-Prozess geladen werden.

Beim Start lädt Wow64.dll die x86-Version von Ntdll.dll (oder die CHPE-Version, falls aktiviert) und führt den Initialisierungscode aus, der alle erforderlichen 32-Bit-DLLs lädt. Fast alle 32-Bit-DLLs sind nicht geänderte Kopien von 32-Bit-Windows Binärdateien, obwohl einige als CHPE aus Leistungsgründen geladen werden. Einige dieser DLLs werden geschrieben, um sich auf WOW64 anders zu verhalten als auf 32-Bit-Windows, normalerweise weil sie Arbeitsspeicher mit 64-Bit-Systemkomponenten teilen. Der Gesamte Benutzermodus-Adressraum über dem Grenzwert von 32 Bit ist vom System reserviert. Weitere Informationen finden Sie unter WOW64 unter WOW64.

Anstatt die x86 Systemdienstanrufsequenz zu verwenden, werden 32-Bit-Binärdateien, die Systemanrufe tätigen, neu erstellt, um eine benutzerdefinierte Anrufsequenz zu verwenden. Diese Anrufsequenz ist für WOW64 kostengünstig, um abfangen zu können, da sie vollständig im Benutzermodus bleibt. Wenn die benutzerdefinierte Anrufsequenz erkannt wird, wechselt die WOW64-CPU zurück in den systemeigenen 64-Bit-Modus und ruft in Wow64.dll auf. Thunking wird im Benutzermodus durchgeführt, um die Auswirkungen auf den 64-Bit-Kernel zu verringern und das Risiko eines Fehlers in der Thunk zu verringern, der einen Kernelmodus-Absturz, eine Datenbeschädigung oder ein Sicherheitsloch verursachen könnte. Die Thunks extrahieren Argumente aus dem 32-Bit-Stapel, erweitern sie auf 64 Bit und machen dann den systemeigenen Systemaufruf.

Umgebungsvariablen

Wenn ein 32-Bit-Prozess von einem 64-Bit-Prozess erstellt wird oder wenn ein 64-Bit-Prozess von einem 32-Bit-Prozess erstellt wird, legt WOW64 die Umgebungsvariablen für den erstellten Prozess wie in der folgenden Tabelle dargestellt fest.

Prozess Umgebungsvariablen
64-Bit-Prozess
PROCESSOR_ARCHITECTURE=AMD64 oder PROCESSOR_ARCHITECTURE=IA64 oder PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Die Variablen "ProgramW6432" und "CommonProgramW6432" wurden ab Windows 7 und Windows Server 2008 R2 hinzugefügt.
32-Bit-Prozess
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Globale Hooks

Die SetWindowsHookEx-Funktion kann verwendet werden, um eine DLL in einen anderen Prozess einzufügen, wenn die folgenden Bedingungen erfüllt sind:

  • Eine 32-Bit-DLL kann nur in einen 32-Bit-Prozess eingefügt werden, und eine 64-Bit-DLL kann nur in einen 64-Bit-Prozess eingefügt werden. Es ist nicht möglich, eine 32-Bit-DLL in einen 64-Bit-Prozess oder umgekehrt einzufügen.
  • Die 32-Bit- und 64-Bit-DLLs müssen verschiedene Namen aufweisen.
  • Die Architekturen der DLL und der Prozess müssen übereinstimmen. Beispielsweise können Sie keine 32-Bit-x86-DLL in einen 32-Bit-ARM-Prozess einfügen.

Weitere Informationen finden Sie unter SetWindowsHookEx.

Beachten Sie, dass die WH_MOUSE,WH_KEYBOARD, WH_JOURNAL*, WH_SHELL und Low-Level-Hooks auf dem Thread aufgerufen werden können, der den Hook installiert hat, anstatt den Thread zu verarbeiten. Für diese Hooks ist es möglich, dass sowohl die 32-Bit- als auch die 64-Bit-Hooks aufgerufen werden, wenn ein 32-Bit-Hook vor einem 64-Bit-Hook in der Hookkette steht. Weitere Informationen finden Sie unter Verwenden von Hooks.