64ビット版のWindowsでは64ビットネイティブコードのほか、32ビットコードも実行可能です。これは「WOW64(Windows on Windows 64-bit)」というしくみで実現されています。
WOW64は32ビットアプリケーションと64ビットカーネルとの間で翻訳/仲介を行うDLL群で、64ビット/32ビットプログラムの互換性確保のため、64ビットネイティブのシステムファイルディレクトリとは別に32ビットプログラム用のシステムディレクトリを用意してこれらを状況に応じて切り替えます。実際の切り替え処理は、「ファイルシステムリダイレクション」という機能によって、OS側で自動的に行ってくれます。
ファイルシステムリダイレクションの対象となるのは、64ビット版システムファイルを納めた\system32ディレクトリに対応する形で32ビット版ファイルを格納した\SysWOW64ディレクトリです。ここでFig.1をご覧ください。CMAGA.txtというテキストファイルを2つメモ帳で開いています。左側の\system32ディレクトリには「system32内です」という内容のCMAGA.txtが、右側の\SysWOW64ディレクトリには「SysWOW64内です」という内容のCMAGA.txtが、それぞれ保存されています。
そして、Fig. 2は\system32ディレクトリに保存されているCMAGA.txtをInternet Explorerで開いた様子です。アドレス欄とテキストの内容をよく見てください。アドレス欄を見ると、どちらも\system32ディレクトリ中のCMAGA.txtを示しているにもかかわらず、内容表示が異なっています。これは、左側のInternet Explorerが64ビット版プログラムであるのに対して、右側のInternet Explorerが32ビット版プログラムであることに原因があります。
64ビット版のInternet Explorerで\system32ディレクトリ内にアクセスした場合は、そのまま\system32ディレクトリ内にある64ビットシステム用ファイルを参照しますが(Fig. 2左)、32ビット版のInternet Explorerで\system32ディレクトリ内にアクセスした場合は、自動的に\system32ディレクトリの32ビット版である\SysWOW64にリダイレクトされます(Fig. 2右)。このため、同じファイルを開いたつもりでも、32ビット版と64ビット版では異なるファイルにアクセスすることになるのです。
実は、レジストリについても同様の「レジストリリダイレクション機能」を用いて二重化されたレジストリを切り替えていて、32ビット版レジストリエディタでは64ビット用のレジストリキーが表示されないようになるなどの工夫がなされています。
今は64ビット環境上でもいくつかの32ビットアプリケーションを利用せざるをえないという過渡期であるため、互換性を確保するためには以上のような複雑な二重構造に頼るしかないのかもしれません。このような構造は、Windowsアプリケーションを利用する場合、および一般的なアプリケーションを作成する場合にはあまり意識する必要はないはずですが、トラブルシューティング時の知識としては押さえておきたいところです。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.