第 1103 期:微软解释为什么 Windows XP 能运行几乎所有老旧软件

第 1103 期:微软解释为什么 Windows XP 能运行几乎所有老旧软件

作者:BlogUpdater |  时间:2026-10-02 |  浏览:28 |  评论已关闭 条评论

Windows XP 之所以能运行老软件那么好,部分原因是,它附带了一个隐藏的有问题应用程序数据库。当 Windows 发现其中一个应用时,它可以对该应用隐瞒 Windows 版本,甚至把旧的 Windows 95 内存管理器交给它,仅用于那个程序。

如果您当年用过 Windows XP,您可能因为唯一的理由是:这个系统能运行几乎所有老旧的应用程序,包括在 2001 年发布之前几年写的游戏和办公软件。很多这些应用都没为 XP 系统进行适配,但照样能运行!

微软工程师资深 Raymond Chen 在 2003 年写道,他在 Windows 工作了超过 30 年,当时,Windows XP 会将其兼容性修复列表保存在 C:\WINDOWS\AppPatch 文件夹中,以二进制格式存储,“以便快速扫描”。

让我觉得不可思议的是,Windows 在找到匹配后会做什么。它只针对那个应用程序修改 Windows 的行为,而且只在应用程序运行时生效。这听起来像 AI 会做的事,但当然,那可是 25 年前,一切都是纯”人工”智能。

Windows XP 可以识别一个应用,并为它单独修改 Windows 特性

微软称这个列表为应用兼容性数据库,这是一个带有 .sdb 扩展名的索引二进制文件。在 XP 上,主数据库是 Sysmain.sdb,微软表示,刚发布操作系统时,大约有 200 个兼容性修复。

对于应用软件,Windows 不仅仅看它的 .exe 名称。XP 通过文件大小、校验和、版本和日期匹配应用,甚至可以检查应用文件夹中的其他文件,这样一个修复就可以针对某个版本的软件,而不会影响新版本,后者可能已经可以正常运行。

一旦 Windows 找到匹配,就会应用微软所谓的 “shims(用于兼容的中间层)”。当应用调用 Windows API 时,Windows 会先通过一个小的存根函数(stub function),这个函数可以修改应用发送的数据、改变 Windows 返回的数据,或者在调用正确的 Windows 函数前执行自己的代码。

举个例子,一些应用程序只有在看到特定的 Windows 版本时才会运行。像 Win98VersionLie 这样的中间层就可以解决这个问题,不管电脑上运行的是哪个 Windows,它都会返回 Windows 98 的版本信息给应用。

是的,Windows 当时是在欺骗应用程序,而应用对此却毫不知情。

Raymond Chen 并不是很喜欢开发者依赖这个。在 2010 年的一篇文章里,他表示,如果一个程序只有在应用了 VersionLie 之后才能运行,那么开发者应该修复版本检查,因为兼容模式 “是为客户准备的,而不是为了程序本身。”

说到这个,兼容模式并不是旧版 Windows 的小型版本。每个模式都是一组修补和标志,XP 上的 Windows 95 模式包含了大约 50 个最常用的修复。

微软远不止是对 Windows 版本撒谎

伪造版本号是一回事,但 Raymond Chen 最喜欢的修复是 EmulateHeap(堆内存模拟),用他的话说,“它用 Windows 95 的堆管理器的完整副本替换了标准堆。”

堆是程序向 Windows 借用内存的方式,一些旧程序写得太依赖 Windows 95 的处理方式,所以,在软件的新版本(比如 XP 系统)上就会出问题。

所以,Windows 没有告诉用户这个应用程序写得很糟,而是给那个应用程序提供了它习惯的内存管理器。

微软早在 XP 之前就这样做了。前微软程序员 Joel Spolsky 曾写道,SimCity 会读取刚释放的内存,所以,Windows 95 发布时附带了代码,专门检测 SimCity 并以一种特殊模式运行内存分配器,不会立即释放内存。

另一方面是安全性。在 2017 年的一篇文章中,Raymond Chen 解释说,Windows 2000 兼容模式让程序按照 Windows 2000 的规则加载 DLL,而这些规则早于更安全的 SafeDllSearchMode 设置,微软是为了依赖这些规则的应用程序故意这样做的。

Raymond Chen 称其为 “漏洞对漏洞的兼容性”,并指出:一个十多年都没修复程序的软件厂商,现在也不会修复。

不过,修复程序也有局限。Raymond Chen 说,它们只在应用程序自身的进程内生效,因此,不会改变程序与系统其他部分之间的安全边界,也无法解决不兼容的内核模式驱动问题。

微软可承担不起让一个损坏的应用程序毁掉 Windows 升级的风险

那么,微软为什么不直接屏蔽这些使用了未文档化 API 的应用程序呢?在 2003 年的文章中,Raymond Chen 说,每一个被屏蔽的应用程序 “都是人们不升级到下一版 Windows 的另一个理由”。

“只要有一个不兼容的程序,就足以让升级变得糟糕”,他写道。

Raymond Chen 让读者想象一下,作为一名 IT 经理,如果公司的文字处理软件在 XP 上无法使用会怎样。供应商可能会想每份 2.0 版本收取 150 美元,用 Raymond Chen 的话说,“恭喜,升级到 Windows XP 的成本刚刚翻了三倍”,而且这还是在供应商还在营业的前提下。

您可能在想,为什么现在几乎每个应用都改成订阅制,我想说的是,确实如此!

无论如何,Raymond Chen 还回忆起微软产品安装团队的一项调查,几乎每家公司至少都有一个 “关键应用”(也就是公司离开它就无法运行的应用),通常是一个内部开发的 Visual Basic 应用,而开发者已经离职。您会为了升级整个办公室到 XP 而失去企业赖以运行的那个应用吗?当然不会,我认为微软比任何人都清楚这一点。

XP 也给微软提供了一种更干净的方式来管理这些修复程序。据 Raymond Chen 说,很多兼容性修复被移到 AppPatch 文件夹中的 DLL 中,所以 “兼容性解决方案不再污染核心操作系统文件”。

微软也持续多年为 XP 提供新的修复程序。2011 年 4 月,XP SP3 的应用兼容性更新中,将 Sysmain.sdb 替换为一个 1,206,508 字节(大约 1.2MB)的版本,这几乎是在 XP 发布近十年之后。

兼容性也影响了 XP 的其他决策。比如在 XP SP2 中,微软将 32 位 Windows 的最大内存限制在 4 GB 内存,以避免因为驱动程序错误导致的崩溃,而且 Windows 仍保留一些奇怪的特性,比如文件系统隧道,因为旧软件还依赖这些特性。

Windows XP 本月晚些时候就满 25 岁了,人们仍然把该系统经典的蓝天白云壁纸(Bliss)当作国宝般庆祝。有讽刺意味的是,XP 赢得声誉的一些应用本身写得很烂,还有一些应用根本只是在检测错误的版本号。

当然,我们根本不需要了解这些背后的复杂原理。我们双击程序,它就正常打开了。

所以,下次有人评论说,XP 系统写得这么好,以至于能运行所有东西的时候,您就会知道它背后的真实故事了。

另外值得一提的是,如果您是一位高效能人士,拓扑梅尔智慧办公平台最近也更新到了最新的 6.0 版本,带来了诸如文件管理,个人工作台,文件秒搜,远程协助,音视频通话等功能,可以帮助您进一步提升日常工作效率。

您会怀念那个夏天的美好时光和那个简单好用的 Windows XP 系统吗?

本文来自:Microsoft explains why Windows XP ran almost everything, and it lied to apps

标签:

评论已关闭。