WOW64とは
WOW64(Windows 32-bit On Windows 64-bit)は、
64ビット版Windows上で
32ビットのWindowsアプリケーションを実行可能にするためのエミュレーションサブシステムです。
64ビット版Windowsの登場に伴い、従来の
32ビットアプリケーションとの互換性を保つために導入されました。
概要
64ビット版Windowsは、
64ビットのNTカーネル上で動作しますが、WOW64はこのカーネル上で
32ビットアプリケーションを実行するための橋渡し役を果たします。具体的には、Win32 APIの呼び出しをWin64 APIに変換するエミュレーション層を設け、
32ビットアプリケーションが
64ビット環境を意識することなく動作できるようにします。
WOW64は、以下のサンク(thunk)レイヤーを提供します。
Wow64.dll: エミュレーションの中核を担い、`Ntoskrnl.exe`のエントリーポイント関数へのサンクを提供します。
Wow64Win.dll: `Win32k.sys`のエントリーポイント関数へのサンクを提供します。
Wow64Cpu.dll (x64のみ): x86プログラムをx64上で実行するためのサポートを提供します。
IA32Exec.bin (Intel Itaniumのみ): x86ソフトウェアエミュレーターを含みます。
Wowia32x.dll (Intel Itaniumのみ): `IA32Exec.bin`とWOW64間のインターフェースを提供します。
xtajit.dll (ARM64のみ): x86ソフトウェアエミュレーターを含みます。
*
wowarmw.dll (ARM64のみ): ARM32プログラムをARM64上で実行するためのサポートを提供します。
x64/
IA-64 Windowsはx86エミュレーションレイヤーのみを提供しますが、ARM64 Windowsはx86とARM32の両方のエミュレーションレイヤーを提供します。さらに、ARM64ではx64エミュレーションレイヤーの提供も計画されています。
構造
WOW64は、
32ビットABIのコードを4GBの仮想空間に読み込み、そこで発生するAPI呼び出しを
64ビットAPIに変換してWin64サブシステムに伝達します。構造体の変換も自動的に行われるため、
32ビットアプリケーションは動作環境が
32ビットか
64ビットかを意識する必要はありません。ユーザーモードで動作するコンポーネントは
32ビット版と
64ビット版が用意され、例えばOLEなどは
32ビット環境で完結して動作可能です。
問題点
64ビットABIは、
32ビットABIを拡張したものであり、
64ビットアプリケーションは8TBのアドレス空間を独占的に利用できます。しかし、これにより
32ビットABIを格納する領域が不足し、
32ビットアプリケーションがDLLやOCXをロードして呼び出すことが不可能になりました。そのため、
32ビットコードと
64ビットコードの相互呼び出しは禁止されています。サンクによって間接的な呼び出しは可能ですが、本来x64アーキテクチャで可能だったシームレスな相互呼び出しは実現されていません。
この問題の例として、
Internet Explorer(IE)の動作があります。
64ビット版IEは
32ビットの
ActiveXコンポーネントを検出すると、処理を中断して
32ビット版IEに引き継ぎます。このように、
32ビットアプリケーションと
64ビットアプリケーションの間には、実行ファイル以外のコンポーネントを互いに利用できないという大きな溝が存在します。
プログラミング
16ビットから
32ビットへの移行期に提供されたサンクメカニズムはシステムの不安定化を招いたため、WOW64では
32ビットコードと
64ビットコードを同一プロセス内で共存させることはできません。
32ビットプロセスと
64ビットプロセス間の通信には、DCOMやWCFなどのRPCやDLLプロキシCOM
サーバーといったプロセス間通信が利用可能です。なお、ウィンドウハンドル(HWND)などの一部のハンドル値は、下位
32ビットのみが有効値として使用されるため、Win32/Win64間で共有できます。
64ビットWindowsでは、システムフォルダー(`%systemroot%\System32`)には
64ビットのバイナリが格納され、
32ビットプログラムは直接アクセスできません。
32ビットプログラムがSystem32フォルダーにアクセスすると、`%systemroot%\SysWOW64`にリダイレクトされ、SysWOW64フォルダーには
32ビットのバイナリが格納されています。
また、Windows
レジストリへのアクセスもリダイレクトされます。`HKLM\SOFTWARE`や`HKCR`下の
レジストリキーへのアクセスは、`Wow6432Node`キーの配下にリダイレクトされます。
まとめ
WOW64は、
64ビット版Windowsで
32ビットアプリケーションを実行するための重要な技術です。この技術により、旧来のアプリケーションを新しい環境でも利用できるようになり、ユーザーはスムーズな移行が可能になります。ただし、
32ビットと
64ビットの相互運用には制約があるため、プログラマーは注意が必要です。