Windows 11 上还能原样运行的最老图形程序,是 1992 年的 CD 播放器

作者先让 1993 年的 FreeCell 在 Windows 11 上跑起来,又翻 Internet Archive 的 NT 3.1 预发布版,最后找到 1992 年 11 月的 CDPLAYER.EXE:它赶上了调用约定修复,又靠系统里还留着的 crtdll.dll 绕开坏掉的 C 运行时。

中文
复制
Windows 11 桌面上开着 1993 年版 FreeCell,纸牌窗口与今天的系统界面并排

最初的调查

有段时间我一直在琢磨一个无聊的问题:能在 Windows 11 上不经任何修改、不靠模拟直接运行的最古老的图形界面程序是什么。

考虑到 Windows 出色的向后兼容性,我本以为答案会古老得惊人。

遗憾的是,Windows 11 本身跑不了 16 位的 Windows 程序,因为 64 位 Windows 没有 NTVDM,所以只能从 NT 时代早期去找。

我记得之前在一个匿名论坛上问过这个问题,有人给我指了 Win32s,建议找一个带 FREECELL.exe 的早期版本。

我照做了,结果还真成了:FREECELL.EXE,修改日期为 22-Feb-93,在最新版 Windows 11 上原封不动地运行,完全可玩:

1993 年的 FREECELL.EXE

截至本文写作时,这个程序已有 33 年零 8 个月的历史,几乎和我一样老,着实令人惊叹。

当时我觉得“挺酷”,就当这个谜题已经解开,很快便抛在了脑后。但不知为何,这个问题最近又冒了出来,这次我决定深挖一下,看能不能找到更老的。

进一步尝试

在 Internet Archive 上翻查旧版 Windows 时,我找到了一些早期的 NT 3.1 预发布版本,看起来有戏,但主要问题要么是与今天的可执行文件格式不兼容,要么是开发后期才出现的 API 变更。

最早的 1991 年版本用的是草稿版 PE 格式,与现代 Windows 不兼容;而直到 1992 年中的构建,Windows API 调用仍采用 cdecl 调用约定而非 stdcall,参数因此会被清理两次,就像这样:

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,就是 CDPLAYER.EXE,链接在 16-Nov-1992 上。到那时调用约定已经修好,但那个构建里的其他程序都会在自带的 C 运行时里崩溃。CDPLAYER.EXE 则通过使用系统的 crtdll.dll 绕开了这个问题,而 Windows 11 至今仍在 SysWOW64 中附带 crtdll.dll。

启动程序后,你会看到类似这样的画面:

CDPLAYER.EXE 未找到 CD-ROM 驱动器

原因很简单:我的电脑没有 CD-ROM 驱动器。不过,你可以用一个小 DLL(cdemu.dll)配合一些伪造的音频数据来模拟一个,让它真的能播放音频:

CDPLAYER.EXE 使用模拟的 CD-ROM

对一个快 34 岁的程序来说,这挺酷的!

作弊一下又如何?

前面我提到,16 位程序已经不在考虑范围内,因为它们不再受支持。

但如果你愿意,可以用 otvdm 这类工具来运行更老的 Windows 应用。

请看:一个取自 Windows 1.01、日期为 15-Nov-1985 的 REVERSI.EXE 完整可玩版本,正运行在 Windows 11 上:

来自 Windows 1.01 的 REVERSI.EXE 运行在 Windows 11 上

用 otvdm 确实有种作弊的感觉,但我觉得它足够酷,值得写进这篇文章。

来源: blog.enlyth.com← 返回首页