在 Windows 11 中,仍可找到一段有效運作的 Windows 95 內核代碼,名為 EmulateHeap。此項兼容性修復旨在解決某些老舊程序對 Windows 95 寬容內存管理方式的依賴,系統會調用 Windows 95 的堆管理器以供其使用。目前,這項修復在搭載 Windows 11 26H2 的電腦上仍然存在。
Windows 的傳統起點是一款遊戲。《模擬城市》能在 Windows 95 上運行,因為 Microsoft 特別為其編寫了代碼。程序在運行時會向系統申請內存,用完後再釋放。如果一塊內存被釋放後仍然被讀取,則屬於“釋放後讀取”的錯誤,而 Windows 3.x 版的《模擬城市》恰好存在此類缺陷。Stack Overflow 聯合創始人、前 Microsoft 工程師喬爾·斯波爾斯基在 2000 年的一篇文章中提到過這段往事,並引用了該版本的作者喬恩·羅斯的說法。
羅斯承認自己不小心留下了一個缺陷,遊戲會“讀取他剛剛釋放的內存”。斯波爾斯基解釋了當時為何沒有人察覺:“它在 Windows 3.x 上運行得很好,因為那塊內存從未被挪走。”
Microsoft 為《模擬城市》編寫的代碼影響了 Windows 95 的堆管理
隨著 Windows 95 的測試版推出,《模擬城市》卻崩潰了。Microsoft 並未等待遊戲方發佈補丁,而是直接在系統中增添代碼以識別該遊戲。根據斯波爾斯基的描述,只要發現《模擬城市》在運行,內存分配器便會進入一種特殊模式,不會立即釋放內存。為了掩蓋一款遊戲的缺陷,Microsoft 改動了自己的作業系統。這次臨時處理原本是一次性的,但其他程序也基於類似假設。Microsoft 工程師雷蒙德·陳在 2010 年的專欄中解釋,有些程序利用了 Windows 95 堆的特性,例如讀取已釋放的內存並期望舊值仍然存在,這些程序在內存管理方式不同的後續版本上將會崩潰。
解決此問題的辦法就是 EmulateHeap,它將應用的堆調用從 HeapCreate 到 LocalLock 再到 GlobalReAlloc,全都重定向到模仿 Windows 95 行為的替代實現。雷蒙德·陳稱這套方案“極其簡單”,但“完全瘋狂”,更瘋狂的是它的構建方式:Microsoft 直接使用了 Windows 95 堆管理器的源代碼,重新編譯後塞進兼容性基礎設施。用他自己的話說,Windows 應用程序兼容框架中存放著一大塊 Windows 95 內核的副本。
不過他補充道,這段舊代碼僅在為某個應用啟用 EmulateHeap 時才會從硬碟加載,電腦並不會在背景中偷偷運行 Windows 95。
需要指出的是,EmulateHeap 並非當年為《模擬城市》編寫的代碼,兩者都源自 Windows XP 那份隱藏的應用修復資料庫,但屬於不同的修復。用戶可以輕易地找到這項功能。兼容性管理器是 Microsoft 為 IT 管理員提供的免費工具,隨 Windows ADK 分發,2026 年 9 月的版本已正式支持 26H2。安裝應用程序兼容性工具後,打開 32 位版本的兼容性管理器,在自定義資料庫裡新建一個兼容性模式,便能在列表中找到 EmulateHeap。
不過,出現在列表中並不意味著一定有效。自 Windows 11 22H2 更新以來,有用戶報告《俠盜獵車手:罪惡都市》在啟用該修復後失去了聲音,而《極品飛車:最 Qualcomm 緝》則直接崩潰。值得注意的是,Microsoft 正在用 WinUI 3 替換 Windows 95 時代的“屬性”對話框,但仍為一小部分老程序保留當年的堆管理器;這份耐心並未延伸至 3D 彈球,因為一個 64 位缺陷,該遊戲已被移除,團隊不願為此耗費幾天時間。

