原文 | 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 位漏洞而被放弃,因为开发团队无力花费数天时间去研究它。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.