Актуальная Windows 11 до сих пор использует фрагмент кода Windows 95, вышедшей более 30 лет назад. Исправление совместимости под названием EmulateHeap предоставляет старым приложениям доступ к менеджеру памяти Windows 95. Этот механизм можно найти и в Windows 11 26 H2.

История совместимости старых программы в Windows началась с оригинальной SimCity. Игра Maxis работала в Windows 95 только благодаря коду, который корпорация написала специально для SimCity. Приложения запрашивают у Windows память во время работы и освобождают её после завершения. Если приложение продолжает обращаться к памяти после её освобождения, это баг, известный как use‑after‑free. Именно такой баг был в оригинальной версии SimCity для Windows 3.x.

В 2 000 году эту историю рассказал сооснователь Stack Overflow и бывший инженер Microsoft Джоэл Спольски, ссылаясь на Джона Росса, создавшего ту версию SimCity. Последний случайно допустил ошибку, из‑за которой игра считывала память, которую сама же только что освободила. В Windows 3.x игра работала нормально, поскольку память после освобождения никуда не исчезала, объяснил Спольски.
Когда SimCity перестала работать в бета‑версиях Windows 95, Microsoft добавила специальный код, который искал запущенную SimCity. Если операционная система находила игру, менеджер памяти переходил в особый режим и не освобождал память сразу. Microsoft пошла на этот шаг, не дожидаясь исправленной версии градостроительного симулятора.
Обходное решение для SimCity было единичным случаем, но другие старые приложения также имели похожие зависимости. В 2 010 году инженер Microsoft Рэймонд Чен объяснил, что некоторые программы использовали особенности работы кучи в Windows. Например, приложения обращались к освобождённой памяти, рассчитывая, что прежние значения сохранятся.
Однако в более поздних версиях Windows такие приложения стали аварийно завершаться, поскольку там память управляется иначе.
Решением стал EmulateHeap — механизм совместимости, который перенаправляет вызовы API для работы с кучей, в том числе HeapCreate, LocalLock и GlobalReAlloc, на альтернативные реализации, воспроизводящие поведение Windows 95. Microsoft просто взяла копию исходного кода Windows 95 Heap Manager, перекомпилировала его и добавила в инфраструктуру совместимости, рассказал Чен.
По словам Чена, старый код загружается с жёсткого диска только тогда, когда EmulateHeap включён для конкретного приложения. При этом ПК не запускает Windows 95 в фоновом режиме.
EmulateHeap можно найти в утилите Compatibility Administrator, которая перечисляет исправления совместимости, входящие в состав Windows. Microsoft описывает исправление совместимости как «небольшой фрагмент кода, который перехватывает вызовы API из приложений». Compatibility Administrator входит в Windows Assessment and Deployment Kit (ADK).
Чтобы обнаружить EmulateHeap на своём ПК, нужно выполнить следующие шаги:
-
Загрузить Windows ADK с сайта Microsoft и запустить установщик.
-
Выбрать из списка компонентов только Application Compatibility Tools и завершить установку.
-
Найти в меню «Пуск» Compatibility Administrator и открыть 32-битную версию, поскольку большинство приложений эпохи Windows 95 имели такую архитектуру.
-
В разделе Custom Databases нужно кликнуть правой кнопкой мыши по New Database, а затем выбрать Create New > Compatibility Mode.
-
Прокрутить список доступных исправлений совместимости до EmulateHeap.




После выхода Windows 11 22 H2 пользователи сообщали, что в GTA: Vice City пропал звук, а Need for Speed: Most Wanted вылетала при включённом EmulateHeap.
Источник: habr.com