Bagikan melalui


Detail Implementasi WOW64

Emulator WOW64 berjalan dalam mode pengguna. Ini menyediakan antarmuka antara versi 32-bit Ntdll.dll dan kernel prosesor, dan mencegat panggilan kernel. Emulator WOW64 terdiri dari DLL berikut:

  • Wow64.dll menyediakan infrastruktur emulasi inti dan thunk untuk fungsi titik masuk Ntoskrnl.exe.
  • Wow64Win.dll menyediakan thunk untuk fungsi titik entri Win32k.sys.
  • (hanya x64) Wow64Cpu.dll menyediakan dukungan untuk menjalankan program x86 pada x64.
  • (Intel Itanium saja) IA32Exec.bin berisi emulator perangkat lunak x86.
  • (Khusus Intel Itanium) Wowia32x.dll menyediakan antarmuka antara IA32Exec.bin dan WOW64.
  • (hanya ARM64) xtajit.dll berisi emulator perangkat lunak x86.
  • (hanya ARM64) wowarmw.dll menyediakan dukungan untuk menjalankan program ARM32 di ARM64.

DLL ini, bersama dengan versi 64-bit Ntdll.dll, adalah satu-satunya biner 64-bit yang dapat dimuat ke dalam proses 32-bit. Pada Windows 10 pada ARM, biner CHPE (Compiled Hybrid Portable Executable) juga dapat dimuat ke dalam proses x86 32-bit.

Saat memulai, Wow64.dll memuat versi x86 Ntdll.dll (atau versi CHPE, jika diaktifkan) dan menjalankan kode inisialisasinya, yang memuat semua DLL 32-bit yang diperlukan. Hampir semua DLL 32-bit adalah salinan biner Windows 32-bit yang tidak dimodifikasi, meskipun beberapa dimuat sebagai CHPE karena alasan performa. Beberapa DLL ini ditulis untuk bereaksi berbeda pada WOW64 daripada yang mereka lakukan pada Windows 32-bit, biasanya karena mereka berbagi memori dengan komponen sistem 64-bit. Semua ruang alamat mode pengguna di atas batas 32-bit dicadangkan oleh sistem. Untuk informasi selengkapnya, lihat Performa dan Konsumsi Memori di WOW64.

Alih-alih menggunakan urutan panggilan layanan sistem x86, biner 32-bit yang melakukan panggilan sistem dibangun kembali untuk menggunakan urutan panggilan kustom. Urutan panggilan ini murah bagi WOW64 untuk mencegat karena tetap sepenuhnya dalam mode pengguna. Ketika urutan panggilan kustom terdeteksi, WOW64 CPU beralih kembali ke mode 64-bit asli dan memanggil ke Wow64.dll. Pengintaian dilakukan dalam mode pengguna untuk mengurangi dampak pada kernel 64-bit dan untuk mengurangi risiko bug di thunk yang dapat menyebabkan crash mode kernel, kerusakan data, atau lubang keamanan. Thunks mengekstrak argumen dari tumpukan 32-bit, memperluasnya menjadi 64 bit, lalu melakukan panggilan sistem asli.

Variabel Lingkungan

Ketika proses 32-bit dibuat oleh proses 64-bit, atau ketika proses 64-bit dibuat oleh proses 32-bit, WOW64 mengatur variabel lingkungan untuk proses yang dibuat seperti yang ditunjukkan dalam tabel berikut.

Proses Variabel lingkungan
Proses 64-bit
PROCESSOR_ARCHITECTURE=AMD64 atau PROCESSOR_ARCHITECTURE=IA64 atau PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 dan Windows XP: Variabel lingkungan ProgramW6432 dan CommonProgramW6432 ditambahkan dimulai dengan Windows 7 dan Windows Server 2008 R2.
Proses 32-bit
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Kait Global

Fungsi SetWindowsHookEx dapat digunakan untuk menyuntikkan DLL ke proses lain jika kondisi berikut terpenuhi:

  • DLL 32-bit hanya dapat disuntikkan ke dalam proses 32-bit, dan DLL 64-bit hanya dapat disuntikkan ke dalam proses 64-bit. Tidak dimungkinkan untuk menyuntikkan DLL 32-bit ke dalam proses 64-bit atau sebaliknya.
  • DLL 32-bit dan 64-bit harus memiliki nama yang berbeda.
  • Arsitektur DLL dan prosesnya harus cocok. Misalnya, Anda tidak dapat menyuntikkan DLL x86 32-bit ke dalam proses ARM 32-bit.

Untuk informasi selengkapnya, lihat SetWindowsHookEx.

Ketahuilah bahwa kait WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL, dan tingkat rendah dapat dipanggil pada utas yang memasang kait daripada alur yang memproses kait. Untuk kait ini, ada kemungkinan bahwa kait 32-bit dan 64-bit akan dipanggil jika kait 32-bit berada di depan kait 64-bit dalam rantai kait. Untuk informasi selengkapnya, lihat Menggunakan Hook.