WOW64 上でのデバッグ [1/2] ~ WOW64 とは何か?
WOW64 とは?
Windows では 64 ビットのクライアント OS は Windows XP で初めてリリースされました。 ただし、これは IA64 (Intel Itanium プロセッサ) アーキテクチャ向けでした。 その後、本格的に 64 ビットが広まったのは AMD の 64 ビットアーキテクチャが広まってからで、 インテルも同様のアーキテクチャを採用しました。現在普通に 64 ビットといえばこちらで、 これを x64 アーキテクチャといいます。(もともと AMD 発祥なので amd64 等とも書きますが、 MS はたいてい x64 と書きます) ちなみに、32 ビットの主流は x86 です。(x32 ではありませんので注意してください)
x64 は Vista で広まり、最近ではすっかりパソコン・ショップの店頭では 64 ビット (x64) Windows が主流になってきています。
基本的に 64 ビット OS では 64 ビット向けのプログラムしか実行できません。 つまり、従来の 32 ビット (x86) 向けに作られたプログラムは実行できないのです。 そこで、Windows-On-Windows エミュレーション・サブシステム (WOW64) が必要になります。 WOW64 は 64 ビット OS で 32 ビット向けのプログラムを実行可能にします。
32 ビットの環境向けに作られたプログラムを実行する場合は、始めに WOW64 サブシステムがロードされます。 主要なライブラリは ntdll.dll、WOW64.dll、WOW64Win.dll、WOW64Cpu.dll などです。 これらによって、32 ビットの命令を 64 ビット環境で解釈できるように変換するのです。
WOW64 モジュール | 説明 |
---|---|
WOW64.dll | 主に 64 ビット版 ntdll.dll に実装された API へ渡すパラメータや戻り値の変換を行う。 |
WOW64Win.dll | Windows メッセージ API の一部として win2k.sys を呼び出すモジュールの橋渡しを行う。 |
WOW64Cpu.dll | x86 命令セットのエミュレーションを行う。 |
つまり、64 ビット OS で実行するにはあくまで 64 ビットの環境をターゲットとしてプログラムを作らなければならないのですが、 32 ビット向けに作られたプログラムも x64 上で動くように WOW64 が間に入り、プログラムの実行を可能としています。
結局上図のように、64 ビット OS で 32 ビットコードを実行させた場合、 同一プロセス内に WOW64 と x86 向けのコードが共存する形になります。
前置きは以上です。では、実際に WOW64 上のコードをデバッグする場合にどうしたらよいか見てみましょう。