Windowsの「メモ帳」は「%Windir%\System32\notepad.exe」と「%Windir%\notepad.exe」の2つの場所に存在します。なぜ、タイムスタンプ、日付、ファイルハッシュまでも同一の2つのコピーが存在するのでしょうか。一部では、古くから熱い議論が繰り広げられてきました。なぜ、同じファイルに対するリンクではなく、別のコピーとして存在するのか……。今回は、その謎に迫ります。
Windows標準のテキストエディタである「メモ帳」が「%Windir%(通常、C:\Windows)\System32\notepad.exe」と「%Windir%\notepad.exe」の2つの場所に存在することは、Windowsの初期バージョンのころから、そのことに気が付いた一部のユーザーを戸惑わせてきました。マルウェアがこっそり仕込んだ“偽物”と疑うユーザーもいたようです。今でも、そのことを知らないユーザーが、2つ目のメモ帳の存在を発見したときには、同じように不審に思うことでしょう。
メモ帳が2つの場所に存在する理由については、ひと昔前に書かれた以下のブログで説明されています。その理由とは、古いプログラムに対する「互換性」の提供です。
単に古いと言いましたが、それは恐らくメモ帳が初めて登場したときにまでさかのぼります。Windows 3.0では「Windows」ディレクトリに「notepad.exe」が配置されていました(画面1)。
その後、登場したWindows NTの初期バージョンでは「WINNT\System32」ディレクトリに「notepad.exe」が配置されていました。当時、アプリケーションのセットアッププログラムの多くにはメモ帳のパスがハードコードされており、「Readme.txt」の表示に使用されていたそうです。そのようなプログラムがエラーにならないように、「%Windir%\System32」のパスのあるWindowsでは「%Windir%」と「%Windir%\System32」の2つの場所に配置されることが決まりました。
つまり、前者はWindows 95向けに書かれたプログラム、後者はWindows NT向けに書かれたプログラムのためのものです。その結果、Windows 95/98/Millennium Edition(Me)では「%Windir%」のみに配置されていましたが、Windows NT 4.0では2つの場所に配置されました。その後のWindowsでは、引き続き2つの場所に配置されています。
このブログには85個のコメントが付いており、1年以上にわたって熱い議論が行われていました。主な論点は「なぜ、同じファイルを二重で持つという非効率的な方法をとっているのか」ということです。答えは単純なことなのですが、その前に現在に戻りましょう。
Windowsのシステムファイルやデバイスドライバの多くは、通常「%Windir%\System32」ディレクトリや「%Windir%\System32\Drivers」ディレクトリに配置されます。しかし、実際にはファイルがパスにコピーされるのではなく、「%Windir%\WinSxS」ディレクトリの配下に格納されているバイナリファイルを参照する「ハードリンク」として存在しています。
例えば、Windowsカーネルである「C:\Windows\System32\ntoskrnl.exe」は、「C:\Windows\WinSxS\amd64_microsoft-windows-os-kernel_31bf3856ad364e35_10.0.16299.402_none_79e5608c1ecd7cc0\ntoskrnl.exe」を参照するハードリンクといった具合です。
ハードリンクは、ローカルボリューム上の1つのファイルに対する、複数のパスによる参照を可能にします。どのパスが本物という区別はありません。参照数が0になれば、そのファイルはボリューム上から削除されます。
Windows標準の「fsutil hardlink list <ファイルのパス>」コマンドや、Windows Sysinternalsの「FindLinks」ツールを使うと、ハードリンクを確認することができます。ハードリンクと似たものに「シンボリックリンク」がありますが、こちらはファイルやディレクトリを参照するショートカットのようなものです。シンボリックリンクは絶対パスだけでなく、相対パスでの指定も可能で、ボリュームやネットワークをまたがることもできます。
Windowsがシステムファイルの配置にハードリンクを多用しているのは、Windows Vistaから導入された「CBS(Component-Based Servicing)」と呼ばれるアーキテクチャに関係しています。Windows XP以前は、Windowsの機能を追加する際にインストールメディアを要求されますが、Windows Vista以降は要求されなくなりました。その理由は「%Windir%\WinSxS」に、ほとんどのコンポーネントのバイナリが格納されているからです。
また、セキュリティ更新やその他の品質更新プログラムによる新バージョンは「%Windir%\WinSxS」に格納され、「%Windir%\System32」などにあるシステムファイルは、新しいバージョンに対するハードリンクに付け替えられます。
「%Windir%\WinSxS」には複数のバージョンが維持されており、更新プログラムのアンインストール時にハードリンクを古いバージョンに付け替えることで、以前のシステムファイルに戻すことができるようになっています。気になるのは、度重なる更新による「%Windir%\WinSxS」の肥大化ですが、それは自動メンテナンスタスクまたは手動によるクリーンアップで最適化できます。
この前提を踏まえた上で、Windows 10のメモ帳(notepad.exe)を調べてみましょう。メモ帳は、前述のように「%Windir%」と「%Windir%\System32」の2つの場所に配置されています。Windows 10 x86には32bit版のメモ帳が、Windows 10 x64には64bit版のメモ帳が、これらの場所に配置されています。Windows 10 x64の場合、さらに「%Windir%\SysWOW64」に32bit版のメモ帳が配置されています(WOW64上で動作します)。
スタートメニューのショートカットからの起動、「ファイル名を指定して実行」からの起動、ファイルの関連付け(.txt)によるエクスプローラーからの起動の際には、「%Windir%\System32」のメモ帳が起動します。その他の場所のメモ帳は、現在のディレクトリ(カレントディレクトリ)との関係、あるいは明示的なパス指定で起動されることがあります。
それでは、2つのメモ帳のパスに設定されているハードリンクの参照先を調べてみましょう。コマンドプロンプトで以下のコマンドラインを実行します。
fsutil hardlink list %Windir%\System32\notepad.exe
fsutil hardlink list %Windir%\notepad.exe
すると、「%Windir%\WinSxS」ディレクトリの別のバイナリファイルにリンクされていることが判明しました(画面2)。
「%Windir%\WinSxS」ディレクトリの別のサブディレクトリにある2つの「notepad.exe」は、同じバージョン情報、同じファイルサイズ、同じタイムスタンプ、同じデジタル署名、同じファイルハッシュ、同じセキュリティ設定(アクセス制御リスト)を持つ、全く同じ内容の実行可能ファイルです。違いがあるとすれば、一方のサブディレクトリ(%Windir%\System32\notepad.exeがリンクしている方)には、「Notepad.lnk」というショートカットファイルが存在することだけです。これは、「notepad.exe」の違いを示すものではありません。何かおかしな感じがしませんか。
ここでの疑問点は「%Windir%\WinSxS」ディレクトリ内の同じ「notepad.exe」にハードリンクすればよいのに、“なぜ、別々のファイルにリンクしているのか”ということです。Windows全体から見れば微々たるものかもしれませんが、無駄にディスクを消費していることになります。ほんの240KB(Windows 10 バージョン1709の64bit版バイナリの場合)程度ですが、「notepad.exe」が新しいバージョンに更新されるごとに、無駄は膨らみます。
Copyright © ITmedia, Inc. All Rights Reserved.