Обратная совместимость – это серьезно.

Раньше я как-то не задумывался, что обеспечение совместимости новой версии операционной системы с существующими приложениями – сложная задача. Пока не столкнулся сам. Теперь, совсем немного поварившись в этом котле, я начал ближе к сердцу принимать истории, вроде тех, что рассказывает Raymond Chen.

Перед выходом Windows Vista, как, впрочем, и перед выходом предыдущих версий системы, было протестировано огромное количество приложений на совместимость с новой версией ОС. Помимо ошибок в самой операционной системе была обнаружена масса проблем с самими приложениями: начиная от странностей при проверке версии системы и заканчивая грубыми ошибками в коде приложений, которые не проявлялись ранее только по чистой случайности. Например, одно из приложений делало проверку на наличие запрещённых символов в пути и в список запрещённых (по мнению приложения) символов входили круглые скобки. В результате, оно отказывалось работать в каталоге “Program Files (x86)”, где по умолчанию устанавливаются все 32-х битные приложения на 64-х битной системе.

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

Входит CreateProcess.

Функция CreateProcess стоит на переднем крае борьбы за совместимость. Как я уже говорил ранее, CreateProcess, помимо собственно запуска процесса, выполняет множество дополнительных задач. Так вот, во время создания процесса, CreateProcess проверяет, не входит ли запускаемое приложение в список “проблемных” приложений. Если это так, то в адресное пространство создаваемого процесса загружаются необходимые заплатки и лишь после выполнения “заплаточного” кода, управление передаётся приложению.

Как правило, заплатки перехватывают вызовы системных функций и имитируют поведение предыдущих версий системы. Самый простой пример – заплатка перехватывает вызовы функции GetVersion и GetVersionEx и возвращает Window XP SP2 в качестве версии системы. Для некоторых программ этого достаточно, чтобы привести их в чувство. Другие заплатки делают более сложные вещи: исправляют hard coded пути, корректно обрабатывают коды ошибок вроде ERROR_ACCESS_DENIED и т.д. Замечу, что хотя я использую слово “заплатки”, эти заплатки по большому счету не изменяют код приложения.

Список или вернее база “проблемных” приложений весьма обширна. В скомпилированном виде она занимает больше 2-х мегабайт в Windows XP SP2 и более 4-х мегабайт в Windows Vista (суммарный объем всех .sdb файлов в каталоге “%windir%\AppPatch”). В базе указываются все признаки, по которым распознается приложение: информация о версии, размер и контрольная сумма файла, имена сопутствующих файлов и т.п. Там же указывается список заплаток применяемых для каждого приложения.

Зачем это всё нужно? Об этом хорошо написал Joel Spolsky в статье How Microsoft Lost the API War. Благодаря этим усилиям на Windows до сих пор можно запустить очень старые приложения, которые будут работать, как ни в чем не бывало. Пользователи могут рассчитывать, что переход на новую версию системы с большой вероятностью не повлечет за собой проблем с совместимостью. В конечном итоге это, по видимому, один из факторов, который привел к доминированию Windows на персональных компьютерах.

11 thoughts on “Обратная совместимость – это серьезно.

  1. TheBits

    >> Другие заплатки делают более сложные вещи: исправляют hard coded пути…
    Что такое hard coded пути?

    Спасибо.

  2. Sergey Fuflygin

    >> >> Другие заплатки делают более сложные вещи: исправляют hard coded пути…
    >>Что такое hard coded пути?

    Когда в коде используются строки вида C:\Program Files или C:\Windows.

  3. Not a kernel guy Post author

    > Когда в коде используются строки вида C:\Program Files или C:\Windows.

    … вместо вызова функций GetSystemDirectory, SHGetFolderPath и тому подобных.

  4. Neandertalets

    А похожие описанным вами (и даже лучше) технологии реализованы как в OS/2, так и в *NIXах.
    Думаю, что НегроСофт занял лидерство не благодаря описанной Вами технологии, а благодаря http://www.iowaconsumercase.org/adi.html. Иначе за такое (взято с http://www.securitylab.ru/news/282973.php?PAGEN_1=15&el_id=282973#nav_start) только “в сортире мочить” (С) В.В.Путин:
    - за такую стабильность: http://daimyo.org/bsod/,
    - за склонность к BSOD при переносе непривязанной к железу системы на другое железо
    - за такие анекдотические баги: http://www.kuban.ru/forum_new/forum2/files/19124.html
    - за такие хотфиксы: http://blog.not-a-kernel-guy.com/wp-content/uploads/2007/01/gluk.jpg [Not a kernel guy: перенёс картинку на свой хостинг, так как slil.ru медленный до безобразия. Оригинальная ссылка: http://slil.ru/23600291],
    - за незакрытые и очень медленно закрываемые дыры: http://www.securitylab.ru/analytics/273275.php
    - за убогую сетевую и не только сетевую функциональность, отсутвие системы установки ПО из репозитариев наподобие APT/YAST/YUM,
    - за непрозрачность системы и потенциальное наличие множества тривиальных уязвимостей и ляпов ввиду закрытости кода, ненадежность и небезопасность ввиду сильной интеграции компонент(технология ActiveX это реализация поддержки широкого спектра удаленно эксплуатриуемых уязвимостей в ActiveX-компонентах), раздутость, костылизм и грязные хаки системы(тот же GDI в ring0 даже на серверной версии ОС, mediaplayer и paint на сервере…),
    - за политику подкупа: http://www.securitylab.ru/news/267589.php
    - за подковерную игру: http://www.computerra.ru/news/2004/3/12/45655/
    - за использование неконкурентных методов рыночной борьбы: http://palm.newsru.com/finance/04jul2006/microfine.html
    - за закрытые форматы и протоколы, с которыми невозможно обеспечить нормальную совместимость
    - за кипучую деятельность деятельность по игнорированию общепринятых стандартов и созданию и повсеместному проталкиванию своих собственных, чтобы держать рынок под контролем (OpenGL – DirectX, Java – Net и т.д., даже бедные BSD-сокеты “расширили” так, что без WSAStartup() они не работают),
    - за безопасность, способствующую бардаку в Интернете: http://www.viruslist.com/ru/viruses/encyclopedia?chapter=156771003&page=3
    - за нулевую ответственность при отнюдь ненулевой стоимости ПО,
    - за издевательства над _легальными_ пользователями(пираты используют самые навороченные корпоративные версии с VLK и горя не знают) в виде активации, требования покупать заново OEM систему при смене матплаты, требования переактивации в последней версии ОС, WGA, в виде ограничений на число подключений, числа запущенных программ и даже сознательного ухудшения параметров TCP/IP стека(ограничение на число исходящих пакетов с SYN и ограничения на RAW-сокеты – чтобы Windows-зомби несильно флудили, эдакое лечение следствия, а не причины),
    - за ресурсоемкость системы, требующей мощный ПК не для тяжелых приложений, а только для обслуживания самой ОС с рюшечками.

  5. Not a kernel guy Post author

    Neandertalets, я, пожалуй, напишу ответ отдельным постом.

  6. Not a kernel guy Post author

    Поправил битые ссылки в комментарии Neandertalets-а.

  7. Neandertalets

    Спасибо Not a kernel guy за корректировку ссылок. Когда я смотрел её в первый раз – все работали. Но… Спасибо.
    А вот вопрос (кстати, про совместимость ;): есть такая старая игрулина ГЭГ. Так она не работает под ХРюшей – только Вынь98. Как быть? Решение наподобие “пробирки” в ВМВаре я уже знаю (правда пока не пробовал).

    P.S. Предыдущее запостилось с ошибкой: заметил, что если ошибиться в ID для принятия поста, то текст сохранится, но урезанный (может есть ограничение?)

  8. Not a kernel guy Post author

    > А вот вопрос (кстати, про совместимость ;): есть такая старая игрулина ГЭГ. Так она не работает под ХРюшей – только Вынь98. Как быть? Решение наподобие “пробирки” в ВМВаре я уже знаю (правда пока не пробовал).

    Самое простое – воспользоваться Yandex’ом: http://www.nd.ru/users/updates/#gag:

    Для того, чтобы запустить ГЭГ на Windows XP, установите Service Pack для Windows XP. Затем, после установки игры ГЭГ в свойствах ярлыка запуска игры на вкладке “Совместимость” в разделе “Параметры экрана” установите опцию 256 цветов, нажмите OK. Запустите игру.

    Service Pack для Windows XP вы можете загрузить на сайте Microsoft здесь.

    Вы, кстати, так и не ответили на мой вопрос:

    А похожие описанным вами (и даже лучше) технологии реализованы как в OS/2, так и в *NIXах.

    Поскольку этот комментарий относится к статье про механизм заплаток в Windows, было бы очень интересно узнать, как аналогичный механизм реализован в OS/2 и *nix-ах. Мои знания *nix довольно поверхностны, было бы интересно почитать.

  9. Not a kernel guy Post author

    > Предыдущее запостилось с ошибкой: заметил, что если ошибиться в ID для принятия поста, то текст сохранится, но урезанный (может есть ограничение?)

    Странно, у меня не получается такое вопроизвести. Вполне возможно это какой-то баг в captcha.

Comments are closed.