Wednesday 7 May 2014

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

紛らわしいフォルダ名。
64bit版Windowsにおいて、%WINDIR%System32 は64bitコードが格納されたディレクトリです。
64bitビットアプリケーションから上記ディレクトリを参照するとそのまま見えますが、32bitアプリから見ると、%WINDIR%SysWOW64 ディレクトリの内容が返されます。(一部例外あり)

32bitアプリのファイル/フォルダ調査ソフトでSystem32を見ると、アプリ内での表示はSystem32のままなのに調査結果はSysWOW64のものが表示されます。

危ないね。大きな誤解の元。

参考記事↓↓↓

個人的な φ(`д´)メモメモ… ここには何もありません。個人的なメモだけです。
http://yamori-jp.blogspot.jp/2011/04/64bitwindows32bitsystem32.html



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)の判別方法 を参照する。