Windows 11 でそのまま動く最古の GUI アプリは、1992 年の CD プレーヤーだった

まず 1993 年の FreeCell を Windows 11 で動かし、Internet Archive で NT 3.1 のプレリリース版を漁る。行き着いたのは 1992 年 11 月の CDPLAYER.EXE。呼び出し規約の修正後で、今も残る crtdll.dll を使って壊れた C ランタイムを避けていた。

日本語
コピー
Windows 11 桌面上开着 1993 年版 FreeCell,纸牌窗口与今天的系统界面并排

初期調査

以前から、ちょっとした疑問を抱えていた。変更もエミュレーションもなしに Windows 11 で今も動く GUI アプリケーションの中で、最も古いものは何か、というものだ。

Windows の後方互換性は優秀なので、答えは驚くほど古いものになるだろうと予想していた。

残念ながら、Windows 11 は 16 ビットの Windows プログラムを単体では実行できない。64 ビット版 Windows には NTVDM がないからだ。となると、NT 時代の初期のものから探すしかない。

この疑問は以前、匿名掲示板で投げたことがある。Win32s を教えてくれた人がいて、FREECELL.exe が付いた初期リリース版を探すよう勧められた。

そのとおりにしてみると、案の定、更新日時が 22-Feb-93 の FREECELL.EXE が、最新の Windows 11 上で一切変更を加えずに動作し、問題なく遊べた。

1993 年の FREECELL.EXE

この記事を書いている時点で、33 年 8 か月前のアプリケーションということになる。驚いたことに、ほぼ自分の年齢と同じだ。

「へえ」と思った程度で、これで謎は解けたと結論づけ、しばらくすると忘れてしまった。ところが最近になって、なぜかこの疑問がまた頭に浮かび、今度はもっと古いものがないか本気で調べてみることにした。

さらなる調査

Internet Archive で古い Windows のバージョンを漁っていると、NT 3.1 の初期プレリリース版がいくつか見つかり、期待が持てた。だが問題は、現在の実行ファイル形式との非互換か、開発の後半で変更された API のどちらかにあった。

1991 年の最も初期のバージョンは、現代の Windows と互換性のない草案段階の PE 形式を使っていた。1992 年半ばまでのビルドは、Windows API 呼び出しに stdcall ではなく cdecl 呼び出し規約を前提としていたため、引数が二重に削除されてしまう。こんな具合だ。

push hwnd          ; 4 bytes of args
call [ShowWindow]  ; Win11 ShowWindow is stdcall, ends with "ret 4" and removes them
add  esp, 4        ; the 1992 caller removes them again

当然ながら、これではプログラムはクラッシュする。

しかし、Build 347 に目を引くアプリケーションが 1 つあった。16-Nov-1992 でリンクされていた CDPLAYER.EXE だ。この時点で呼び出し規約は修正済みだったが、同じビルドの他のプログラムは同梱の C ランタイムでクラッシュする。CDPLAYER.EXE はシステムの crtdll.dll を使うことでそれを回避しており、Windows 11 には今も SysWOW64 に crtdll.dll が同梱されている。

プログラムを起動すると、こんな表示が出る:

CD-ROM ドライブが見つからないと表示する CDPLAYER.EXE

当然だが、私のマシンに CD-ROM ドライブは付いていない。だが、小さな DLL(cdemu.dll)を使えば、偽の音声データでドライブをエミュレートし、実際に音を鳴らせる:

CD-ROM をエミュレートした状態の CDPLAYER.EXE

もうすぐ 34 年になるプログラムとしては、なかなかすごい。

ズルをしたら?

先ほど、16 ビットプログラムはサポートが終わったので対象外だと書いた。

だが、望むなら otvdm のようなものを使って、古い Windows アプリを動かすこともできる。

見てほしい。Windows 1.01 から取り出した REVERSI.EXE(15-Nov-1985 付き)が、Windows 11 上で完全に遊べる状態で動いている:

Windows 1.01 の REVERSI.EXE が Windows 11 で動いているところ

otvdm を使うのはズルのようにも感じるが、この記事に入れる価値はあると思った。

出典: blog.enlyth.com← ホームへ戻る