WOW64
WOW64(ワウ64、Windows 32-bit On Windows 64-bit)とは、64ビット (x64、ARM64、IA-64) 版のMicrosoft WindowsにおいてWin32アプリケーションを実行する、エミュレーションレイヤーサブシステムである。
概要
64ビット版のWindowsは基本的に、完全に64ビット化されたNTカーネルで動作する。x64やIA-64対応のオペレーティングシステムでは、x86の32ビットABIに対応するかどうかの選択を迫られることとなった。64ビットのWindowsでは、64ビットABIと32ビットABIの両方に対応し、Win32 APIをWin64 APIに呼び変えるエミュレーション層が実装されている。これがWOW64である。これにより、32ビットアプリケーションはそのまま64ビットのWindowsでも動作する。
以下のサンク (thunk) レイヤーが用意されている。提供されるモジュールの一部はx64/ARM64/IA-64でそれぞれ異なる[1]。
- 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のエミュレーションレイヤーの提供も計画されている[2]。
構造
WOW64は、WOW64ホストプロセスによって予約された4GBの仮想空間に32ビットABIのコードを読み込み、そこで発生したWin64 APIに変換可能なAPI呼び出しを変換して、Win64サブシステムに伝達する。構造体の変換は自動的に行われ、Win32側では現在動作しているOSが32ビットシステムか、64ビットシステムかを意識する必要は全くない。またユーザーモードで動作するコンポーネント群は32ビット版と64ビット版が用意され、例えばOLEなどは32ビットで閉じた範囲で動作できる。64ビット版で提供されるコードは単一のソースから、32ビット版と64ビット版両方をそれぞれコンパイルして作られているため、機能的には32ビットシステムと64ビットシステムの間に差異は無い。
問題点
Windowsの64ビットABIは、Win32の32ビットABIをそのまま64ビットに拡張したものである。従って、64ビットABIのアプリケーションは8TBのアドレス空間を独占的に使えるようになっているが、ここに一つの問題点がある。32ビットABIのコードを格納可能な仮想空間下位4GBを64ビットABIに独占されてしまったことである。このため、32ビットABIを格納する場所が無く、32ビットアプリケーションはもとより、DLLやOCXをロードして呼び出すことも不可能となってしまった。そのため、マイクロソフトは、32ビットABIのコードと64ビットABIのコードとの相互な呼び出しを禁止している(サンクによって間接的な呼び出しは可能であるが、x64アーキテクチャで本来可能であった32ビットコードと64ビットコードのシームレスな相互呼び出し機能は全く生かされていない)。この顕著な例として、Internet Explorer (IE) の振る舞いが挙げられる。32ビットのActiveXコンポーネントを検出すると、64ビット版IEは処理を中断して32ビット版IEに処理を引き継ぐ。32ビットアプリケーションと64ビットアプリケーションの間には、実行ファイル以外のコンポーネント群を互いに利用することができない深い溝がある。
プログラミング
16ビット (Win16) から32ビット (Win32) への過渡期に用意されたサンクメカニズムはシステムの不安定化の原因となっていたため、WOW64では提供されず、32ビットコードと64ビットコードは1つのプロセス内に共存できない。32ビットのプロセスと64ビットのプロセスとの通信は、アウトプロセスCOM(DCOM)またはWCFなどによるRPCやDLLプロキシCOMサーバーをはじめとして、各種のプロセス間通信が使用可能である[3]。なお、一部のハンドル値(ウィンドウハンドルHWND
など)は下位32ビットのみが有効値として使用されるため、Win32/Win64で共有することができる。
システムフォルダーとレジストリ
2010年現在の64ビットWindowsでは、Windowsシステムフォルダー (%systemroot%\System32) には64ビットのバイナリが置かれ、32ビットプログラムはその中にあるファイルには直接アクセスすることができない。32ビットプログラムによるSystem32フォルダーへのアクセスは、自動的に%systemroot%\SysWOW64へとリダイレクトされる動作となり、プログラムからはSystem32フォルダーにアクセスしているように見える。SysWOW64フォルダーには32ビットのバイナリが用意されている。なお、後方互換性の理由から、64ビットのシステムフォルダーであるにもかかわらず「System32」という名前になっている[4]。
Windowsレジストリへ32ビットアプリケーションがアクセスする場合は、一部リダイレクトされる。HKLM\SOFTWAREとHKCR\下のレジストリキーへのアクセスは、それぞれWow6432Nodeと呼ばれるキーの配下にアクセスしている。
脚注
- ^ WOW64 Implementation Details - Win32 apps | Microsoft Docs
- ^ Introducing x64 emulation in preview for Windows 10 on ARM PCs to the Windows Insider Program | Windows Insider Blog
- ^ “Interprocess communication - Win32 apps” (英語). Microsoft Docs. マイクロソフト (2018年5月31日). 2021年4月11日閲覧。
- ^ Why do 64-bit DLLs go to System32 and 32-bit DLLs to SysWoW64 on 64-bit Windows?