找回密码
立即注册
搜索
发回帖 发新帖

4862

积分

0

好友

624

主题
发表于 昨天 23:19 | 查看: 6| 回复: 0

用过 Windows XP 的人,大概都会记得它在软件兼容性上的表现:一些已经存在多年的老程序,装到 XP 上依然能够正常运行。XP 也因此给不少用户留下了“特别能跑老软件”的印象。

如今 Windows XP 早已退役多年,但这段历史背后还有一些鲜为人知的细节。据 Windows Latest 最近披露,XP 当年的软件兼容性之所以表现突出,除了操作系统本身具备较强的向后兼容能力之外,微软还在背后用了一个颇有意思的办法——有时候,会“骗”一下老程序。

Windows XP 经典 Bliss 壁纸——蓝天草地

Windows XP 里藏着一份“问题软件名单”

Windows Latest 称,早在 2003 年,微软工程师 Raymond Chen 就曾介绍过 Windows XP 的应用兼容性机制。当时,Raymond Chen 表示,Windows XP 会把相关的兼容性修复信息放在 C:\WINDOWS\AppPatch 目录下,并采用二进制格式存储,目的是让系统能够快速检索和匹配。

这套机制最特别的地方在于:系统找到某个有问题的软件之后,并不会修改整个 Windows 的行为,而是只针对当前这个程序进行调整。听上去有点像现在 AI 做的事情,但要知道,这是 25 年前的技术。它背后靠的是微软工程师一点点把各种软件的兼容性问题记录下来,再针对这些问题设计解决办法。

微软将这套机制称为 Application Compatibility Database(应用程序兼容性数据库),它本质上是一组后缀为 .sdb 的二进制数据库文件。Windows XP 使用的主数据库文件名为 Sysmain.sdb,采用的就是 .sdb 二进制格式。微软之所以用这种格式,就是为了让系统能够更快地扫描和查找匹配的软件。XP 发布时,这份数据库里大约已经包含 200 项兼容性修复。

这并不是一张简单的“黑名单”。Windows 识别软件时,并不会只看一个程序的 .exe 文件名,然后粗暴地判断“这个程序有问题”。Windows XP 可以结合文件名、文件大小、校验和、版本、日期等信息来识别程序,甚至还可以检查程序所在目录或子目录中有没有特定的关联文件。微软后来公开的技术文档也证实了这一机制:应用兼容性数据库会利用这些文件属性建立匹配条件,从而判断当前运行的程序,是不是数据库中记录的那个特定版本。

这么做有一个很实际的好处。假设某款软件的 1.0 版本无法在 XP 上运行,但 2.0 版本已经修好了,那么 Windows 可以只针对 1.0 版本启用兼容性修复,而不会把同样的处理套到已经正常工作的 2.0 版本上。也就是说,微软不是简单地说“这个软件有问题”,而是尽可能找到到底是哪个版本出了问题,然后只对它动手。

找到软件之后,Windows 会怎么处理?

真正有意思的地方,从这里才开始。Windows 找到数据库里的匹配项之后,会启用微软所说的 Shim,也就是应用程序兼容性垫片。

简单理解,Shim 就像夹在应用程序和 Windows API 之间的一层“小程序”。正常情况下,一个软件调用 Windows API,系统就直接处理。但如果这个软件存在兼容性问题,Windows 可以让这个 API 调用先经过 Shim。Shim 可以修改软件传进来的参数,也可以修改 Windows 返回给软件的结果,甚至可以在调用真正的系统函数之前先执行一段额外代码。

这样一来,软件本身不用修改,Windows 也不用为了兼容一个老程序而改变整个系统,只需要在这个程序运行的时候,对它的某些操作“做点特殊处理”就可以了。

如果老软件认不出 XP,微软就让它“认错”

外媒 Windows Latest 举了一个例子。当时,一些旧程序会先检查 Windows 的版本号,只有检测到特定版本才肯启动。而 Win98VersionLie 这类 Shim,就是专门处理这类问题的——电脑实际运行的可能是 Windows XP,但程序获取到的系统版本信息,却可以被修改成 Windows 98。

这对 Windows XP 来说并不是什么技术难题。因为有些软件其实并不是真的依赖 Windows 98,只是开发者当年在程序里写了一条简单的判断:如果操作系统不是指定版本,就直接退出。微软的处理办法也很直接,Windows XP 可以通过兼容性机制,修改这个程序获取到的 Windows 版本信息。也就是说,程序实际上运行在 XP 上,但当它询问“你是什么版本的 Windows”时,得到的答案却可以是 Windows 98。于是,原本因为“版本不对”而拒绝启动的软件,就有可能正常运行起来。

这种兼容性处理后来被称为 Win98VersionLie——“Lie”在这里就是“撒谎”的意思:Windows 并没有真的变成 Windows 98,只是针对这个特定程序,让它看到一个不同的版本号。

当然,这种办法解决的只是“版本检查”问题。如果软件真的依赖 Windows 98 特有的功能,那么单纯修改版本号并不能让它凭空获得这些功能。这个时候,光靠“骗一下”就不够了。Raymond Chen 后来谈到这一机制时也指出,从软件开发的角度来看,正确的做法其实是修改程序本身,不应该因为操作系统版本号发生变化,就直接拒绝运行。但对于已经存在的大量旧软件来说,微软当时显然不可能让用户一个个去找开发者重新升级。于是,这类兼容性处理就成了 Windows 帮老软件继续运行的一种办法。

微软做的远不止伪造系统版本号

如果只是修改一个版本号,似乎还不算太夸张,但 Windows XP 的兼容性机制远不止这一招。

Raymond Chen 提到过一个他比较喜欢的 Shim,名字叫 EmulateHeap。用他的话说,该功能“用一份完全复刻的 Windows 95 堆管理器替换系统默认堆管理器”。这里的 Heap,可以简单理解成程序向 Windows 申请和释放内存时使用的内存管理机制。

过去一些老程序写得并不规范,它们可能依赖了早期 Windows 内存管理器的某些具体行为。程序在 Windows 95 上能够正常工作,但操作系统升级以后,内存管理方式发生变化,程序就可能出现问题。遇到这种情况,Windows XP 没有简单地告诉用户“这个软件写得不好,无法运行”,而是可以专门给这个旧程序提供一套它熟悉的内存管理方式。

早在 XP 问世之前,微软就已经在使用这类方案。前微软程序员乔尔・斯波尔斯基曾经写道,《模拟城市》游戏会读取已经释放完毕的内存。为此,Windows 95 专门加入了特殊逻辑:识别到这个游戏后,内存分配器就进入特殊模式,不会立刻释放相关内存空间。换句话说,这时候 Windows 甚至会主动保留一个本来应该被修正掉的“旧行为”,只为了让特定的老软件继续正常工作。

但这套机制也带来了一些安全层面的隐患。Raymond Chen 在 2017 年的一篇文章中解释道,Windows 2000 兼容模式会让程序按照 Win2000 时代的旧规则加载动态链接库 DLL,而这套规则早于更安全的 SafeDllSearchMode 安全 DLL 搜索模式。微软刻意保留这套旧逻辑,同样是为了兼容那些依赖旧行为的软件。

Raymond Chen 把这种做法叫作逐 Bug 兼容。他的意思很简单:如果一个厂商十几年都没有更新、修复自家软件,那么到了操作系统升级的时候,这个厂商更不可能突然回来修改代码。对于微软来说,与其让这些软件彻底无法运行,不如在 Windows 这一侧把它们过去依赖的某些行为保留下来。

当然,垫片技术也不是万能的。它主要是在程序自身运行的过程中改变程序与 Windows 之间的交互,并不会突破程序与系统其他部分之间的安全隔离边界。同时,它也无法解决内核模式驱动程序本身存在的不兼容问题。

为什么微软愿意为这些“旧软件”费这么大劲?

谈及微软为什么这么做,原因其实也很现实。对于个人用户来说,一款软件无法运行,可能只是换一个软件的问题。但对于企业来说,情况完全不同。Raymond Chen 在 2003 年谈到 Windows XP 的兼容性时就提到,一个无法运行的关键软件,就可能成为企业升级 Windows 的“拦路虎”。

比如,一家企业准备从旧版本 Windows 升级到 XP,却发现自己每天都要使用的文字处理软件无法运行。如果软件厂商要求企业购买新版软件,那么原本只是一次 Windows 升级,现在还得额外购买软件许可证。更麻烦的是,有些企业软件根本没有所谓的“新版”。微软当年的调查发现,很多公司至少都有一个类似的“关键应用”,其中不少还是企业内部自己开发的 Visual Basic 程序,而最初开发这些程序的人可能已经离职。

这时候,让企业直接放弃软件并不现实。微软自己也很清楚这一点。Chen 当时给出的逻辑很直接:每多一个无法运行的软件,就多了一个用户不愿意升级 Windows 的理由。所以,与其让一个旧软件把整个 Windows 升级计划卡住,不如微软自己在系统里补上一层兼容性处理。

更值得注意的是,这份数据库并不是 Windows XP 发布时做完就不管了。微软后来一直在为 Windows 增加新的应用兼容性修复。2011 年 4 月,微软还发布过一次 Application Compatibility Update,其中就包括 Windows XP SP3。这次更新替换了 XP SP3 中的 Sysmain.sdb 文件。Windows Latest 根据微软当年的文件信息指出,这个版本的 Sysmain.sdb 大约有 1.2 MB,文件大小为 1,206,508 字节。此时距离 Windows XP 发布已经接近十年。也就是说,微软在 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/




上一篇:Commodore OS Vision评测:把Amiga灵魂装进Debian的1992年时光机
下一篇:职场晋升观察:领导想提拔你,暗地里会看这三个关键细节
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-10-5 00:59 , Processed in 0.069447 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表