Тайная кухня Windows 95: компания 30 лет тайно хакала свою систему ради совместимости. Но уже завтра миллионы ПК останутся без поддержки Обеспечить работу старых программ в новых версиях Windows — задача, которая преследует Microsoft с момента появления самой системы. Совместимость всегда была одним из главных условий её успеха: если привычное ПО перестаёт запускаться, пользователи не переходят на новую версию. Но путь к тому, чтобы старые приложения оставались работоспособными, был долгим и местами довольно странным. В эпоху Windows 3.1 всё выглядело гораздо проще. Система почти ничего не делала автоматически, и именно пользователь должен был объяснить Windows, какое приложение он запускает, если два файла имели одинаковое имя. Ветеран Microsoft Рэймонд Чен вспоминает классический пример: C:\MAIL\MAIL.EXE. Это могла быть Microsoft Mail, клиент от самой компании, а могла быть cc:Mail для MS-DOS. Система не умела угадывать, поэтому нужные сведения записывались вручную в файл APPS.INF, который подсказывал Windows, как работать с программой. По тем временам такой подход считался современным и удобным. С приходом Windows 95 ситуация изменилась радикально. Пользовательские ухищрения пришлось отложить: корпорация решила встроить в операционную систему полноценный механизм, подстраивающий поведение Windows под конкретные приложения. Появилась база данных совместимости, где для разных программ прописывались специальные флаги. Они могли менять реакцию системы на те или иные вызовы или особенности старого кода. В крайних случаях разработчики Windows даже выпускали автоматические «заплатки» для чужих программ — если обычными настройками проблему не решить. Такой подход был рискованным. Именно поэтому, как рассказывает Чен, команда Windows 95 всегда получала официальное письменное разрешение от разработчика программы, прежде чем вносить изменения в его исполняемый файл. Переписка включала подробное описание ошибки, точное объяснение предстоящего исправления и список затронутых версий. Взамен Microsoft просила поставщика ПО прислать эти версии для анализа и пообещать, что в следующем релизе проблема будет устранена на уровне исходного кода — ведь будущие версии Windows не обязаны содержать ту же заплатку. Возникал другой вопрос: как системе определить, для каких именно программ у неё есть встроенный патч? И здесь Windows 95 сделала шаг вперёд, отказавшись от ручной идентификации. Вместо того чтобы спрашивать пользователя, система начала определять приложения автоматически — по так называемым detection strings, специальным строкам обнаружения, хранившимся в реестре. Когда загружался 16-битный модуль, предназначенный для версии Windows ниже 4.0, ядро перебирало все такие строки и проверяло, не совпадает ли программа с одной из них. Эти строки не были простыми контрольными суммами. Каждая преобразовывалась в последовательность байтов. Первый байт определял алгоритм сравнения, который должен был использоваться дальше. На практике наиболее распространёнными были проверки по размеру файла — их проще и дешевле выполнять. Сравнение содержимого встречалось редко, потому что требовало дополнительного чтения с диска и занимало слишком много времени. Чен отмечает, что со временем для создания detection strings появилась отдельная утилита. Но ранние строки разработчики Windows писали вручную — байт за байтом, что делало процесс довольно трудоёмким. Если строка совпадала с конкретной программой, система переходила к следующему шагу: в соответствующих подразделах реестра хранилась информация о том, какие участки нужно изменить, а сами значения представляли собой бинарные данные, которые система должна была вписать в память загружаемого исполняемого файла. Так Windows накладывала необходимые исправления на лету. Названия исправлений значения не имели, но существовала определённая традиция. Если речь шла о добавлении данных, значение называли Add. Если меняли существующий участок — Change. Когда таких исправлений было несколько, им давали числовые суффиксы для различия: Add1, Add2, Change1, Change2 и так далее. Подобная гибкость помогла Windows сохранить совместимость с огромным количеством старых программ, что в конце 90-х и начале 2000-х стало одним из ключевых факторов доминирования системы на рынке. Пользователи могли переходить на новую версию, не опасаясь, что привычные корпоративные приложения перестанут работать. Чен предлагает задуматься, как инженеры эпохи Windows 95 отнеслись бы к сегодняшней ситуации: миллионы устройств окажутся вне поддержки после завершения жизненного цикла Windows 10, и никакой базы совместимости или точечных патчей для них уже не будет. Для тех, кто создавал сложнейшую систему обеспечения обратной совместимости 30 лет назад, такая перемена, вероятно, стала бы настоящей культурной революцией.