Windows

индекс
168,47

бAARDак в 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 — закономерно, что первым делом она убеждалась, что пациента не подменили.
+154
8 сентября 2010, 10:30
31

комментарии (66)

+85
bondbig #
зачетная некрофильская статья )
+30
ophiuhus #
Давным-давно, в далекой, далекой Галактике…
+13
artemlight #
Почаще бы такие вещи тут выкладывали :)
0
Cancel #
У меня таких вещей — 12 мегабайт текста, фактически вся подковёрная история микрософта середины 80-х, начала 90-х. Фантастически интересное чтиво, но переводить его на русский очень тяжко с американского юридического.
+13
dkr6 #
Спасибо.
Очень познавательно…

Еще интересно бы почитать про Netscape Navigator…
+5
tyomitch #
и про Netscape Navigator напишу!
0
dkr6 #
Если еще и материалы по делу «Граждане штата Айова против MS», как раз на тему Netscape. где-то закешировались, то будет вообще красота.
Потому как я помню про наличие такого факта в истории, а сохранить себе не сообразил.
А потом сканы писем «хутко зныклы»…
Там как раз фигурировали письма Билла о том, что нужно сделать бяку…
–1
romx #
Какие новости, Бог мой, «времен Очакова и покоренья Крыма». Уверен, 80% читателей Хабра даже ни разу в жизни Windows 3.1 работающей не видели. Даешь пост про OS CP/M.
–11
andoriyu #
>Уверен, 80% читателей Хабра даже ни разу в жизни Windows 3.1
ололо. удваиваю — 80% читатлей Хабра получили свой первый пека для учебы 5 лет назад, и еще 15% 10 лет назад.
+6
mephisto #
Я получил 12 лет назад. Что с того? Я чем-то хуже тех, кто получил его 15 лет назад?
Просто потому, что мои родители были не такими богатыми, чтобы купить комп раньше? ))
Что за дискриминация по признаку благосостояния родителей много лет назад? )))
+2
mephisto #
З.Ы. Я видел работающей Win3.1 на 386ых компьютерах в школе :)
0
andoriyu #
я намекаю на возраст аудитории хабра, но спасибо за информацию о благосостоянии родителей много лет назад — теперь понятно почему у многих так болит жопа от моего комментария.
+1
tyomitch #
Дело не в «много лет назад», а в том, что конкретно в 1991-1993 очень у многих благосостояние нарушилось.
+1
mephisto #
а 25летние чем то хуже 30летних? )
+2
divanikus #
Лолшто, я получил свой первый ПК 19 лет назад. Правда он был не IBM PC совместимый :D. И да, IBM PC для меня начинался с MS DOS и Windows 3.11 «fur Workgrupen» или как-то так — раритетная немецкая версия :D
0
zoxa #
Повезло на моём IBM PC 286 (итальянской сборки) был только MS-DOS… дискет с Виндой не было (
0
divanikus #
Ну на момент знакомства с Win 3.11 у меня и своего IBM PC компа-то не было. Знакомились так сказать коллективно у друга с компом :)
+2
savex #
Эх… я бы тоже с удовольствием про CP/M почитал… ))
+5
anarleen #
Видите ли, не все ныне живущие люди родились одновременно, поэтому некоторые из нас сели за компьютер гораздо позже, чем вы.

И попрекать этим людей так же «смешно», как смеяться над, например, слепыми и тем, что они не видят.

с ув.
–2
romx #
А никто не попрекает этим людей, но лишь только высказывается вполне обоснованное ироническое замечание, что этой замшелой истории место в конце 2010 года, спустя… э-э… даже затруднюсь вспомнить сколько лет. 17? Пусть будет 17.

примите и проч.
+1
gene4000 #
у меня даже сейчас есть… в ящике, в дальнем углу
НЛО прилетело и опубликовало эту надпись здесь
–1
Inskin #
romx, не переживайте так. Лучше прочитайте, почему эта статья получила плюсы: fritzmorgen.livejournal.com/325455.html
Эта и ей подобные и дальше будут плюсы получать. Такова психология людей.
+2
nicosha #
Интересно, как много недокументированных возможностей у современных windows. На память могу только вспомнить где то примерно год назад windows xp обновила одну библиотеку в папке windows(даже при выключенных обновлениях)
+5
allotus #
Актуально. Спасибо.
0
make_luv #
Свежачок
+1
bems #
Одобряю топик.
–2
mikhailian #
А слабо перенести в Блог компании Микрософт?
+2
andrikos #
Технологии конечно уже поменялись, но рулевые остались те же.
–2
seleko #
как M$ нас всех поимел :(
0
dkr6 #
Ну, кого поимел, а кто и спрыснул ;)
А PC-DOS мне и в те времена нравилась больше, чем MS-DOS…
0
seleko #
да я к тому, что сейчас-то уж чо…
дело былое. а поимел M$ таки всех :(
+1
asis #
Ну сами конкуренты тоже маху дали.
+2
karass #
А я тут ещё переживаю, дескать в варезных релизах мастдая могут быть зашиты вирусы… Какие вирусы, когда у производителя оригинальных версий такая этика?! Не удивлюсь, когда обнаружатся ещё и шпионские функции.
–5
dkr6 #
Не переживайте…
Персональная информация, которую получает MS, отдается для аналитической обработки в два десятка фирм-подрядчиков…
Которые, в свою очередь, имеют эту информацию всяко…

И это…
Там, где начинаются большие деньги, заканчивается этика…

Не обольщайтесь на этот счет…
0
mister_fog #
Можно еще про Stac Electronics почитать, тоже весьма занятно.
+1
amgorb #
думаете за это время в МС что-то изменилось?)
0
asis #
изменилось, многое изменилось в подходе к разработке. И не только у МS.
+2
CoF #
Интересно, как сейчас с этим дела обстоят.
+3
build_your_web #
Меня удивляют комметарии о том, что Windows кого-то поимела.

Это бизнес. Если в тот момент сделать эту несовместимость было выгодным ходом, то разумное руководство сделает этот ход, чтобы распространить свой продукт.
–1
asis #
Во-во, тем более что MS тогда не была никаким особо монополистом.
+1
tyomitch #
Была практически абсолютным монополистом.
Основными «конкурентами» Windows были MS-DOS, PC-DOS и OS/2 — т.е. продукты самой MS.
Линукса, например, ещё просто не существовало.
0
asis #
Да причем тут Линукс? Куча народу на Маках сидели. В науке сплошь unix — подобные системы.
+1
asis #
к слову говоря уже в 1992 году Линукс не только был, но на нем уже даже X-сервер можно было запускать.
0
tyomitch #
Бета, о которой идёт речь, вышла в конце 1991.
0
asis #
Я в курсе когда она вышла, пользовал.
0
dkr6 #
Точно…
Лично, в 1992 году, на BSDI в Х-сах работал…
И в Internet, к слову…
Х-сы, к слову, аж с 1986 года существуют…

А поддержка TCP/IP с когда начиная появилась в «самой-самой» ОС?

Кто помнит танцы с бубном при установке Waterloo?
0
tyomitch #
Лично, в 1992 году, на BSDI в Х-сах работал…
И в Internet, к слову…

На ПК?
Рынком Microsoft были исключительно домашние/офисные компьютеры.
+7
dkr6 #
Да, на ПК…
Сервер у нас был такой, корпоративненький:
486 DX2/16M RAM/ 512K videoRAM/ 860M HDD…
Модем до Киева аж на 32000!!!
(336000 не тянул из-за линии)
А рабочая станция у меня была 286-я…
На ней, точная копия сервера для тренировок…
На ней же и Х-сы, чтоб несколько терминальных сессий запускать…
На экране — вращающийся глобус на фоне мерцающих звезд, а поверх этого — куча терминалов. В терминалах — МС и/или deco…

По сравнению с DOS — это была фантастика…
По сравнению с Win 3.1 — то же…
Ко мне экскурсии ходили…

Если конкретики, то сеть «Энергия», МинЭнерго Украины, Полтаваоблэнерго…
0
asis #
а уж если затрагивать серверный рынок, то до выхода NT 4.0 (а точнее до года 98го когда железо подешевело до приемлемого уровня) — там у MS вообще были нулевые позиции.
+2
Gorthauer87 #
Эх… во времена были. Это сейчас то везде защищенный режим, вытесняющая многозадачность, виртуальные машины, JIT, все скучно, чинно, а тогда вот было раздолье для настоящих хакеров, системы были не в пример проще и защищены не в пример хуже.
0
AmdY #
а ведь уже тогда были *nix и маки. кстати, раз уж некрофилия, было бы интересно про яблочных почитать, как они убили конкурентов.
+3
sky_lord #
Кстати, DR-DOS и позже Novell DOS — классная штука. Хорошие сетевые возможности, нормальная многозадачность… Потребности в Win3.1 с ними вообще не ощущалось. Я в свое время с НовелДоса пересел только сразу на Win95OSR2, когда там более-менее баги пофиксили и софта дополнительного написали. А до этого смысла вообще не было.
А на старых 386/486 ноутбуках (которые к тому же с ч/б экранами поголовно были) альтернативы НовеллДосу вообще не было, т.к. многозадачности хочется, а Винда на их экранах и с их ресурсами тормозила неимоверно. В школе у нас тоже стоял НовелДос и только благодаря этому была возможность играть по сети в Дум… :-)
Короче, статья интересная, но надо было больше раскрыть тему, почему Микрософт боролась именно с DR/Novell-DOS'ом. А потому и боролась, что ништяный ДОС был…
0
asis #
Так и не боролись то особо, просто в бете выводили сообщение о неполной совместимости. В релизе все было тихо и спокойно.
0
knaje #
Дум и в MS-dos по сети запускался не плохо, главное настроить все было и дрова нужные подгрузить…
А так в общем то тоже только на OSR2 сел плотно, а до этого «чистый светлый» рулил… иногда приходилось конечно 3.11 запускать, но это совсем другая история…
НЛО прилетело и опубликовало эту надпись здесь
0
danSamara #
Пишите ещё, у вас очень смешно получается.
НЛО прилетело и опубликовало эту надпись здесь
0
danSamara #
Ваша сложная и многогранная система работала у меня в виртуальной машине из под OS/2, которая уже тогда была по настоящему 32-разрядной и многозадачной, а ваша суровая многогранная правда выглядела убого и неказисто.
0
tyomitch #
Почему тогда об OS/2 сейчас никто не помнит, а Windows стоит на каждом рабочем столе?
0
danSamara #
Потому как сделать мало, надо ещё продать. Почему IBM забила на OS/2 нужно спросить у неё самой.
+4
Mezomish #
>«Они уже не первый год живут тем, что передирают наши разработки; не хватало нам ещё и отлаживать за них их поделки.»

И это говорит тот, кто на тот момент «уже не первый год живёт тем, что пилит передранную чужую разработку» (привет, CP/M).
Они бы сначала с отладкой своей «поделки» справились, прежде чем на других кивать.
0
tyomitch #
Справедливое замечание; но всё же, MS передрала CP/M один раз, а Novell передирала каждый новый выпуск MS-DOS.

А так, если учитывать всю цепочку преемственности «CP/M — MS-DOS — Windows — WinNT», то выходит, MS до сих пор живёт за счёт передранной 30 лет назад чужой разработки.
0
Mezomish #
CP/M, действительно, передрали один раз. А потом нашли другие источники вхохновения ;)
–1
stas_agarkov #
классная статья
0
vadymg #
Спасибо за обзор, статья очень понравилась :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.