Pull to refresh

Ошибка, которая сохранилась в Windows с 1974 года

Reading time 5 min
Views 125K
Original author: Foone Turing
Сейчас 2018 год, а это сообщение — ошибка, сохранившаяся с 1974 года. Ограничение, которое встречается даже в самой последней Windows 10, появилось ещё ДО «ЗВЁЗДНЫХ ВОЙН». Баг древний как Уотергейт.


В те времена только изобрели штрих-коды, в Америке работала лишь одна телефонная компания, Тед Банди ещё бегал на свободе, а рекорд Бейба Рута по хоум-ранам стоял последние дни.

Когда появился этот баг, по телевизору ещё не показывали «Колесо Фортуны» (российский аналог: «Поле чудес», 1990 год — прим. пер.). Никто не видел «Шоу ужасов Рокки Хоррора», а Стивен Спилберг снял несколько телефильмов и один полноэкранный фильм, провалившийся в кинопрокате (но картина «Дуэль» получила несколько кинопремий — прим. пер.). По NBC не показывали «Субботним вечером в прямом эфире», а «Эдмунд Фицджеральд» ещё перевозил железную руду (гигантский сухогруз с экипажем затонул 9 ноября 1975 года — прим. пер.).

КОГДА ИЗОБРЕЛИ ЭТУ ГЛУПУЮ «ФИЧУ», НА ЭКРАНЫ ТОЛЬКО ВЫШЛА ВТОРАЯ ЧАСТЬ «КРЁСТНОГО ОТЦА».

Так почему это произошло? В то время уже пять лет как вышел Unix с хорошей идеей «всё является файлом», что открывало дверь для множества возможностей: запись в сокеты, конвейер, консоль и прочее с теми же командами и инструкциями.

Идею реализовал Гэри Килдалл в CP/M в 1974 году. Она позволяет классные вещи, такие как копирование данных с последовательного порта в текстовый файл или печать текстового файла прямо из командной строки!

В Unix это делается через специальные файлы, существующие в специальных папках, как /dev/tty для консоли или /dev/lp0 для первого принтера. Вы можете получить бесконечный поток нулей из /dev/zero, случайные байты из /dev/random и т.д.!

Но вот проблема: CP/M предназначена для 8-битных компьютеров с небольшим объёмом памяти и без жёстких дисков. В лучшем случае у вас есть 8-дюймовый дисковод для гибких дисков. Какие директории? Они вам не понадобятся. Просто используете разные диски.

Но без директорий вы не можете поместить свои файлы в каталог /dev/. То есть они просто повсюду. Так что если вам нужно распечатать файл foo.txt, вводим команду PIP LST:=FOO.TXT, что копирует foo.txt в «файл» LST, который является принтером. И это работает везде, потому что нет никаких директорий! Всё просто.

Но как насчёт расширений? Тут проблема: программы любят добавлять к файлам свои расширения. Поэтому если программа говорит «Введите имя файла, чтобы сохранить листинг», есть возможность указать LST для распечатки или PTP для выбивания на перфоленте (потому что это 1974 год, помните?). Но программа может попытаться поставить .TXT в конце имени файла! LST.TXT — это же не принтер, верно?

Неа. Хак всё равно работает. Специальные устройства транслируются на все расширения, так что CON зарезервировано для клавиатуры даже в случае CON.TXT или CON.WAT, или CON.BUG.

Да уж. Это реальный хак, но он нужен только некоторым маленьким микрокомпьютерам с 4 КБ оперативной памяти, кого это волнует?

Операционка CP/M получила широкое распространение в конце 70-х и начале 80-х. Это была одна из основных ОС для бизнеса. Она определила стандартный интерфейс, так что вы могли написать код CP/M на NorthStar Horizon — и запустить его на Seequa Chameleon.

Отсутствие универсального графического стандарта не позволяло писать для него много игр (хотя есть релизы Infocom), так что стандарт использовался в основном в деловой среде.

Но рынок был большой: естественно, IBM хотела его охватить для нового проекта под названием «PC», который они делали в начале 1980 года.

IBM намеревалась выпустить IBM PC с несколькими операционными системами и ожидала, что CP/M станет «основной». Но CP/M для x86 появилась только через 6 месяцев после запуска IBM PC… и стоила $240 против $40 для DOS.

Таким образом, подавляющее большинство пользователей в конечном итоге купили Microsoft PC-DOS — новую версию операционной системы, изначально разработанную компанией Seattle Computer Products. MS купила проект Тима Патерсона и развила его в PC-DOS (который позже переименуют в MS-DOS, если вы не в курсе).

Система Тима Патерсона называлась QDOS (Quick and Dirty Operating System, «быстрая и грязная операционная система»). Её написали по-быстрому, потому что CP/M ещё не вышла под x86, и QDOS пыталась преодолеть некоторые ограничения CP/M. Эта система определённо во многих отношениях копировала CP/M.

Среди прочих была позаимствована концепция специальных файлов и отсутствие каталогов, потому что это была полезная функция CP/M. Таким образом, в QDOS и PC-DOS 1.0 тоже есть AUX, PRN, CON, LPT и т.д.!

Для PC-DOS 2.0, выпущенной в 1983 году для нового IBM XT, компания Microsoft значительно обновила PC-DOS. В IBM XT имелся жёсткий диск, поэтому в PC-DOS добавили поддержку каталогов. Нужно ведь навести порядок в куче файлов на огромном жёстком диске 10 МБ, очевидно!

Но вот проблема: пользователи уже используют эти специальные файлы с момента выпуска PC DOS 1.0 двумя годами ранее. Написано программное обеспечение с их поддержкой! В продакшн ушли пакетные файлы.

С появлением директорий Microsoft теперь могла сделать папку C:\DEV… но не сделала.

Не в последний раз Microsoft пожертвовала здравым смыслом ради обратной совместимости. Специальные файлы теперь могут быть в ЛЮБОМ КАТАЛОГЕ и С ЛЮБЫМ РАСШИРЕНИЕМ. Так что ваша команда DIR > LPT для печати листинга файлов продолжит работать в C:\DOS, как она работала в A:\.

Конечно, мы не запускаем DOS 2.0… Но Windows 95 построили поверх DOS. Естественно, она унаследовала это поведение (как и Windows 1/2/3 ранее). Windows 95 больше нет! Текущая ветвь Windows основана на Windows NT, а не Win95.

Однако Windows NT стремилась сохранить совместимость с программами DOS/Windows, поэтому XP объединила две ветви. Так что эти специальные файлы всё ещё работают, СПУСТЯ СОРОК ЧЕТЫРЕ ГРЁБАНЫХ ГОДА.

Можете сами попробовать! Откройте Проводник, создайте новый текстовый файл и назовите его con.txt, aux.txt или prn.txt.

Вам скажут ИЗВИНИ, ДРУГ…



Гэри Килдалл позаимствовал отличную идею из Unix и приспособил её для микрокомпьютеров с 4 КБ памяти без каталогов — это случилось так давно, что у родившихся тогда детей уже могут быть свои дети, которые имеют право покупать алкоголь, но мы по-прежнему не имеем права назвать файл con.txt.

Microsoft приводит полный список запрещённых названий: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.

Для ещё большего кайфа, попытка доступа к C:\con\con (или C:\aux\aux) на win95 мгновенно покажет синий экран. Это было весело даже в 1995 году, потому что багу исполнился 21 год! Представьте, что какая-то ошибка сохраняется настолько долго?





Бонус: вот фотография Тима Патерсона на VCF:W в августе этого года, он рассказывает об истории DOS.



Если вам интересно, как у меня появился «запрещённый» файл, который нельзя скопировать, то скажу. Эти имена специальных устройств реализуются на уровне ОС, а не на уровне файловой системы. Таким образом, это совершенно допустимые имена файлов NTFS, а я использовал диск NTFS под Linux.

Похоже, что OS/2 тоже не реализовала эти специальные имена, потому что на одном из дисков от IBM есть файлы AUX.H в комплекте OpenGL.



Так что сегодня я попытался сделать резервную копию этого диска NTFS на основной ПК и ОП-ПА, НЕВОЗМОЖНО СКОПИРОВАТЬ ВСЕ ФАЙЛЫ ИЗ-ЗА БАГА СТАРШЕ, ЧЕМ БОЛЬШИНСТВО ЧИТАТЕЛЕЙ ЭТОЙ СТАТЬИ.

Несколько примечаний:

1. CP/M на самом деле не использовала эти специальные имена так просто, как я описал. Похоже, что я или не знал, или забыл об этом факте. На самом деле они должны сопровождаться двоеточием, как имена дисков, то есть PRN: — это принтер, PRN — нет.

2. CP/M не реализовала их на уровне ОС, как в DOS! Они были просто включены в PIP, команду копирования файлов. Поэтому там не работал трюк DOS сохранения в файл PRN.TXT с автоматической печатью. Я не имел в виду, что CP/M так делала, а только DOS, но видимо не ясно выразился.

3. В PC DOS 1.0 на самом деле не было редиректов или конвейера, так что вы не сможете сделать такой редирект, как я предложил. Забыл об этом. Их добавили в PC DOS 2.0 в 1983 году. Хотя PC DOS 1.0 поддерживала копирование в/из специальных файлов, поэтому общий тезис правильный, даже если пример неудачный.

В любом случае, спасибо за отклики на эту статью! Не ожидал, что она так взорвётся, я просто накропал пару абзацев, когда пришёл домой сильно уставший и увидел сообщение об ошибке из-за бага 44-летней давности.

И если что, я не собирался кричать «Windows SUCKS». Обратная совместимость, в общем, хорошая вещь. На самом деле, я хотел бы больше обратной совместимости, а не меньше.

Но меня просто поразил этот баг из древности, который выскочил во время копирования с USB 3.0 SSD на другой SSD в Windows 10.

Это как будто живёшь на космической станции — а тут появляется лошадь.
tl; dr:

Tags:
Hubs:
+80
Comments 254
Comments Comments 254

Articles