2017年、あけましておめでとうございます。
今年の最初の記事はちょっとマニアック(?)というかシステム的な話です。
Contents
system32フォルダのファイルを見ると内容が違う
システム開発をしている人から、「Windowsのsystem32フォルダに設定ファイル(iniファイル)をコピーしたけど、作成したアプリケーションで読み込むと違う内容が読み込まれる」という相談を受けました。
システム開発をしない人には全く分からない話だと思いますが、備忘録として書いておきます。
その人の話では、アプリケーションが参照するiniファイルをC:\Windows\system32にコピーし、処理の中でiniファイルを読み込んだけど、コピーしたファイルと全く違う内容が読み込まれているらしいです。
そのiniファイルを「hoge.ini」としますが、エクスプローラーでhoge.iniをメモ帳で開くと正しい内容が表示されます。
ということは、hoge.iniは確かにそのフォルダに存在し、ファイル内容も正しいはずです。
ただ、アプリケーションで読み込むとなぜか違う内容になるという不可思議な状態になっています。
アクセス権限によって参照されるファイルが違う
実は以前にも似たようなケースを経験したことがありました。
その時は「Program Files」フォルダのファイルにアクセスしたときに、同じようにそこのあるファイルと違う内容が読み込まれるという現象でした。
この原因は、Windows Vista以降に導入されたアクセス権限に関する動作にあります。
Program Filesフォルダは特殊なフォルダで管理者権限がなければ読み書きはできません。
管理者権限がないアプリケーションがProgram Filesフォルダにアクセスするとエラーではなく、仮想フォルダを構成して処理するのです。
つまり、
ということが起きるわけです。
具体的には、アプリケーション(ユーザー)は C:\Program Files\hoge\hoge.ini を作成したつもりでも実は C:\Users\[ユーザー名]\AppData\Local\irtualStore\Program Files\hoge\hoge.iniというファイルが作成されているのです。
なんと、ありがた迷惑な仕様!
今回も同じようなことが起きているのではないかと推測し、VirtualStoreフォルダを確認したのですが、該当するファイルがありません。
おかしい・・・
64bit Windowsではさらに挙動が違う
さらに調査した結果、64bitのWindowsのWindowsフォルダには「system32」フォルダと「SysWOW64」フォルダというのが存在します。
名前からすると
- system32 … 32bit用ファイルが格納される
- SysWOW64 … 64bit用ファイルが格納される
と思いますが、実はこれが真逆なんです!
- system32 … 64bit用ファイルが格納される
- SysWOW64 … 32bit用ファイルが格納される
これが正解です。
SysWOW64は「Windows 32-bit On Windows 64-bit」の略で「WOW64」というらしいです。分かりやすいようで分かりにくい!
そして、仮想フォルダのVirtualStoreと同じような仕組みで、64bitのWindowsで32bitのアプリケーションがsystem32フォルダにアクセスすると、気を利かせて、SysWOW64フォルダにリダイレクトしてくれるのです!(余計なお世話だ!と思うのですが)
ちなみに32bitのWindowsでは、system32フォルダだけあって、SysWOW64フォルダはありません。これも話をややこしくしている原因でしょうね。。。
まとめ
今回作成していたアプリケーションは32bit用です。
そして、動作させていたのは64bitのWindowsでした。
つまり
system32フォルダにアクセスしているつもりで、実はSysWOW64フォルダにアクセスしていた
というオチです。
エクスプローラーで確認すると、C:\Windows\SysWOW64フォルダに hoge.iniがあり、アプリケーションで読みんだ結果は、そのファイルに間違いありませんでした。
最終確認で、C:\Windows\SysWOW64フォルダに、読み込ませたい内容の hoge.iniを配置して、アプリケーションで読み込むと期待通りの動作になりました。
めでたし、めでたし。
余談(32bitエディタを使っている人は要注意)
ちなみに、有名な秀丸エディタも32bitアプリケーションなので、system32フォルダのファイルを開くと、実はSysWOW64フォルダにあるファイルを開くという挙動になります。
32bitアプリケーションのエディタを使っている人は、system32フォルダのファイルを開く場合は要注意ですよ!
コメント