Not a kernel guy

… in the Windows kernel team

Wednesday, January 17, 2007

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

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

Posted at 10:16 pm •

RSS feed | Trackback URI

11 Comments »

Comment by nobue — January 18, 2007 @ 2:58 am

Спасибо, очень интересно .)

 
Comment by TheBits — January 18, 2007 @ 4:05 am

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

Спасибо.

 
Comment by Sergey Fuflygin — January 18, 2007 @ 6:40 am

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

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

 
Comment by Not a kernel guy — January 18, 2007 @ 8:55 am

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

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

 
Comment by Neandertalets — January 30, 2007 @ 1:28 am

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

 
Comment by Not a kernel guy — January 30, 2007 @ 2:19 pm

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

 
Comment by Not a kernel guy — January 30, 2007 @ 3:17 pm

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

 
Comment by Neandertalets — January 31, 2007 @ 6:48 am

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

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

 
Comment by Not a kernel guy — January 31, 2007 @ 6:32 pm

> А вот вопрос (кстати, про совместимость ;): есть такая старая игрулина ГЭГ. Так она не работает под ХРюшей - только Вынь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 довольно поверхностны, было бы интересно почитать.

 
Comment by Not a kernel guy — January 31, 2007 @ 7:13 pm

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

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

 
Comment by Neandertalets — February 1, 2007 @ 5:46 am

Ответил в “Microsoft против…”

 

Your Comment (smaller | larger)

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Powered by WordPress