为什么 Windows 11 仍然内置着 Windows 95 的内存管理器

Hacker News Top 新闻

摘要

Windows 11 至今仍带有 EmulateHeap——一个兼容性垫片,其中包含重新编译的 Windows 95 堆管理器代码。它最初是为了绕过《模拟城市》中的一个释放后使用(use-after-free)漏洞而添加的,当时 Microsoft 选择修补操作系统,而不是修复游戏本身。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/10/21 21:23

# 为什么 Windows 11 仍然内嵌着 Windows 95 的内存管理器 来源:https://www.windowslatest.com/2026/10/19/why-windows-11-still-ships-with-windows-95s-memory-manager-hidden-inside-it/ Windows 95 的代码如何在 Windows 11 中存活下来(https://www.windowslatest.com/wp-content/uploads/2026/10/How-Windows-95-code-survives-inside-Windows-11.jpg)Windows 95 的代码如何在 Windows 11 中存活下来 你可能不会感到惊讶:Windows 11 至今仍携带一段可正常运行的 Windows 95 内核代码。一个名为**EmulateHeap**的兼容性修复,会在老应用依赖 Windows 95 那种"宽容"的内存管理行为时,为其提供 Windows 95 的内存管理器——今天你在一台运行 Windows 11 26H2 的电脑上就能找到它。 这一传统的源头是**SimCity**——它当年只能在 Windows 95 上运行,因为微软专门为它编写了特殊代码。 EmulateHeap——运行 Windows 95 堆管理器的修复——至今仍随 Windows 11 26H2 一同发布EmulateHeap——运行 Windows 95 堆管理器的修复——至今仍随 Windows 11 26H2 一同发布。图片来源:Windows Latest ## 微软*仅仅*为了 SimCity 就改了 Windows 95 的内存管理方式 应用在运行时会向 Windows 申请内存,用完后再释放。如果释放之后内存仍被读取,就构成一种被称为"释放后使用(use-after-free)"的 bug,而最初的 Windows 3.x 版 SimCity 就有这个问题。 **Joel Spolsky**——Stack Overflow 联合创始人、前微软工程师——在一篇 2000 年的文章(https://www.joelonsoftware.com/2000/05/24/strategy-letter-ii-chicken-and-egg-problems/)中讲述了这段往事。文中引用了该版本 SimCity 的开发者 Jon Ross 的说法:Ross 承认自己不小心留下了一个 bug,游戏*"读取了它刚刚释放的内存"*,而 Spolsky 解释了为什么没人察觉:*"它在 Windows 3.x 上运行得很好,因为内存根本没有离开原处。"* SIMCity 2000 Special Edition for Windows 95SIMCity 2000 Special Edition for Windows 95。来源:Nap'n'Retrogaming SimCity 在 Windows 95 测试版上崩溃了。微软没有等待游戏发布补丁,而是在 Windows 95 中加入了检测 SimCity 的代码。Spolsky 写道:*"如果发现 SimCity 正在运行,它就以一种特殊模式运行内存分配器,不会立即释放内存。"* 是的,微软修改了自己的操作系统,只为了掩盖一款游戏的 bug。 ## 微软重新编译了 Windows 95 的堆管理器,让老应用继续存活 SimCity 的处理只是一次性的权宜之计,但其他应用也做了类似假设。微软工程师 Raymond Chen 在 2010 年的 Windows Confidential 专栏(https://learn.microsoft.com/en-us/previous-versions/technet-magazine/ff625273(v=msdn.10))中解释道,某些程序依赖 Windows 95 堆的各种"怪癖",比如读取已释放的内存并期望旧值仍在原处。 不幸的是,这些应用在后续版本的 Windows 上会崩溃,因为新版 Windows 的内存管理方式已经不同了。 Windows 95 光盘Windows 95 光盘。来源:Pinterest 解决方案就是 EmulateHeap:它把应用的堆调用——*"从 HeapCreate 到 LocalLock、从 GlobalReAlloc 到它们之间的一切"*——重定向到模拟 Windows 95 行为的替代实现。Chen 形容它*"极其简单"*却又*"完全疯狂"*,而更疯狂的是微软构建它的方式: *"……他们只是复制了一份 Windows 95 Heap Manager 的源代码,重新编译,然后把它加入兼容性基础设施。"* 用 Chen 的话说,*"Windows 应用兼容性框架里藏着一份 Windows 95 内核重要组成部分的副本。"*Chen 还指出,这些旧代码只有在某个应用启用了 EmulateHeap 时才会从硬盘加载,所以你的电脑并不是在后台悄悄运行 Windows 95。 需要澄清的是,EmulateHeap 并不是微软为 SimCity 编写的那段代码。两者都源自那种兼容性执念——与 Windows XP 那个隐藏的应用修复数据库(https://www.windowslatest.com/2026/10/02/windows-xp-had-a-hidden-database-of-broken-apps-and-microsoft-used-it-to-trick-them-into-working/)一脉相承,但它们是两个独立的修复。 ## 如何在 Windows 11 的 Compatibility Administrator 中找到 EmulateHeap 你可以在**Compatibility Administrator**中看到 EmulateHeap——这是微软为 IT 管理员提供的免费工具,会列出 Windows 自带的兼容性修复。微软将兼容性修复(或称 shim)(https://learn.microsoft.com/en-us/windows/deployment/planning/creating-a-custom-compatibility-fix-in-compatibility-administrator)描述为*"一段拦截应用程序 API 调用的小型代码。"* Compatibility Administrator 随 Windows Assessment and Deployment Kit(ADK)(https://learn.microsoft.com/en-us/windows-hardware/get-started/adk-install/)一起提供,2026 年 9 月的版本正式支持 Windows 11 26H2。我按以下步骤在我的 26H2 电脑上找到了 EmulateHeap: 1. 从微软官网下载 Windows ADK(https://go.microsoft.com/fwlink/?linkid=2289980)并运行安装程序。 2. 在功能列表中仅勾选 Application Compatibility Tools,然后完成安装。在 Windows Assessment and Deployment kit 中选择 Application Compatibility Tools在 Windows Assessment and Deployment kit 中选择 Application Compatibility Tools。图片来源:Windows Latest 3. 在开始菜单中搜索 Compatibility Administrator 并打开 32 位版本,因为大多数 Windows 95 时代的应用都是 32 位的。开始菜单中的 Compatibility Administrator 32 位开始菜单中的 Compatibility Administrator 32 位。图片来源:Windows Latest 4. 在 Custom Databases 下,右键点击 New Database,然后选择 Create New > Compatibility Mode。创建一个新的 Compatibility Mode 数据库创建一个新的 Compatibility Mode 数据库。图片来源:Windows Latest 5. 在可用兼容性修复列表中滚动,找到 EmulateHeap。Windows 11 26H2 上 Compatibility Administrator 兼容性修复列表中的 EmulateHeapWindows 11 26H2 上 Compatibility Administrator 兼容性修复列表中的 EmulateHeap。图片来源:Windows Latest 当然,列出来不等于能用。Windows 11 22H2 更新之后,用户报告(https://learn.microsoft.com/en-us/answers/questions/4169648/emulateheap-compatibility-shim-broken-on-windows-1),启用该 shim 后,GTA Vice City 这类游戏会失去声音,而 Need for Speed: Most Wanted 则会崩溃。 颇具讽刺意味的是,微软正用 WinUI 3 替换 Windows 95 时代的属性对话框(https://www.windowslatest.com/2026/07/22/first-look-windows-11-is-replacing-windows-95-era-properties-dialog-now-with-dark-mode-and-winui/),却仍然为少数老应用保留着 Windows 95 的堆管理器。而微软并没有那么好心,把这份心思也用到 3D Pinball(https://www.windowslatest.com/2026/08/22/microsoft-explains-why-pinball-vanished-from-windows-we-couldnt-afford-to-spend-days-studying-the-code/)上——后者被移除是因为一个 64 位 bug,团队当时没有时间去花几天研究那段代码。

相似文章

微软修复Windows 11中占用存储空间的文件夹

The Verge

微软发布了Windows 11的可选更新(KB5095093),修复了一个Bug:CapabilityAccessManager.db-wal文件可能增长到占用数GB存储空间,部分用户报告称被占用了多达500GB空间。

为什么Windows娱乐包没有通过模拟器直接运行MS-DOS版本? 主要原因在于当时的软硬件环境与技术限制: 1. **性能与兼容性问题**:早期的Windows系统(如Windows 3.x)本身就是MS-DOS的图形界面扩展,其自身仍高度依赖DOS底层环境。若通过模拟器运行DOS版本游戏,会引入额外的性能开销,可能导致游戏在原本就有限的硬件上无法流畅运行。 2. **设计哲学差异**:Windows娱乐包的目标是为Windows平台提供**原生体验**。这些游戏(如《扫雷》《纸牌》)被重新设计为适配Windows图形界面、鼠标操作和多任务环境,而非简单移植DOS版本。这种原生化有助于推广Windows界面交互方式。 3. **技术架构限制**:当时的Windows并未内置完整的模拟器功能。虽然存在如`NTVDM`(在Windows NT内)等DOS兼容层,但Windows 3.x时代仍基于DOS内核,资源管理方式不同,直接集成模拟器并不现实。 4. **商业策略考量**:微软希望用户从DOS过渡到Windows,通过为Windows平台提供**独有内容**来增强系统吸引力。若仅模拟DOS游戏,可能反而削弱用户升级Windows的动力。 简言之,这是一次面向新时代操作系统的**主动设计选择**,而非技术上的偷懒。

The Old New Thing (Raymond Chen)

本文阐述了Windows娱乐包未采用模拟技术运行MS-DOS游戏的原因:受1990年代硬件限制,内存容量不足且缺乏虚拟化支持,导致该方案不切实际,用户体验极差。

关于滥用Windows窗口类额外字节的兼容性说明

The Old New Thing (Raymond Chen)

Raymond Chen 讨论了一个历史性的 Windows 兼容性问题,其中一些 16 位程序滥用窗口类额外字节来存储私有数据,以及微软如何在保持向后兼容性的同时,对 32 位和 64 位程序堵住了这个漏洞。