Windows 11で64ビットファイルがSystem32に、32ビットファイルがSysWOW64に保存される理由

MSはWindows 11の32ビット版を提供していませんが、同OSは数十年にわたって蓄積されてきた32ビットアプリケーションを引き続きサポートする必要があります。その解決策として、2つのシステムディレクトリが使用されています。ネイティブ64ビットファイル用のSystem32と、32ビットファイル用のSysWOW64です。32ビットアプリケーションがSystem32へアクセスしようとすると、WOW64ファイルシステムリダイレクターによって自動的にSysWOW64へ転送されます。
Windows 11 26H2を搭載したPCでは、両方のディレクトリにkernel32.dllという名前のファイルがあります。一方は64ビットアプリケーション用、もう一方は32ビットソフトウェア用に設計されているため、ファイルサイズが異なります。

AppleのようにMSが32ビットソフトウェアのサポートを終了できれば、Windowsはこの互換性アーキテクチャを必要としなくなる可能性があります。しかし、既存の32ビットアプリケーションが非常に多いため、その移行は格段に困難です。
System32に64ビットファイルが含まれている理由
16ビット版Windowsの時代、システムファイルはC:\Windows\Systemに保存されていました。32ビット版Windowsが登場すると、MSは32ビットファイル用にC:\Windows\System32を導入しました。これがディレクトリ名の由来です。
64ビット版Windowsが開発される頃には、多くのアプリケーションがGetSystemDirectory関数を通じてパスを取得せず、System32のパスをハードコードしていました。MSのベテランエンジニアであるRaymond Chen氏によると、これらのアプリケーションを64ビットプログラムとして再コンパイルした後もSystem32を参照し続けましたが、今度はそこに64ビットファイルがあることを前提としていました。
バッチファイルでも同様の互換性問題が発生しました。System32に32ビットツールが引き続き格納されていた場合、System32\reg.exeを実行するスクリプトは、想定されている64ビット版ではなく32ビットのレジストリビューを変更してしまいます。
そのためMSは、System32にOSのネイティブアーキテクチャと一致するファイルを格納することを決定しました。同社のFile System Redirectorに関するドキュメントでは、64ビット版Windowsの%windir%\System32ディレクトリは64ビットアプリケーション用に予約されていると説明されています。
MSが64ビット版を作成した際も、ほとんどのDLL名は変更されませんでした。その結果、古いMS-DOSの命名規則に従った名前を持つkernel32.dllは、両方の場所でkernel32.dllと呼ばれています。このため、32ビット版には別のディレクトリが必要になりました。
Chen氏は、System32の「32」は現在、その内容を正確に示すものではなく、単に名前の一部にすぎないと指摘しています。理想的な設計であれば、実行されるプログラムに適したファイルを提供するため、このフォルダーはSysExecと名付けられていたかもしれないと述べています。
WOW64は「Windows 32-bit on Windows 64-bit」を意味します。これは、32ビットアプリケーション向けのMSの互換性レイヤーです。SysWOW64の「64」はホストOSを指しており、ディレクトリ自体には32ビットファイルが格納されています。皮肉なことに、64ビットアプリケーションは、名前に「64」が含まれるシステムフォルダーを使用しません。
Windows 11が32ビットアプリケーションをSysWOW64へリダイレクトする仕組み
32ビットプロセスは64ビットDLLを読み込んで実行できず、64ビットプロセスも32ビットDLLを読み込めません。リダイレクトがなければ、System32にkernel32.dllを要求した32ビットアプリケーションは、互換性のないファイルを受け取ることになります。
x64版Windowsでは、32ビットアプリケーションが保護されたSystem32パスを要求すると、WOW64が関連するファイルシステム要求を透過的にリダイレクトします。通常、アプリケーション側はパスが変更されたことを認識しません。
この動作は、C:\Windows\SysWOW64\cmd.exeから32ビット版コマンドプロンプトを開くことで確認できます。そのウィンドウではecho %PROCESSOR_ARCHITECTURE%を実行するとx86が返されますが、標準の64ビット版コマンドプロンプトではAMD64と表示されます。両方のウィンドウでdir C:\Windows\System32\kernel32.dllを実行すると、同じパスを入力したにもかかわらず異なるファイルサイズが表示されます。これは、32ビットプロセスがSysWOW64内のコピーへリダイレクトされるためです。


当時MSのVisual Studioチームに所属していたMatt Pietrek氏でさえ、この動作に遭遇しています。同氏は2006年のMSDN Magazineの記事で、32ビット版コマンドプロンプトから両方のディレクトリにあるkernel32.dllを一覧表示したところ、結果が同じに見えたため、当初は困惑したと述べています。
WOW64の機能は、ファイルシステムのリダイレクトだけにとどまりません。レジストリリダイレクターを通じて、32ビットアプリケーションにHKEY_LOCAL_MACHINE\Software\Wow6432Node以下の独立したレジストリビューを提供します。また、32ビットアプリケーションの%ProgramFiles%環境変数をProgram Files (x86)に設定します。

MSは、ユーザーアカウント制御に関連する特殊な例外について説明しています。リダイレクトされたファイルを開く際にUACプロンプトが表示される場合、リダイレクトは行われず、代わりにWindowsが64ビット版を起動します。そのため開発者は、必要に応じてSysWOW64のパスを明示的に指定するか、32ビットアプリケーションを管理者として実行する必要があります。
仮想Sysnativeディレクトリの使用
Sysnativeは、32ビットアプリケーションのみが利用できる仮想ディレクトリです。C:\Windows以下に物理的には存在せず、64ビットアプリケーションからはアクセスできません。64ビット版エクスプローラーのアドレスバーにC:\Windows\Sysnativeと入力するとエラーになりますが、32ビット版コマンドプロンプトではdir C:\Windows\Sysnative\cmd.exeを実行できます。

開発者はWow64DisableWow64FsRedirection関数を呼び出すことでリダイレクトを無効にできますが、現在のスレッド上のすべてのファイル操作に影響します。MSは、ファイルシステムのリダイレクトを無効にするとDLLの読み込みに失敗する可能性があると警告しています。
Chen氏はSysnativeを「局所的な問題に対する局所的な解決策」と表現しています。同氏は以前から、エミュレーターの動作に逆らうべきではないと開発者に助言しており、ネイティブ64ビット操作が必要な場合は、32ビットインストーラーから64ビットインストーラーを起動するよう推奨していました。互換性問題の多くは、32ビットアプリケーションが64ビットプロセスのように動作しようとすることで発生します。
6つのSystem32フォルダーはWOW64リダイレクトの対象外
MSは、32ビットアプリケーションがリダイレクトされることなくアクセスできる6つのSystem32サブディレクトリを指定しています。この除外リストは時代とともに変更されてきました。たとえばdriverstoreは、Windows Vista、Windows XP、Windows Server 2003、Windows Server 2008ではリダイレクトの対象でした。
MSは、それぞれが除外されている理由を説明していません。ただし、これらのディレクトリの一部には、drivers\etc以下のhostsファイルなど、32ビットと64ビットの両アプリケーションが一貫してアクセスする必要のある共有データが含まれています。
Arm版Windows 11からSysArm32を削除へ
Snapdragon X搭載ノートPCなどのArmベースコンピューターでは、32ビットx86アプリケーションもSysWOW64を使用します。従来、32ビットArmアプリケーションはSysArm32という3つ目のディレクトリへリダイレクトされていました。
MSの実装ドキュメントによると、Arm64システムでは、WOW64がxtajit.dllというエミュレーターを介してx86コードを変換します。一方、x64プロセッサーは32ビットコードをネイティブに実行し、Wow64Cpu.dllが実行モード間の切り替えを管理します。
MSのArm開発者向けドキュメントには現在、Arm PCでは32ビットArmアプリケーションがサポートされなくなったと記載されています。これまでSysArm32ディレクトリに保存されていたシステムバイナリも削除されつつあります。32ビット版と64ビット版の両方を含む標準的なx86アプリケーションは、昨年AVXおよびAVX2への対応が追加されたPrismエミュレーションを通じて引き続き動作します。
分かりやすい命名よりも互換性を優先
MSは20年前にSystem32の名前を変更することもできましたが、そうすれば多くの既存アプリケーションが動作しなくなっていたでしょう。その代わりに同社は、定着したディレクトリ名を維持しながら、リダイレクター、仮想エイリアス、除外ルール一式を構築しました。これは、古いソフトウェアのためにWindows 95のヒープマネージャーなどの要素を維持してきた、互換性重視のアプローチを反映しています。
すべてのアプリケーションが64ビット版Windowsへの移行を乗り越えられたわけではなく、3D Pinballはその代表例です。SysExecのような名前のほうが分かりやすかったとしても、時代遅れのディレクトリ名がもたらす弊害は、アプリケーションやインストーラーが広範囲に動作しなくなることよりも小さいのです。

