【CNMO科技消息】如今在Windows 11里,仍然能找到一段可以正常工作的Windows 95内核代码。它的名字叫EmulateHeap,是一项兼容性修复:当某些老程序依赖Windows 95那套宽容的内存管理方式时,系统就会把Windows 95的堆管理器调出来给它们用。在搭载Windows 11 26H2的电脑上,这项修复至今仍在。

Windows
这个传统的起点是一款游戏。《模拟城市》当年能在Windows 95上运行,是因为微软专门为它写了代码。程序在运行时会向系统申请内存,用完之后再释放。如果一块内存被释放之后仍被读取,就属于“释放后读取”的错误,而Windows 3.x版的《模拟城市》恰好带着这样一个缺陷。
Stack Overflow联合创始人、前微软工程师乔尔·斯波尔斯基在2000年的一篇文章里讲过这段往事,并引用了该版本的作者乔恩·罗斯的说法。罗斯承认自己不小心留下了一个缺陷,游戏会“读取他刚刚释放的内存”。斯波尔斯基解释了为什么当时没人察觉:“它在Windows 3.x上运行得很好,因为那块内存从来没有被挪走。”
到了Windows 95的测试版,《模拟城市》崩溃了。微软没有等游戏方打补丁,而是直接在系统里加了代码去识别这款游戏。按斯波尔斯基的描述,只要发现《模拟城市》在运行,内存分配器就会进入一种特殊模式,不立即释放内存。为了掩盖一款游戏的缺陷,微软改动了自己的操作系统。
这次临时处理本来是一次性的,但其他程序也做了类似的假设。微软工程师雷蒙德·陈在2010年的专栏中解释,有些程序利用了Windows 95堆的特性,比如读取已释放的内存并指望旧值仍在那里,这些程序在内存管理方式不同的后续版本上就会崩溃。解决办法就是EmulateHeap,它把应用的堆调用,从HeapCreate到LocalLock再到GlobalReAlloc,全都重定向到模仿Windows 95行为的替代实现。
雷蒙德·陈称这套方案“极其简单”,但“完全疯狂”,更疯狂的是它的构建方式:微软直接拿了一份Windows 95堆管理器的源代码,重新编译后塞进兼容性基础设施。用他的话说,Windows应用程序兼容框架里躺着一大块Windows 95内核的副本。不过他补充说,这段旧代码只有在为某个应用启用EmulateHeap时才会从硬盘加载,电脑并不会在后台偷偷跑着Windows 95。
需要说明的是,EmulateHeap并不是当年为《模拟城市》写的那段代码,两者同源于Windows XP那份隐藏的应用修复数据库,但属于不同的修复。

Windows
想亲眼看到它并不难。兼容性管理员是微软面向IT管理员提供的免费工具,随Windows ADK分发,2026年9月的版本已正式支持26H2。装好应用程序兼容性工具后,打开32位版本的兼容性管理员,在自定义数据库里新建一个兼容性模式,就能在列表中滚动到EmulateHeap。
当然,出现在列表里不等于一定管用。Windows 11 22H2更新之后,就有用户报告《侠盗猎车手:罪恶都市》在启用该修复后失去声音,《极品飞车:最高通缉》则直接崩溃。
颇具意味的是,微软正在用WinUI 3替换Windows 95时代的“属性”对话框,却仍为一小批老程序留着当年的堆管理器;这份耐心没有延伸到3D弹球,它因为一个64位缺陷被移除,团队不愿为此搭上几天时间。


