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 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 stellt Thunks für die Win32k.sys Einstiegspunktfunktionen bereit.
  • (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-Softwareemulator.
  • (Nur Intel Itanium) Wowia32x.dll stellt die Schnittstelle zwischen IA32Exec.bin und WOW64 bereit.
  • (nur ARM64) xtajit.dll enthält den x86-Softwareemulator.
  • (nur ARM64) wowarmw.dll unterstützt die Ausführung von ARM32-Programmen auf ARM64.

Diese DLLs sind zusammen mit der 64-Bit-Version von Ntdll.dll die einzigen 64-Bit-Binärdateien, die in einen 32-Bit-Prozess geladen werden können. Unter Windows 10 auf ARM können CHPE-Binärdateien (Compiled Hybrid Portable Executable) 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 unveränderte Kopien von 32-Bit-Windows-Binärdateien, obwohl einige aus Leistungsgründen als CHPE geladen werden. Einige dieser DLLs werden so geschrieben, dass sie sich auf WOW64 anders verhalten als unter 32-Bit-Windows, in der Regel, weil sie sich Arbeitsspeicher mit 64-Bit-Systemkomponenten teilen. Der gesamte Adressraum im Benutzermodus, der über dem 32-Bit-Grenzwert liegt, wird vom System reserviert. Weitere Informationen finden Sie unter Leistung und Arbeitsspeicherverbrauch unter WOW64.

Anstatt die x86-Systemdienstaufrufsequenz zu verwenden, werden 32-Bit-Binärdateien, die Systemaufrufe tätigen, neu erstellt, um eine benutzerdefinierte Aufrufsequenz zu verwenden. Diese Aufrufsequenz ist für WOW64 kostengünstig abzufangen, da sie vollständig im Benutzermodus verbleibt. Wenn die benutzerdefinierte Aufrufsequenz erkannt wird, wechselt die WOW64-CPU zurück in den nativen 64-Bit-Modus und ruft Wow64.dll auf. Thunking erfolgt im Benutzermodus, um die Auswirkungen auf den 64-Bit-Kernel zu verringern und das Risiko eines Fehlers im Thunk zu verringern, der zu einem Absturz im Kernelmodus, einer Datenbeschädigung oder einer Sicherheitslücke führen kann. Die Thunks extrahieren Argumente aus dem 32-Bit-Stapel, erweitern sie auf 64 Bit und führen dann den systemeigenen Systemaufruf aus.

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 fest, wie in der folgenden Tabelle gezeigt.

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 Umgebungsvariablen 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 einzufügen oder umgekehrt.
  • Die 32-Bit- und 64-Bit-DLLs müssen unterschiedliche Namen aufweisen.
  • Die Architekturen der DLL und des Prozesses müssen übereinstimmen. Für instance 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 Hooks WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL und Low-Level-Hooks für den Thread aufgerufen werden können, der den Hook installiert hat, und nicht für den Thread, der den Hook verarbeitet. Für diese Hooks ist es möglich, dass sowohl der 32-Bit- als auch der 64-Bit-Hook aufgerufen wird, wenn ein 32-Bit-Hook vor einem 64-Bit-Hook in der Hookkette steht. Weitere Informationen finden Sie unter Verwenden von Hooks.