2011-04-26

64bit版のWindowsで32bitアプリケーションからsystem32ディレクトリのファイルを開けない

64-bit版のWindows7で、32-bitのアプリケーションから"system32"ディレクトリのファイルを開こうとしても、"SysWOW64"ディレクトリの同名ファイルが読み込まれてしまう。
この現象(WoW64の仕様)の回避方法についてのメモ。

結論から言うと、たとえば、"%windir%\system32\shell32.dll" を開きたい場合は "%windir%\Sysnative\shell32.dll" と指定してやればよい。

"Sysnative"は仮想ディレクトリなので、「ファイルを開く」ダイアログでフォルダとして表示されないが、ファイル名にパスを直接入力すれば問題なく読み込める。ちなみに"Sysnative"仮想ディレクトリは64-bitアプリケーションからは使用できない。

この現象は、「"%windir%\system32"ディレクトリへのアクセスは、"%windir%\SysWOW64"ディレクトリへリダイレクトされる」というWoW64のルールにそったもので、不具合でもなんでもない。
詳しくは、MSDNのファイルシステムリダイレクタに記載されている。

「"%windir%\system32\drivers\etc\hosts"へのアクセスは、リダイレクトされてないじゃないか」と思ったが、それについても記載されていた。『一部のディレクトリは、リダイレクトの対象外です。』だそうだ。

以下は、リダイレクト対象外のディレクトリ一覧。

%windir%\system32\catroot
%windir%\system32\catroot2
%windir%\system32\driverstore
%windir%\system32\drivers\etc
%windir%\system32\logfiles
%windir%\system32\spool

Windows Server 2008、Windows Vista、Windows Server 2003、および Windows XP について:  %windir%\system32\driverstore ディレクトリはリダイレクトされます。

普通の利用者からしてみれば、64-bitだろうが32-bitだろうがどうでもいいし、64-bit版のOSで32-bitのアプリケーションが特に意識することなくすんなり動いてしまうので気付きにくい。
システムファイルをいじくる機会なんてそうそうあるものでもないが、覚えておいたほうが良さそうなのでここにメモしておく。

尚、アプリケーションの64-bit/32-bit判別については、Windows 64-bit 実行可能ファイル (EXE, DLL)の判別方法 を参照する。