最新的Win11里,居然塞着31年前的Win95

最新的Win11里,居然塞着31年前的Win95

Windows 11Windows 95操作系统向后兼容软件工程

数据源:HN + web research

2026 年 10 月,外媒 Windows Latest 证实了一件荒诞的事。在最新的 Windows 11 26H2 系统里,依然躺着一份 1995 年的 Windows 95 内存管理代码。这份古董代码没有被清理,反而被微软重新编译后塞进兼容层。它的唯一使命,是伺候三十年前写错内存逻辑的老程序。

向后兼容在微软这里变成了一份永久固化的源码副本。微软把旧模块原样封入现代系统,将当年的程序漏洞升格为永久契约。今天每一台运行 Windows 11 的电脑,都在替三十年前的商业妥协买单。

翻开Windows 11工具箱,赫然躺着Win95老代码

想要在最新的 Windows 11 26H2 里找到这块活化石,并不需要高深技术。用户只需安装微软官方的 Windows ADK 工具包,勾选「应用程序兼容性工具」,再启动 32 位的兼容性管理器。在庞大的系统修复列表里,一个名为 EmulateHeap 的选项赫然在列。

Compatibility Administrator 兼容性修复列表中的 EmulateHeap 图:Windows 11 兼容性管理工具中的 EmulateHeap 修复选项。来源:Windows Latest

EmulateHeap 的作用直接而粗暴。一旦对某个老旧软件启用该选项,系统就会强行接管软件的堆内存调用。从内存创建函数 HeapCreate,到内存锁定函数 LocalLock 与重新分配函数 GlobalReAlloc,所有指令都被重定向至一套特殊实现。这套实现的运行规律,与 1995 年发布的 Windows 95 保持一致。

微软没有采用现代算法去模拟旧系统的运行特征。根据微软资深工程师 Raymond Chen 披露的档案,团队直接调出 Windows 95 堆管理器的原始源码,重新编译后塞入兼容模块。微软放弃了繁复的行为模拟,选择用原装旧代码直接阻断未知的不兼容风险。这批 31 年前的机器指令,就此获得了长期合法的户口。

为保住一款《模拟城市》,微软替游戏开发者擦屁股

这套看似荒诞的补丁方案,起源于三十年前的一场商业博弈。1995 年微软即将发布 Windows 95。当时红极一时的《模拟城市》(SimCity)PC 版,在测试机上频繁闪退。一旦新系统无法运行主力游戏,用户只会认定是操作系统出了故障。

SimCity 2000 Special Edition for Windows 95 图:当年风靡全球的模拟经营游戏《模拟城市2000》。来源:Nap’n’Retrogaming

微软工程师排查后发现,崩溃的责任全在游戏自己。《模拟城市》的开发者 Jon Ross 后来公开承认,程序中存在经典的「释放后读取」(use-after-free)错误。游戏在向操作系统释放了某段内存后,依然试图读取里面的旧数据。

在 Windows 3.x 时代,这个严重漏洞被糟糕的内存设计掩盖了。当时的 16 位系统采用协同式多任务,应用释放内存后,系统并不会立刻清空或收回物理地址。旧数据继续留在原处,游戏侥幸正常运行。但 Windows 95 引入了抢占式多任务与 32 位堆管理器,内存一旦释放就会立刻被标记或覆盖,游戏瞬间崩溃。

前微软程序经理 Joel Spolsky 在 2000 年的一篇分析中揭开了真相。微软没有要求游戏开发商 Maxis 紧急推送补丁,而是在 Windows 95 内核的内存分配器中写了一段专属检测逻辑。一旦系统识别到运行中的程序是《模拟城市》,内存分配器就会切换到不立即回收内存的特殊模式。操作系统为了商业软件的平稳过渡,主动接管了第三方的代码漏洞。

把严重漏洞变成系统契约,老补丁最终升格为源码副本

类似的代码隐患在当年比比皆是。九十年代中期,PC 软件市场迎来爆发式增长。大批仓促上阵的 32 位应用,带着各色奇葩缺陷涌入市场。很多程序员习惯了 Windows 95 宽松的环境,将「释放后仍能读取旧数据」当成了系统默认特性。

随着 Windows NT 架构全面取代 9x 产品线,微软引入了更为严格的企业级安全堆。这导致成百上千款老游戏和行业专用软件在新系统上批量夭折。微软不可能为每一款老软件在内核里单独写分支判断。在维护庞大软件生态与保持架构纯洁之间,工程团队做出了妥协。

Windows 95 代码在现代系统中的位置 图:Windows 95 堆管理代码在现代兼容层中的存活路径。来源:Windows Latest

他们从 Windows 95 的源代码树中完整抽取出堆管理组件,做成独立的兼容性修复插件 EmulateHeap。在安全领域,「释放后读取」属于容易引发任意代码执行的高危漏洞。但在桌面操作系统的商业现实面前,向下兼容压倒了系统架构的规范性。微软把当年留下的程序缺陷,直接固化为长期的系统契约。

微软一边用现代框架重写窗口,一边继续维护1995年老模块

这种对兼容性的执念,造就了强烈的工程反差。微软正全力重构系统外观。哪怕是沿用至今的「属性」弹窗,也被换上了现代化的 WinUI 3 框架。为了消除内存隐患,微软还在 Windows 内核中积极引入 Rust 语言。

外表光鲜的现代框架背后,底层的历史包袱却被原汁原味地保留下来。即便到了 2026 年的 26H2 版本,微软依然要动用现代编译工具链,给 31 年前的 Windows 95 堆管理器代码做编译、随镜像分发。相比之下,曾经备受用户喜爱的 Windows 自带三维弹球(3D Pinball)却在当年直接被砍掉。

当年 64 位系统放弃三维弹球的理由很直接。该游戏的碰撞检测代码全部由 32 位汇编写成,缺乏浮点数逻辑文档。移植到 64 位平台时,小球会直接穿过挡板。排查代码需要数天时间,微软便果断将其除名。微软对老代码的宽容有清晰边界:娱乐程序随时能丢,但底层的兼容底座碰不得。

持续31年的无限妥协,现代系统终究要付出代价

微软守护了几十年的古董代码,在现代硬件上正在失去原本的神效。在 Windows 11 22H2 及更新的版本上,许多怀旧玩家发现 EmulateHeap 频频失效。当他们尝试用该选项启动经典的《侠盗猎车手:罪恶都市》或《极品飞车:最高通缉》时,游戏常常丢失背景音效,甚至直接报错退出。

原因在于现代 PC 早已脱离当年的物理假设。当今的计算机普遍采用多核处理器,拥有复杂的指令重排与内存隔离机制。Windows 95 的堆管理器是在单核平坦内存时代写成的,无法与现代驱动和多线程环境正常协作。

无限制的向下兼容铸就了 Windows 的商业壁垒,但也带来了巨大的技术阻力。每一次架构演进,微软都把历史包袱一同扛上车。三十年前写下的临时补丁,如今成了难以撼动的代码化石。当时代走得太远,无限讨好过去的承诺,最终变成了所有现代用户的沉重负担。

参考链接:

  • Windows Latest 报道:为什么 Windows 11 里依然藏着 Windows 95 内存管理器
  • Joel on Software 专栏:战略信件二之鸡与蛋的困境
  • 微软技术文档:Windows 兼容性专栏解读 EmulateHeap 机制