Pull to refresh

бAARDак в Windows

Development for Windows *
Неоднозначную реакцию вызвал рассказ Рэймонда Чена о том, сколько усилий прикладывает Microsoft, чтобы обеспечить совместимость новых версий Windows с чужими программами.

Известен и обратный случай: когда Microsoft намеренно добивалась несовместимости Windows с «неблагонадёжными» клонами MS-DOS. Из выпуска Dr. Dobb's Journal за сентябрь 1993 г.:

Код обнаружения AARD в Windows


Если вы участвовали в бета-тестировании Windows 3.1, и на вашем компьютере стояла DR-DOS, то наверняка вы сталкивались с этим необычным сообщением об ошибке:
Non-Fatal error detected: error #2726
Please contact Windows 3.1 beta support
Press ENTER to exit or C to continue

Хотя это «нефатальная ошибка», и нажатие C продолжает запуск Windows, действие «по умолчанию» — отмена запуска.
Уже подозрительно: если ошибка нефатальная, и Windows способна работать, несмотря на неё, — зачем вообще докладывать о ней пользователю?

Такое сообщение выдавалось программами WIN.COM, SETUP.EXE, HIMEM.SYS, SMARTDRV.EXE и MSD.EXE в нескольких предрелизных выпусках Windows 3.1.
Окончательная версия Windows 3.1 по-прежнему содержит код, выводящий это сообщение. Этот код «выключен», но достаточно изменить один байт в WIN.COM, чтобы его «включить».

Самое интересное в этом сообщении — что оно выводится на всех версиях DR-DOS, включая бета-версию Novell DOS 7, но не выводится ни на MS-DOS, ни на PC-DOS. О чём же это сообщение сообщает?

Может, это случайность?

Конкуренты Microsoft нередко ноют о том, что «Империя зла» намеренно нарушает работу их программ. На самом же деле, Microsoft обычно прикладывает невиданные усилия для поддержки обратной совместимости, даже когда сталкивается с ошибками в программах конкурентов.

Любому, кто утверждает, что Microsoft «не даёт» Windows работать на DR-DOS, я могу указать на факт: Расширенный режим Windows 3.1 отлично работает на DR-DOS. Да, Стандартный режим не работает, но Novell подтвердила, что это из-за бага в DR-DOS.

Можно было бы предположить, что странное сообщение об ошибке выводится из-за ещё одного бага в Novell DOS. Не впервые баги в программах фирмы N пытаются выдать за «намеренную несовместимость» программ фирмы M.

Защита от отладки

Первый шаг в выяснении причин появления сообщения — анализ кода WIN.COM. Сразу же встречаем полосу препятствий: соответствующий фрагмент WIN.COM зашифрован XOR, самомодифицируется, нарочно запутан, и вдобавок нашпигован трюками для защиты от пошагового выполнения: например, устанавливает векторы отладочных прерываний INT 1,2,3 на несуществующие адреса. На современные отладчики (я пользовался Soft-ICE от Nu-Mega) это не оказывает никакого эффекта, но сами по себе попытки затруднить исследование уже выдают, что дело нечисто.

Несмотря на то, что основная часть кода зашифрована, незашифрованной осталась строчка с копирайтом Microsoft, и пара строк «AARD» и «RSAA» — возможно, инициалы программиста.

(Автор угадал: AARD — инициалы Аарона Рейнольдса, реализовывавшего эту «защиту».)

Вереница проверок

По сути, зашифрованный код проверяет, является ли операционная система подлинной MS/PC-DOS. (При том, что этот код является частью Windows — независимого от MS-DOS продукта!) Проверяются различные аспекты недокументированных функций и внутренних структур DOS. Например, AARD-код проверяет некоторые указатели в SysVars, чтобы убедиться, что они инициализированы. Интересно, что хотя структура SysVars реализована в любом качественном клоне DOS, версии DR-DOS 5/6 не проходит проверку изнутри HIMEM.SYS: этот драйвер загружается раньше, чем завершается инициализация внутренних структур DR-DOS.

Далее следуют ещё более запутанные тесты. Сначала код проверяет, запущен ли сетевой редиректор. Если запущен, AARD проверяет, в том же ли самом сегменте расположена таблица строчных и заглавных букв текущей кодовой страницы. Если редиректор не запущен, AARD убеждается, что первый блок управления файлом (FCB) находится по смещению 0.

Эти тесты проходят все версии MS-DOS, но не проходит ни одна версия DR-DOS.

Суровый страж

Какое отношение имеет лингвистическая информация к сетевому редиректору? Какая Windows разница, в каком сегменте расположена таблица заглавных букв, и по какому смещению — FCB? Что это за «ошибки»?

На самом деле, сегмент заглавных букв нигде в Windows не используется: AARD-код не имеет ни малейшего отношения к работе тех пяти несвязанных друг с другом программ. Понятно было бы, если Windows анализирует внутренние структуры DOS и определяет её версию, чтобы проверить, реализованы ли те или иные функции. Но ни WIN.COM, ни другие программы с AARD-кодом никак не используют результат проверок: единственное, что они делают — смущают пользователей «посторонних» версий DOS бессодержательным сообщением об ошибке.

Это определённо похоже на «намеренную несовместимость». Если «ошибка» нефатальная, и Windows продолжает нормально работать, — то в чём же ошибка? В том, что пользователь выбрал не ту версию DOS?

Я попробовал поменять в MS-DOS указатели на таблицу букв и на FCB, чтобы они указывали на те же самые данные, но используя другую пару (сегмент: смещение). Windows и все мои программы продолжали работать как ни в чём не бывало; единственное изменение — что теперь я стал получать AARD-сообщение при запуске.
Получается, AARD — это проверка на абсолютную, добайтную MS-DOS-совместимость.

Я сообщил о находке в Microsoft, и получил ответ от одного высокопоставленного сотрудника: «Нам нет дела до DR-DOS… Они [Novell] заявляют о 100%-совместимости, но в DR-DOS полно багов. Если у пользователей DR-DOS проблемы с Windows, пусть Novell разбирается.»
Но, видимо, им есть дело до DR-DOS — раз они реализовали такую изощрённую проверку, да ещё так тщательно её запутали.

Microsoft не в новинку использовать недокументированные интерфейсы для связи между своими продуктами. Например, клонам DOS, и в их числе DR-DOS, приходится выдавать себя за старые версии MS-DOS, например за MS-DOS 3.31, чтобы Windows запустилась на них в Расширенном режиме. Это из-за того, что драйвер DOSMGR в WIN386.EXE использует для связи с MS-DOS 5/6 недокументированный протокол, который ещё не расшифрован другими компаниями. Если бы клоны выдавали себя за современные версии DOS, то Windows пыталась бы связываться с ними по неподдерживаемому протоколу.
Но переход от недокументированных интерфейсов к нарочно запутанным и зашифрованным — это доселе невиданная технология конкурентной борьбы.



Ответ автора AARD-кода, за визой отцов Windows — Билла Гейтса и Брэда Силверберга, очень мутный и водянистый. Если коротко, то разработчики Windows действительно обнаружили при тестировании ряд проблем с клонами DOS, и решили не тратить лишние силы на обнаружение и обход всех несовместимостей, а просто выдавать при запуске Windows не на MS-DOS сообщение, «ваша операционная система не поддерживается; продолжайте на свой страх и риск.»

Аарона возмущает даже предположение о том, что Microsoft должна поддерживать Windows на чужих версиях DOS: «Они уже не первый год живут тем, что передирают наши разработки; не хватало нам ещё и отлаживать за них их поделки.»

На время бета-тестирования решено было сделать сообщение более туманным, и включить упоминание непонятной ошибки, чтобы пользователь не забыл отчитаться, что на его компьтере сообщение появлялось.
А организаторам бета-тестирования было важно знать, кто из пользователей работает под MS-DOS (и докладывает о настоящих багах в Windows), а кто — под клонами DOS (и, возможно, наблюдает баги этих клонов, а не Windows).
Зашифрован же код был затем, чтобы Novell не успела разобраться в нём и выпустить версию DR-DOS, которая бы его проходила, до окончания бета-тестирования Windows, — это бы запутало организаторам тестирования результаты.

После бета-тестирования, но перед релизом руководство проекта поменяло планы, и в последний момент проверку «подлинности» DOS убрали вовсе. Существующий код на всякий случай оставили на месте: чем меньше объём изменения, тем меньше шанс ненароком обрушить что-нибудь в другом месте.



Необычные воспоминания «с другой стороны баррикад» приводит Ларри Остерман:

Я не знаю, зачем было запутывать AARD-код; мне кажется, это глупость. Но должен сказать, что я абсолютно согласен с идеей проверки подлинности DOS. Разработчики Windows решили, что им принадлежат все уголки системы, включая недокументированные структуры ОС. Они знали, как их найти, они знали их размеры, и они, ни минуты не колеблясь, заменяли эти внутренние структуры собственными. Не стоит и говорить, что с точки зрения разработчика MS-DOS поддержка Windows была сплошным кошмаром.

Один пример: когда Windows загружалась, она увеличивала размер SFT — внутренней таблицы файлов MS-DOS (это та самая таблица, которую задаёт строчка FILES= в config.sys). Увеличивать её нужно было затем, чтоб одновременно можно было открыть больше 20 файлов: представьте себе многозадачную ОС, в которой было бы нельзя открыть 20 файлов. Но для этого программисты Windows недокументированным вызовом получали указатель на «интересные» структуры MS-DOS, прибавляли известное смещение, и заменяли системную SFT на свою собственную.

Когда я работал над MS-DOS 4.0, и нам нужно было обеспечить поддержку Windows, то оставить указатель в том месте, где Windows его рассчитывала найти, было несложно. Проблема была в том, что в MS-DOS 4.0 SFT была на два байта больше, чем в MS-DOS 3.1. Чтобы Windows могла заменять SFT, я добавил в загрузчик DOS код, который опознаёт запуск WIN.COM; находит в его коде инструкцию MOV с операндом, равным размеру старой SFT; и прямо в памяти заменяет этот операнд на новый размер SFT.
Именно так: нам пришлось на ходу патчить код Windows, чтобы он продолжал работать.

Теперь вы понимаете, почему Windows не хотела запускаться на клонах DOS. Кроме того, что она хозяйничала в недокументированных структурах, она активно использовала особенности конкретных реализаций системных функций: в какие моменты их можно вызывать, и в какие нельзя; какие из них реентерабельны, и какие нет. Представляете, что могло бы случиться на неполностью совместимой DOS: от необъяснимых зависаний до порчи данных на диске.

Учитывая, какой тонкой нейрохирургией Windows занималась во внутренностях MS-DOS — закономерно, что первым делом она убеждалась, что пациента не подменили.
Tags: Windows 3.1MS-DOSNovellисториясообщение об ошибке
Hubs: Development for Windows
Total votes 180: ↑167 and ↓13 +154
Comments 66
Comments Comments 66

Popular right now

Top of the last 24 hours