Windows 95 代码如何在 Windows 11 中延续至今 你可能不会惊讶地发现,Windows 11 中仍保留着一段可正常运行的 Windows 95 内核代码。一项名为 EmulateHeap 的兼容性修复会在旧应用依赖 Windows 95 宽松的内存管理机制时,为其启用 Windows 95 的内存管理器。如今,在 Windows 11 26H2 电脑上也能找到它。
这项传统可以追溯到模拟城市:微软专门为它编写了特殊代码,它才能在 Windows 95 上运行。
EmulateHeap 可启用 Windows 95 的堆管理器,至今仍随 Windows 11 26H2 一同提供。图片来源:Windows Latest应用运行时会向 Windows 申请内存,用完后再释放。如果内存释放后仍被读取,这就是一种称为“释放后使用”的错误。最初为 Windows 3.x 开发的模拟城市就存在这个问题。
Stack Overflow 联合创始人、前微软工程师 Joel Spolsky 在 2000 年的一篇文章中讲述了这段往事,并提到了该版本模拟城市的开发者 Jon Ross。Ross 承认自己不小心留下了一个错误,导致游戏“读取刚刚释放的内存”。Spolsky 则解释了为什么没人发现这个问题:“它在 Windows 3.x 上运行得很好,因为内存根本不会被挪走。”
适用于 Windows 95 的《模拟城市 2000》特别版。来源:Nap’n’Retrogaming模拟城市在 Windows 95 测试版上无法运行。微软没有等游戏推出修复补丁,而是直接在 Windows 95 中加入了检测模拟城市的代码。Spolsky 写道:“如果发现模拟城市正在运行,系统就会以一种特殊模式运行内存分配器,不会立即释放内存。”
没错,微软修改操作系统,只为掩盖一个游戏中的错误。
模拟城市的修复是一次性的,但其他应用也有类似的假设。微软工程师 Raymond Chen 在 2010 年的 Windows Confidential 专栏中解释说,一些程序利用了 Windows 95 堆管理器的特性,例如读取已释放的内存,并认为其中原有的值仍然存在。
遗憾的是,这些应用在后续版本的 Windows 上会崩溃,因为新版本的内存管理方式有所不同。
Windows 95 光盘。来源:Pinterest解决方案就是 EmulateHeap。它会将应用的堆调用“从 HeapCreate、LocalLock 到 GlobalReAlloc,以及其间的所有调用”重定向到模拟 Windows 95 行为的替代实现,从而解决问题。Chen 称它“极其简单”,却又“完全疯狂”。而更疯狂的是微软的实现方式:
“……他们只是复制了一份 Windows 95 堆管理器的源代码,重新编译,然后将它加入兼容性基础架构。”
用 Chen 的话说,“Windows 应用程序兼容性框架中,包含着一大块 Windows 95 内核代码的副本。”Chen 指出,只有为某个应用启用 EmulateHeap 时,系统才会从硬盘加载这段旧代码,因此你的电脑并没有在后台悄悄运行 Windows 95。
需要说明的是,EmulateHeap 并不是微软为模拟城市编写的那段代码。两者都源于微软对兼容性的执着,这种执着也催生了 Windows XP 中隐藏的应用修复数据库,但它们是彼此独立的修复方案。
你可以在兼容性管理员中查看 EmulateHeap。这是微软为 IT 管理员提供的一款免费工具,列出了 Windows 自带的兼容性修复。微软将兼容性修复(或称 shim)描述为“一小段用于拦截应用程序 API 调用的代码”。
兼容性管理员随 Windows Assessment and Deployment Kit (ADK) 一同提供。2026 年 9 月发布的版本正式支持 Windows 11 26H2。我按照以下步骤,在自己的 26H2 电脑上找到了 EmulateHeap:
在 Windows Assessment and Deployment Kit 中选择 Application Compatibility Tools。图片来源:Windows Latest
“开始”菜单中的 32 位版 Compatibility Administrator。图片来源:Windows Latest
创建新的 Compatibility Mode 数据库。图片来源:Windows Latest
Windows 11 26H2 上兼容性管理员的修复列表中的 EmulateHeap。图片来源:Windows Latest当然,列表中有某项修复,不代表它实际可用。Windows 11 22H2 更新后,用户报告称,启用 shim 后,《GTA:罪恶都市》等游戏会失去声音,《极品飞车:最高通缉》则会崩溃。
颇具讽刺意味的是,微软正用 WinUI 3 替换 Windows 95 时代的“属性”对话框,却仍为少数旧应用保留着 Windows 95 的堆管理器。微软并没有把这项工作扩展到 3D 弹球:由于团队无暇花几天时间处理一个 64 位错误,这款游戏最终被弃用。