Как Windows XP сохраняла совместимость со старыми программами

Совместимость XP строилась на точечных исправлениях

4 мин.
Как Windows XP сохраняла совместимость со старыми программами

Windows XP получила репутацию системы, способной запускать почти любое старое приложение – от игр до корпоративных программ, созданных задолго до её выхода в 2001 году. И такая совместимость была не случайностью: Microsoft отдельно поддерживала скрытую базу проблемных приложений и применяла к ним индивидуальные патчи.

Если система распознавала конкретную программу, она могла изменить её взаимодействие с Windows только на время работы этого процесса. В частности, приложение могло получить сведения о более старой версии операционной системы или воспользоваться механизмом управления памятью, воспроизводившим поведение Windows 95.

База совместимости и «прослойки»

Microsoft называет этот механизм базой данных совместимости приложений – Application Compatibility Database. В Windows XP она хранилась в бинарных файлах с расширением .sdb; основной файл базы назывался Sysmain.sdb. По данным Microsoft, на момент выхода системы в неё входило около 200 исправлений.

При этом Windows XP не ограничивалась проверкой имени исполняемого файла. Система могла сопоставлять программу по размеру, контрольной сумме, версии и дате файла, а также учитывать другие файлы в каталоге приложения. Это позволяло применить исправление только на проблемную версию программы и не затронуть её обновлённый вариант.

После распознавания Windows применяла так называемые shim-исправления – небольшие программные прослойки между приложением и системным API. Они могли изменить параметры вызова, скорректировать ответ Windows или выполнить дополнительный код перед передачей запроса штатной функции системы.

Один из характерных примеров – Win98VersionLie. Некоторые программы отказывались запускаться, если не обнаруживали конкретную версию Windows. Такое исправление возвращало приложению сведения о Windows 98 независимо от фактически установленной системы. Иными словами, Windows XP намеренно сообщала устаревшему ПО неактуальную информацию, чтобы оно продолжило работать.

Инженер Microsoft Рэймонд Чен, много лет работавший над Windows, подчёркивал: подобный режим предназначен прежде всего для пользователей, а не для оправдания ошибок разработчиков. Если приложению для запуска требуется подмена версии ОС, корректнее было бы исправить его проверку системной версии.

Режимы совместимости при этом не были полноценными копиями прежних Windows. Каждый из них представлял набор исправлений и флагов. Например, режим Windows 95 в Windows XP объединял около 50 распространённых настроек совместимости.

Когда одной подмены версии было недостаточно

В отдельных случаях Microsoft заходила дальше, чем имитация номера версии ОС. Чен называл одним из наиболее примечательных исправление EmulateHeap: оно заменяло стандартный менеджер динамической памяти точной копией менеджера памяти Windows 95.

Динамическая память, или heap, используется программами для запроса и освобождения памяти у операционной системы. Некоторые старые приложения опирались на особенности реализации Windows 95 и работали некорректно в более новых системах. Вместо того чтобы лишать пользователей доступа к такому ПО, Windows XP могла предоставить конкретной программе привычный для неё механизм.

Практика точечных обходов проблем существовала в Microsoft и до Windows XP. Бывший разработчик компании Джоэл Спольски рассказывал, что SimCity обращалась к памяти после её освобождения. Поэтому в Windows 95 был предусмотрен особый режим распределения памяти для этой игры: она освобождалась не сразу, что предотвращало сбой.

У такого подхода была и обратная сторона. В заметке 2017 года Чен объяснял, что режим совместимости с Windows 2000 мог заставить приложение загружать DLL по правилам той версии системы – то есть без более безопасного механизма SafeDllSearchMode. Это делалось намеренно для программ, которые зависели от старого порядка поиска библиотек.

Чен описывал подобную стратегию как совместимость «ошибка к ошибке»: система воспроизводит даже нежелательное старое поведение, если без него критически важное приложение перестанет работать. При этом shim-исправления действуют внутри процесса и не меняют границы безопасности между программой и системой. Они также не способны устранить несовместимость драйверов уровня ядра.

Почему Microsoft не стала блокировать старое ПО

Причина была практической. В 2003 году Чен отмечал, что каждое несовместимое приложение становится ещё одним доводом против обновления Windows. Для компании достаточно одной незаменимой программы, чтобы миграция всей инфраструктуры оказалась слишком дорогой или вовсе невозможной.

Он предлагал представить ситуацию, в которой после перехода на Windows XP перестаёт работать корпоративный текстовый редактор. Если поставщик требует оплатить новую версию для каждого сотрудника, стоимость обновления операционной системы резко возрастает. Ещё сложнее ситуация, когда разработчик программы уже прекратил своё существование и поддержку ПО.

По воспоминаниям Чена, внутренние исследования команды установки Windows показывали, что почти у каждой организации находилось хотя бы одно приложение, без которого она не могла работать. Нередко это была внутренняя программа на Visual Basic, созданная сотрудником, давно покинувшим компанию.

Windows XP позволила вынести многие такие обходные решения из ключевых системных компонентов в DLL-файлы папки AppPatch. Это упрощало сопровождение ОС: исправления не «загрязняли» базовые файлы Windows. База продолжала пополняться и после выхода XP. Например, обновление совместимости за апрель 2011 года заменяло Sysmain.sdb в Windows XP с Service Pack 3 – почти через десять лет после релиза системы.

Стремление сохранить работоспособность старого ПО влияло и на другие решения Microsoft. В частности, 32-разрядные версии Windows ограничивали доступную память отметкой 4 ГБ, чтобы снизить риск сбоев из-за проблемных драйверов. Некоторые исторически сложившиеся особенности Windows, включая файловое «туннелирование», также сохранялись именно потому, что на них рассчитывали старые приложения.

Windows XP исполняется 25 лет в октябре 2026 года. Её образ «системы, запускающей всё» во многом сформировали именно незаметные механизмы совместимости. Для пользователя всё выглядело просто: достаточно было дважды щёлкнуть по ярлыку программы. Но за этим запуском могла стоять целая цепочка специальных условий, созданных Microsoft для давно не обновлявшегося ПО.

Источник