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

Раньше я как-то не задумывался, что обеспечение совместимости новой версии операционной системы с существующими приложениями - сложная задача. Пока не столкнулся сам. Теперь, совсем немного поварившись в этом котле, я начал ближе к сердцу принимать истории, вроде тех, что рассказывает 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 на персональных компьютерах.

comments powered by Disqus