【悲報】System32の中身は64bitだった、Windows最大の逆転劇の真相
【悲報】System32の中身は64bitだった、Windows最大の逆転劇の真相
Windowsを使っていて一度は首をかしげる謎がある。System32という名前の入れ物に64bitの部品が入り、その隣のSysWOW64という64の名を持つ入れ物に32bitの部品が入っている。直感に反する逆転現象は、開発のミスでも冗談でもない。世界中の膨大なソフト資産を守るために下された重い決断の結果だ。現在の64bit版ではSystem32に本来の64bit部品が置かれ、64を含む名称の側に旧来の32bit部品が収められている。普通に考えればSystem64を作ってそこに64bitを入れるのが当たり前に見えるが、そうできなかった事情が過去の作り方に潜んでいた。
歴史を振り返ると、昔の16bit時代にはWindowsの下にSystemという入れ物があった。Windows 95やNTで32bitへ移行する際に16bitとの衝突を防ぐために作られたのがSystem32だ。当時は32bit専用の入れ物だったため、名前は完全に合理的で分かりやすかった。おかしくなったのは64bit時代を迎えてからだ。そのままの法則でSystem64を作る計画は、過去10年にわたり作られてきた膨大なソフトの構造そのものに阻まれた。引き金は現場に蔓延していたパスの直接書き込みという悪習だ。本来は専用の関数を呼び出して環境に応じた場所を動的に取得するのが正規の手順だが、現実にはコードの中にCドライブ直下のSystem32という文字列を直接書く人が後を絶たなかった。未来も入れ物はSystem32のままという誤った前提が世界中に広がっていた。もし新しくSystem64を作ってそこに64bit部品を入れれば、古い導入手順がSystem32の文字列を抱えたまま誤った入れ物に必要な部品を放り込み、導入すら失敗する事態が多発する。著名な技術者の解説でも、この後方互換の壁の恐ろしさが語られている。どれだけ行儀の悪い記述であっても既存のアプリを動かし続けることを最優先にし、生態系全体の崩壊を避けるため、名前を覆す大胆な方針が選ばれた。

System32の再定義と2つの世界の橋渡し
下された決断こそSystem32という入れ物そのものの再定義だった。System32という入れ物は数字の32に関係なく、そのOS本来の部品を置く場所だとされた。つまり64bit OSにおける本来の環境は64bitだから、System32の中身も64bitになった。名前はそのままで中身を新しい役割に変えた。これにより新しく作られた64bitアプリの破綻を未然に防いだ。初期の64bitアプリには昔の記述の流用で内部にSystem32という記述が残っているものが多く、もしSystem32に32bit部品が残っていたら形式不一致で即座に動作しなくなる。基本的に一つの処理の中で桁数の異なる部品を混在させて実行することはできないため、OSの中核を担う部品を確実にSystem32へ集約する必要があった。旧来の導入手順が誤った場所に部品をばらまく混乱もこれで回避できた。居場所を奪われた32bitアプリのために別の安全な環境が必要になり、開発されたのが2つの異なる世界を橋渡しする特別な仕組みだ。64bit環境上で32bitアプリを動かすための層で、ここは仮想的な32bit空間だと信じ込ませる役割を持つ。アプリをだまして本物の32bit機で動いているように錯覚させている。一番下には本物の64bitの中核が控え、その間に入る部品が処理を担う。極めて重要なのは、この変換処理が利用者側の領域の中で完結している点だ。中核の空間を汚さないため、片方で異常が起きても全体が道連れで壊れない。一つの処理の中には32bit用と64bit用の2つの管理構造が同時に積まれ、内部構造まで二重に保持する念の入った二重構造になっている。
境界を越える翻訳と壮大な騙し絵
アプリが実際に中核へ命令を出す際にはさらなる変換が必要で、一連の流れはThunkingと呼ばれる。最初の段階は横取りで、アプリが部品作成の命令を呼ぶとそれを途中で受け取る。本来なら直接中核へ行くはずの命令を層が受け止める。次に切り替えが発生し、処理装置の動作状態を保存して32bit互換状態から64bit本来へと切り替える。続いて引き渡しの引き伸ばし処理で、32bit形式で作られた記憶領域の束や長さを64bit中核が読める大きさへ拡張して並べ直す。箱の大きさを詰め替えているわけだ。大きさを合わせた上で本来の実行へ進み、中核へ命令を出して処理してもらう。結果が返ってきたら逆の手順で32bitの大きさへ戻し、アプリには何事もなかったかのように返す。毎回複雑な翻訳を自動で瞬時にこなす職人芸だ。箱や入れ物への到達にも同様の仕掛けが用意され、到達先を透過的に曲げるのがリダイレクタだ。64bitの処理から見るとSystem32に直接触れて本来の実態を扱える。一方で32bitの処理がSystem32を開こうとすると、裏側で到達先が書き換えられ、自動的に対になる側へ誘導される。本人はSystem32を見ているつもりなのに、実際には別室の中身を読まされている。まるで本物そっくりの偽物の部屋へ案内されているようだが、このおかげで固定書きされた古いアプリも一切壊れずに動く。一部の共有用を除き、どうしても本物に触れたい時のための仮想の抜け道や、設定情報の隔離転送も用意された。ただし自由に行き来できる抜け道の存在が重大な弱点を生んだ。境界線を悪用した手法が天国の扉と呼ばれ、処理装置の状態を示す値を書き換えて64bit側へ脱出する手口で、当時の監視網をすり抜けて不正な処理を実行できた。そこで導入されたのが制御フローの防御で、記憶上に許可の巨大な地図を展開して呼び出し先が正当か照合する。32bit用と64bit用で2つの独立した地図で監視し、不正な越境は即座に強制終了される。互換を保ちながら安全性の隙間を埋めて進化してきた。
名前に込められた本当の意味
最後に名称の謎解きだ。先頭はOSの中枢を司る仕組みを意味する。中央は32bitを64bit上で動かす層の役割を示す。そして末尾の64は動作している親OS、つまり土台が64bitであることを示している。全体をつなげると64bitの土台の上で32bitアプリを動かすための仕組み用入れ物という意味になる。つまり末尾の64は中に入っている部品自体の桁数を表した数字では全くなかった。中身が64bitだから64なのではなく、64bitの土台の上で動く仕組みだから64なのだ。入れ物名に部品自体の桁数が書かれているという思い込みこそ錯覚の正体で、土台が64bitである世界の中に用意された専用の部屋という事実をそのまま命名しただけだ。外から見ると直感に反して見えるが、設計思想からすれば少しも矛盾していない。名前の美しさよりも利用者の資産と互換を守り抜いた歴史の証拠と言える。
ネットの反応
最初の段階でSystemを本来の場所にしてアーキテクチャが変わる度に文字を足す仕様にした事自体がこの訳の分からない事態を生んだ
Systemが16bit、System32が64bit、SysWOW64に32bitが入っているんだよな。マジでややこしい
昔でもCドライブを決め打ちしていて、別ドライブへ入れた環境では動かないソフトがあった。歴史に学ばない開発者が多いのさ
タスクバーを左に置いたら不具合を出すソフトも少なくない。つまり左上は画面の原点と決めつけて作っている。当然問い合わせないといけない
Windowsは中核の下に仕組みがあって、普段使うのは64bit版の従来仕組みと考えれば分かりやすい。最近は別仕組みの改良で威力を体感できる
AIの所感
名前より資産を選んだ判断に、道具を守る覚悟を感じる。行儀の悪い記述すら切り捨てず、裏側で翻訳と騙し絵を重ねて動かし続ける姿は地味だが壮大だ。直接書きという小さな楽が、OSの設計まで縛ったという教訓も重い。問うべきは場所ではなく土台であり、64という数字の指す先を取り違えないことが理解への近道だと思う。