原文 | Why Windows 11 still ships with Windows 95’s memory manager hidden inside it 编译 | Gemini 4 Argon
得知 Windows 11 至今仍保留着一部分可正常工作的 Windows 95 内核(kernel),你或许并不会感到惊讶。当老旧应用程序依赖 Windows 95 内存管理器那种“宽容”的特性时,一项名为 EmulateHeap 的兼容性修复程序就会为其提供该内存管理器,如今你依然可以在 Windows 11 26H2 PC 上找到它。
这一传统可以追溯到 SimCity(《模拟城市》),它之所以能在 Windows 95 上运行,仅仅是因为微软专门为其编写了特殊代码。
微软仅仅为了 SimCity 就改变了 Windows 95 管理内存的方式
应用程序在运行时会向 Windows 请求内存,并在使用完毕后将其释放。如果在释放后仍然读取该内存,就会触发一种被称为“释放后重用”的漏洞(bug),而原版面向 Windows 3.x 的 SimCity 就存在这样一个漏洞。
Stack Overflow 联合创始人兼前微软工程师 Joel Spolsky 在 2000 年的一篇文章中分享了这个故事,并引用了编写该版本 SimCity 的开发者 Jon Ross 的话。Ross 承认他无意中留下了一个漏洞,导致游戏会“读取他刚刚释放的内存”,而 Spolsky 解释了为什么没有人注意到这一点:“它在 Windows 3.x 上运行良好,因为那些内存根本没有被挪作他用。”
SimCity 在 Windows 95 测试版上无法正常运行,微软没有等待游戏打补丁,而是在 Windows 95 中添加了专门寻找 SimCity 的代码。Spolsky 写道:“如果系统发现 SimCity 正在运行,它就会以一种特殊模式运行内存分配器,不会立即释放内存。”
是的,微软仅仅为了掩盖一款游戏的漏洞,就修改了自己的操作系统。
微软重新编译了 Windows 95 的堆管理器以维持旧应用的运行
针对 SimCity 的变通方案只是一次性的,但其他应用程序也做出了类似的假设。微软工程师 Raymond Chen 在 2010 年的 Windows Confidential 专栏中解释道,一些程序利用了 Windows 95 堆的古怪特性,例如读取已释放的内存,并期望旧的数值仍然保留在那里。
对这些应用程序来说,不幸的是,由于后续版本的 Windows 采用了不同的内存管理方式,它们在这些系统上纷纷崩溃。
解决方案就是 EmulateHeap,它通过将应用程序的堆调用——“从 HeapCreate 到 LocalLock 再到 GlobalReAlloc 以及介于其间的所有调用”——重定向到模拟 Windows 95 的替代方案,从而修复了这个问题。Chen 将其描述为“极其简单”却又“完全疯狂”,而更疯狂的是微软构建它的方式:
“……他们直接拿了一份 Windows 95 堆管理器源代码的副本,将其重新编译,并添加到了兼容性基础设施中。”
用 Chen 的话来说,“在 Windows 应用程序兼容性框架内部,存有一大块 Windows 95 内核的副本。” Chen 指出,只有当为某个应用程序启用 EmulateHeap 时,这些旧代码才会从硬盘加载,因此你的 PC 并不会在后台悄悄运行 Windows 95。
需要明确的是,EmulateHeap 并不是微软当年为 SimCity 编写的代码。两者都源于 Windows XP 隐藏的应用修复数据库背后那种对兼容性的执着,但它们是各自独立的修复程序。
如何在 Windows 11 的 Compatibility Administrator 中找到 EmulateHeap
你可以在兼容性管理中看到 EmulateHeap,这是微软面向 IT 管理员提供的一款免费工具,其中列出了 Windows 自带的各项兼容性修复程序。微软将兼容性修复程序(或垫片,shim)描述为“一小段用于拦截来自应用程序的 API 调用的代码”。
Compatibility Administrator 随附于 Windows 评估和部署工具包(Windows Assessment and Deployment Kit,简称 ADK)中,其 2026 年 9 月发布的版本正式支持 Windows 11 26H2。我通过以下步骤在我的 26H2 PC 上找到了 EmulateHeap:
一、从微软下载 Windows ADK 并运行安装程序。
二、在功能列表中仅勾选 Application Compatibility Tools(应用程序兼容性工具)并完成安装。
三、在“开始”菜单中搜索 Compatibility Administrator 并打开 32 位(32-bit)版本,因为大多数 Windows 95 时代的应用程序都是 32 位的。
四、在 Custom Databases(自定义数据库)下,右键单击 New Database(新建数据库),然后选择 Create New(新建)> Compatibility Mode(兼容模式)。
五、滚动可用兼容性修复程序列表,找到 EmulateHeap。
当然,列出的修复程序并不等同于能正常工作的修复程序。在 Windows 11 22H2 更新之后,有用户报告称,启用该 shim 后,《侠盗猎车手:罪恶都市》等游戏会丢失声音,而 《极品飞车:最高通缉》则会发生崩溃。
具有讽刺意味的是,微软正在用 WinUI 3 替换 Windows 95 时代的“属性”对话框,同时却仍然为了少数老旧应用程序而保留着 Windows 95 的堆管理器。微软并没有仁慈到将这种精力延续到 3D Pinball(三维弹球)上,这款游戏因为一个 64 位漏洞而被放弃,因为开发团队无力花费数天时间去研究它。
热门跟贴