Windows 秘話: ディレクトリの長い歴史

今月の Windows 秘話コラムでは、名前に system という単語が含まれるすべてのディレクトリの歴史を紹介します。

Raymond Chen

遠い昔、16 ビット Windows の時代には、C:\Windows\System という名前のディレクトリがありました。このときまでは、事態は複雑ではありませんでした。

Win32 の導入により、C:\Windows\System32 という名前の 2 つ目のシステム ディレクトリが追加されました。この 2 つ目のディレクトリには、32 ビットのシステム ファイルが含まれていました。16 ビットのシステム ファイルは古いシステム ディレクトリに含まれていました。ただし、Windows 95 では、例外的に、32 ビットのシステム ファイルと 16 ビットのシステム ファイルが同じディレクトリに存在し、そのディレクトリには、C:\Windows\System という古い方の名前が付けられていました。ですから、ここでは Windows 95 については触れないことにしましょう。

バッチ ファイルでは、起動するプログラムのバージョンがネイティブ OS に一致するという前提に基づいて、C:\Windows\System32 からプログラムを実行していました。このような想定は明示的なものではありませんでしたが、動作の性質上、それとなく理解できることでした。System32 ディレクトリに 32 ビット プログラムしか含まれていなければ、C:\Windows\System32\REG.EXE プログラムを実行してシステム レジストリ設定を更新するバッチ ファイルは、32 ビット版の REG.EXE を実行することになります。つまり、実際は 64 ビット版ですが、レジストリを 32 ビット版に見立てて更新することになります。他のスクリプト ファイル (REG ファイルなど) にも、同じ問題があります。

数多くの既存の 32 ビット プログラムでは、GetSystemDirectory 関数を呼び出すのではなく、System32 ディレクトリのパスをハードコーディングしています。このようなプログラムは、64 ビット Windows 用に再コンパイルされても、System32 ディレクトリにアクセスして、64 ビット ファイルを検出しようとします (これはプログラムが 64 ビットにコンパイルされていることに起因する動作です)。構成ファイルやレジストリに書き込まれるパスは、32 ビット プロセスと 64 ビット プロセスの両方で使用できる必要がありますが、システム ディレクトリへのアクセスを要求するプログラムの対応ビットに応じて適切なディレクトリを参照する必要があります。

理解できましたか

Windows チームは、この混乱した状況から抜け出すため、64 ビット システムでは 64 ビット ファイル、32 ビットシステムでは 32 ビット ファイルを含むように System32 ディレクトリを構成しました。32 はディレクトリ名前の一部でしかなく、何の意味もありません。これは、DVD がただの名前で、実際には何の意味もないのと似ています。また、多くの大企業が、HSBC、KFC、BP、KPMG など、過去には何か意味があったのかもしれませんが、今では形だけでしかない一連の文字列を、会社の正式名称にしているのと似ています。

32 ビット プロセスにおけるファイル システムのリダイレクトについて触れると、既にややこしい話がさらに複雑になります。32 ビット プロセスが、64 ビット システムの C:\Windows\System32 ディレクトリにアクセスすると、その操作は、32 ビットのシステム DLL が存在する、C:\Windows\SysWOW64 ディレクトリにリダイレクトされます。

このことから、System32 は、"実行中のアプリケーションが対応しているビットに一致しているシステム DLL" のディレクトリを示す、やや奇妙な名前と見なすことができます。このようなディレクトリには、実行環境に対応したファイルが含まれているので、理想的には、SysExec ディレクトリと呼ぶのが適切です。

でも待ってください、まだ続きがあります

32 ビット プロセスから、64 ビットのシステム ディレクトリにアクセスする必要がある場合は、どうすればよいでしょうか。ファイル システムのリダイレクト機能により、C:\Windows\System32 ディレクトリにアクセスすると、C:\Windows\SysWOW64 ディレクトリにリダイレクトされます。プログラムでは、Wow64­Disable­Wow64­Fs­Redirection のような、扱いづらい名前の関数を使用できますが、このような関数を使用すると、すべての操作のリダイレクトを再度有効にするまで、リダイレクトが無効になります。このような関数を使用すると、少しでも複雑な操作 (ファイルを 1 つ開くという単純な操作よりも複雑な操作) を実行する場合に問題が発生します。複雑な操作を実行すると、複数のファイルにアクセスしたり、ワーカー スレッドを作成したりすることになる可能性があります。

これで、System という名前を含むさまざまなディレクトリに関する話は終わりです。この話が難しいと感じた場合は、ディレクトリの役割が、ほとんど名前とは関係ないことだけを覚えておいてください。

Raymond Chen

Raymond Chen は自分の Web サイト「The Old New Thing」および同じタイトルの書籍 (Addison-Wesley、2007 年) で、Windows の歴史、Win32 プログラミング、そして黒い粘着テープの幻の修復力について触れています。

関連コンテンツ