64bit版WindowsでSystem32に64bit版のシステムファイルが入るのは、互換性を守るためです。32bitアプリからSystem32へアクセスした場合は、WOW64がSysWOW64へリダイレクトして32bit版のファイルを見せています。
System32は64bit、SysWOW64は32bit
64bit版Windowsのシステムフォルダを覗くと、ちょっとおかしなことに気づきます。
C:\Windows\System32には64bit版のDLLやexeが入っていて、C:\Windows\SysWOW64には32bit版が入っています。名前だけ見ると逆に思えますよね。「32」と付いているフォルダが64bit用で、「64」と付いているフォルダが32bit用です。筆者も最初にこの話を知ったときは、正直「なんでそうなった」と思いました。
| フォルダ名 | 実際の中身 | 主な対象 |
|---|---|---|
| System32 | 64bit版のシステムファイル | 64bitアプリ |
| SysWOW64 | 32bit版のシステムファイル | 32bitアプリ |
この表だけ見ると設計ミスのように思えますが、実はちゃんとした理由があります。
System32という名前が残ったのは互換性のため
32bit版Windowsの時代はシステムファイルの置き場所はSystem32一つだけでした。本来アプリはGetSystemDirectoryのようなAPIを呼んでこの場所を調べるべきなのですが、現実には多くの開発者が「どうせC:\Windows\System32で決まってるでしょ」とパスを直接コードに書き込んでいました。
そこに64bit版Windowsが登場します。Microsoftとしては新しく64bit用のフォルダを作ってSystem32を32bit専用に残す、きっとそうしたかったハズです。ただそれをやるとパスを直接コードに書き込んでいた大量の32bitアプリや、それを64bit向けに移植したアプリが軒並み動かなくなる恐れがありました。
そこで採られたのがSystem32はそのまま64bitネイティブ用として使い続け、32bit版のために新しくSysWOW64というフォルダを用意するという方法です。WOWってなんだよ、ワォ!ですか、ってカンジですよね。WOW64でWindows 32-bit On Windows 64-bitだそうです。
名前は変えないけど中身の役割は変える、という玉突き的な解決策です。ちなみにこれと同じことは16bitから32bitに移行したときにも起きていて、当時のSystemフォルダがSystem32に置き換わった経緯があります。歴史は繰り返すというやつですね。その時にWOW (Windows 16-bit On Windows 32-bit)というものができたそうです。
WOWって、なんだかAppleのRosetta 2みたいですね。
32bitアプリのSystem32アクセスはSysWOW64へ転送される
ここで気になるのが、パスをSystem32に直書きしている32bitアプリは64bit版Windowsでどう動くのかという点です。
実はWindowsが裏側でこっそり帳尻を合わせています。32bitプロセスがSystem32にアクセスしようとすると、WOW64が持つ「ファイルシステムリダイレクター」が働いて、アクセス先を自動的にSysWOW64へ差し替えます。アプリ側は何も変更していないのに、実際に読みに行くフォルダはこっそり入れ替わっているわけです。ちなみにWOW64は「32-bit Windows on 64-bit Windows」の略で、64bit環境の中に32bit向けの世界を再現する仕組みを指します。
Microsoft公式ドキュメントによると、リダイレクトの対象になるのは主に次のパスです。
ファイル システム リダイレクター – Win32 apps | Microsoft Learn
元のパス 32bit x86プロセスのリダイレクト先 32bit ARMプロセスのリダイレクト先 %windir%\System32 %windir%\SysWOW64 %windir%\SysArm32 %windir%\lastgood\system32 %windir%\lastgood\SysWOW64 %windir%\lastgood\SysArm32 %windir%\regedit.exe %windir%\SysWOW64\regedit.exe %windir%\SysArm32\regedit.exe
ただしdriverstoreやspoolなど一部のサブフォルダはこのリダイレクトの対象外です。32bitアプリでもこれらのフォルダは素通しで本物の中身が見えます。
もう一つ面白いのがSysnativeという特殊なパスです。32bitアプリがどうしても本物の64bit版System32を見に行きたい場合、C:\Windows\Sysnativeというパスを使うとリダイレクトを回避できます。これはWOW64だけが認識する仮想的なエイリアスで、64bitアプリからは逆に使えません。
ARM版Windowsだとさらにもう一枚重なる
余談ですが、Copilot+ PCなどのARM版Windowsでは話がもう少し複雑になります。
先ほどの表にもあった通り、ARM版Windowsでは32bit ARMアプリ用にSysArm32という3つ目のフォルダが用意されています。System32が64bit ARMネイティブ用、SysWOW64が32bit x86用、SysArm32が32bit ARM用という三重構造になっているわけです。x86からARMへの移行期らしい、過渡期ならではの仕組みと言えそうです。
ただ、Windows 11 on ArmではArm32アプリのサポート廃止が進んでいるようで、SysArm32のシステムバイナリも削除される方向です。
身近なIT用語の「なんで?」をゆるく知りたい方はIT雑学・ぷちQAカテゴリもあわせてどうぞ。


