21CTO 导读:Windows XP 那传奇般的兼容性能力,本质上源于微软对旧应用程序的“欺骗”。
Windows XP之所以能流畅运行旧式软件,部分原因是它内置了一个隐藏的问题应用程序数据库。当Windows检测到某个问题应用程序时,它可以向该应用程序谎报Windows的版本,甚至可以为该程序启用旧的Windows 95内存管理器,仅针对该程序进行优化。
如果你当年也用过 Windows XP,可能仍旧很喜欢它,原因很简单:它几乎可以运行你交给它的任何应用程序,包括游戏和在 2001 年发布之前编写的商业软件。很多这类应用程序都没有针对 XP 进行更新,但它们仍然能够流畅运行!
微软工程师Raymond Chen在 Windows 系统部门工作了 30 多年,他在 2003 年的一篇博文中写道,XP 系统将其兼容性修复列表保存在 C:\WINDOWS\AppPatch 文件夹中,并以二进制格式保存,“以便快速扫描”。
真正让我百思不得其解的是Windows在找到匹配项后所做的事情。它竟然能改变Windows针对该应用程序的运行方式,而且只在该应用程序运行时生效。这听起来像是人工智能会做的事情,但当然,这是25年前的事了,那时一切都完全依赖的是人类智慧。
微软将此列表称为应用程序兼容性数据库。它是一个带有.sdb扩展名的索引二进制文件。在 XP 系统中,主数据库是Sysmain.sdb,微软表示,该操作系统发布时大约有 200 多个兼容性修复程序。
对于应用程序软件,Windows 不仅仅查看其 .exe 文件名。XP 会使用文件大小、校验和、版本和日期来匹配应用程序,甚至可以检查应用程序文件夹中的其他文件,因此修复程序可以针对程序的某个版本处理,而不会影响运行良好的较新版本。
一旦 Windows 找到匹配项,它就会应用微软所谓的“垫片”(shims)。当应用程序调用 Windows API 时,Windows 会先将该调用路由到一个小型存根函数,该函数可以调整应用程序发送的内容、更改 Windows 返回的值,或者在调用正确的 Windows 函数之前运行自己的代码。
例如,有些应用程序只有在检测到特定的 Windows 版本时才会拒绝运行。像Win98VersionLie这样的插件可以解决这个问题,无论电脑上运行的是哪个版本的 Windows,它都会向应用程序返回 Windows 98 的版本信息。
是的,Windows 对应用程序撒了谎,而应用程序对此却毫不知情。
说到这里,兼容模式并不是旧版 Windows 的迷你版本。每个兼容模式都是一系列补丁和标志的集合, XP 上的Windows 95 模式包含了大约 50 个最常见的修复程序。
伪造版本号是一回事,但Chen最喜欢的垫片是EmulateHeap,用他的话说,它“用 Windows 95 堆管理器的精确副本替换了标准堆”。
堆是程序从 Windows 借用内存的方式,有些老应用程序编写得过于依赖 Windows 95 的处理方式,因此在新版本的软件(如 XP)上运行就会崩溃。
因此,Windows 没有告诉用户该应用编写得很糟糕,而是给该应用程序配备了它从小就使用的内存管理器。
早在Windows XP 之前,微软就一直在做类似的事情。微软前程序员 Joel Spolsky曾写道,《模拟城市》会读取它刚刚释放的内存,因此 Windows 95 附带的代码会查找《模拟城市》,并以一种特殊模式运行内存分配器,该模式不会立即释放内存。
另一方面是安全性。
Chen 在2017 年的一篇文章中解释道,Windows 2000 兼容模式会让程序使用 Windows 2000 的规则加载 DLL 文件,而这些规则早于更安全的SafeDllSearchMode设置。微软这样做是故意针对那些依赖于这些规则的应用程序。
陈称之为“漏洞对漏洞的兼容性”,并指出,一个超过十五年都没有修复其应用程序的供应商现在也不会修复它。
然而,垫片并非万能。Chen表示,垫片只能在应用程序自身的进程内工作,因此不会改变程序与系统其他部分之间的安全边界,而且对于不兼容的内核模式驱动程序也无济于事。
那么,为什么微软不直接屏蔽那些依赖未公开功能的应用程序呢?陈在2003年的帖子中说,每一个被屏蔽的应用程序“都会成为人们不升级到下一个Windows版本的理由”。
他写道:“只需要一个不兼容的程序就会毁掉一次升级。”
Chen让读者设身处地地想一想,如果你是一位IT经理,你公司的文字处理软件无法在XP系统上运行。供应商可能要价150美元才能买到2.0版本,用Chen的话来说,“恭喜你,升级到Windows XP的成本一下子翻了三倍。”而且这还是在供应商还在营业的前提情况下。
如果你也对如今几乎所有应用都变成订阅制感到不满,那么你也并不孤单!
总之,Chen还提到微软安装团队的一项调查,结果显示几乎每家公司都至少有一个“不可或缺”的程序(也就是公司离不开的应用程序),通常是一个内部开发的 Visual Basic 应用程序,而它的开发人员已经离职。你会为了升级整个办公室的系统而放弃公司赖以运转的唯一应用程序吗?当然不会,而且在我看来,微软比任何人都清楚这一点。
XP 还为微软提供了一种更简洁的方式来管理这些补丁。据 Chen 称,许多兼容性修复程序被移到了 AppPatch 文件夹中的 DLL 文件中,因此“这些兼容性变通方案不再会污染核心操作系统文件”。
多年来,微软也一直在为 XP 系统提供新的修复程序。例如,在 XP 发布近十年后,微软于2011 年 4 月发布的应用程序兼容性更新,将 XP SP3 中的Sysmain.sdb 文件替换为一个 1,206,508 字节(约 1.2MB)的新版本。
兼容性也影响了XP系统的其他一些决策。例如,在XP SP2中,微软将32位Windows系统的内存上限设为4GB,以避免因驱动程序缺陷导致的崩溃。此外,由于旧软件需要,Windows系统仍然保留了一些诸如文件系统隧道之类的特性。
Windows XP在本月晚些时候将迎来25周年纪念日,人们至今仍将Bliss壁纸奉为国宝。讽刺的是,当年让XP声名鹊起的某些应用程序编写得十分糟糕,有些甚至只是错误地只检查了版本号。
从用户的角度看,这些机制是内部技术。系统更新完后,还是像以前一样双击程序。程序能打开,便万事大吉。至于 Windows XP在背后到底做了多少兼容性处理,普通用户通常根本不知晓。
本文为我们找到了Windows XP当年之所以受到欢迎的关键所在。
作者:场长
来源:
https://www.windowslatest.com/2026/10/02/windows-xp-had-a-hidden-database-of-broken-apps-and-microsoft-used-it-to-trick-them-into-working/
本篇文章为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。