Windows на одной дискете

Автор: (c)Крис Касперски ака мыщъх

...и на обломках Microsoft'а напишут наши имена.
Фидошное
Штатная конфигурация Windows весит сотни мегабайт, с каждым годом становясь все тяжелее и тяжелее. Тем не менее, в максимально урезанном варианте система свободно умещается на одну дискету вместе с FAR'ом и парой-тройкой мелких программ. Это чудо осуществляется с помощью утилиты doswin32, созданной гениальным хакером и удивительным человеком Юрием Хароном, о которой мы и собираемся рассказать

Введение

MS-DOS мертва? Почти. Но поднимать тост за ее упокой еще рано. Сохранилось огромное количество древних машин, которые надо как-то программировать, но Windows на них не поставишь, а под MS-DOS весь инструментарий давно прокис и заржавел. Нету ни свежих компиляторов, ни отладчиков, ни библиотек. Ностальгия - прекрасная вещь, но только не в тот момент, когда нам приходится вспоминать все три модели памяти с жуткими ограничением в 64 Кбайта на сегмент и прочими "прелестями" тех времен.

Windows - прекрасная ось, только сильно падучая. Хуже того - это не система реального времени! Ей нельзя доверять управлять процессами, требующими немедленного отклика (типа датчика давления на паровом котле), поскольку в любой момент "нехороший" процесс или драйвер может захватить управление и задержать его на неопределенный срок. Несмотря на то, что Windows "успешно" применяется в АТМ и прочих встраиваемых устройствах, убыток от сбоев очень внушительный. Почему бы не использовать QNX или MS-DOS? А кто их будет программировать? Современные программисты знают только Microsoft Visual C++/Borland Builder и с трудом отличают язык от средств разработки. Осваивать альтернативные операционные системы нет мазы - слишком маленький потенциальный рынок.

Вот если бы было "волшебное" средство для запуска win32-программ под MS-DOS! Пусть даже без графического интерфейса в текстовом режиме командной строки. И такое средство действительно есть! Утилита doswin32 Юрия Харона именно этим и занимается. Это не эмулятор Windows. Это - DPMI-расширитель, реализующий базовый минимум системных функций Windows и позволяющий запускать FAR, MS VC, BCC, PKZIP и другие консольные приложения (запуск файлов, обработанных упаковщиками или защищенных протекторами, не гарантирован и зачастую они не запускаются). Скорость работы выше всяких похвал и даже на древнем оборудовании все буквально летает.

Официальный сайт поддержки утилиты doswin32

Рисунок 1. Официальный сайт поддержки утилиты doswin32.

9x, NT, XP или Longhorn?

Под doswin32 функция GetVersionEx возвращает строку 'DW32' (что означает doswin32), а поле dwPlatformId равно 3. В Platform SDK такого определения нет, зато есть: 0 - MS-DOS/Windows 3.x с win32s, 1 - Windows 9x, 2 - Windows NT. Таким образом, doswin32 не эмулирует ни одну из известных версий Windows, но в то же время поддерживает их все! doswin32 это самостоятельный продукт, поэтому некорректно спрашивать, как он относится к XP или Longhorn? Строго говоря, никакого XP вообще нет, есть только глобальное маркетинговое гонево, что где-то с понтом что-то есть. Всего у Microsoft имеется три линейки операционных систем: 16-разрядная Windows 3.x/win32s с ущербной поддержкой 32-разярдных программ (ныне практически мертва), Windows 95/96/98/Me, в кругах разработчиков известная под именем "win32s, реализованный должным образом" и обычно обозначаемая как 9x, и, наконец, Windows NT. Все последующие оси - W2K/2003/XP/Longhorn собраны на ядре NT и отличаются от друга только интерфейсом.

С этой точки зрения doswin32 представляет собой независимый клон Windows, частично совместимый со всеми системами. Это ни 9x, ни XP. Это - doswin32.

Что может doswin32

Ядро исполняемой системы (dw32core.zip), занимающее в упакованном виде чуть больше 100 Кбайт(!) - это все, что нам нужно для нормальной работы. В этот крохотный объем Харону удалось втиснуть:

А вот список того, чего здесь нет:

Таким образом, doswin32 позволяет запускать не сильно извращенные консольные программы, к которым помимо FAR'а относятся компиляторы, линкеры, отладчики типа Turbo Debugger и прочий инструментарий. А настоящему программисту ничего другого для счастья и не нужно! Шутка. На самом деле никто не предлагает устанавливать doswin32 на устаревшее оборудование только затем, чтобы программировать под него (хотя, если вы стеснены в средствах, то... почему бы и нет?). Вместо этого мы будем программировать для него! Для устаревшего оборудования - в смысле, которое можно использовать и как "фундамент" встраиваемых систем реального времени, и как рабочие станции "тонких" клиентов и еще много для чего. На периферии сплошь и рядом стоит MS-DOS, под которую постоянно просят что-то написать/дописать, но не возвращаться же ради этого в давно забытый, похороненный и заброшенный Turbo Pascal?! Конечно же, нет! Достаточно написать консольное win32-приложение (при желании и под Turbo Vision), использующее "плоскую" модель память и кучу готовых библиотек, откомпилировать его своим любимым компилятором и... запустить в MS-DOS с помощью doswin32!

FAR, запущенный из чистой MS-DOS под doswin32

Рисунок 2. FAR, запущенный из чистой MS-DOS под doswin32, свободно умещающийся на одной системной дискетке.

Подготовка doswin32 к работе

Последнюю версию пакета doswin32 можно скачать с официальной страницы проекта http://www.doswin32.com. Для некоммерческого использования он бесплатен. Минимум системных требований: 80486 DX и 16 Мбайт оперативной памяти. Версия MS-DOS от 5.x и выше. Однако вплоть до версии 7.х поддержка длинных имен отсутствует (doswin32 работает с диском не напрямую, а через файловую систему и "умнее" ее быть никак не может).

Скачиваем ядро исполнительной системы www.doswin32.com:8080/ftp/pub/dw32core.zip и распаковываем его. Видим файлы DOSWIN32.RTM (150 Кбайт) - DPMI-расширитель, RUN32.EXE (571 Байт) - "пускалка", RD32.EXE (579 Байт) - загрузчик для отладчика Turbo Debugger, license.txt (6 Кбайт) - лицензионное соглашение, license-en.txt (6 Кбайт) - тоже самое, но только на английском языке и папку DW32APP.DAT c парой крохотных readme, из которых следует, что этот каталог представляет собой CSIDL_APPDATA. Первые два файла обязательны, остальные можно и потереть (особенно, если вы не используете Turbo Debugger). Скопируем их на системную дискету, которую можно подготовить средствами Windows 98 или обратиться к проекту FreeDOS.

Загружать драйвера HIMEM.SYS и EMM32.EXE совершенно необязательно - doswin32 справится с памятью и самостоятельно. А вот без мыши, русификатора и smartdrive будет очень хреново, причем после запуска doswin32 никакие MS-DOS драйвера загрузить уже не удастся и об этом следует позаботиться заблаговременно. Крайне желательно установить правильную кодовую страницу (за это отвечает country.sys), поскольку без нее русские имена файлов будут отображаться некорректно.

Синтаксис командной строки предельно прост: "run32 file_name arg1 arg2 argN", где file_name имя win32-файла, который надо запустить, а arg1-argN - ключи командной строки, которые будут переданы запускаемому приложению. Если никаких имен не указывать, doswin32 останется в памяти резидентно, позволяя запускать файлы обычным путем. Мы можем работать как со старыми 8- и 16-разрядными MS-DOS приложениями реального и защищенного режима, так и с новыми 32-разрядными win32-приложениями (Есть сложности с dpmi16 приложениями. По "настояниям трудящихся" я там сделал возможность их применять, но тогда до запуска doswin32 нужно установить несколько env-var, описанных в документации - прим. Юрия Харона). Выход из эмулятора по команде "exit".

Попытка запуска FAR

Рисунок  3. Попытка запуска FAR'а под doswin32, запущенным под VMWare, приводит к выбросу исключения.

При запуске FAR

Рисунок 4. При запуске FAR'а под doswin32, запущенным под BOCSH'ем, на экране появляется сообщение "error: cannot load language data" и загрузка прекращается.

Сам FAR лучше всего брать из раздела update (http://www.farmanager.com/updates.php?l=ru), поскольку здесь он поставляется в простом архиве без инсталлятора (а инсталлятор, будучи GUI-приложением, под doswin32, естественно, не запускается). Распаковав архив мы увидим 6 файлов: far.exe (главный исполняемый файл), far.map (карта памяти для отладки - можно смело стирать), farrus.lng/fareng.lng (русское/английское меню) и farrus.hlf/fareng.hlf (русская и английская помощь). Два языковых комплекта на системной дискете совершенно ни к чему и от одного из них можно избавится. От русского. Английский лучше оставить на случай проблем с русификатором.

Как вариант, эти файлы можно "выдрать" из ранее установленного дистрибутива. Для сохранения своих настоек запустите SaveSettings.bat (входит в штатную поставку FAR'а). На диске образуется два файла: FarSave1.reg и FarSave2.reg. Объединяем их в один: удаляем из FarSave2.reg строку "REGEDIT4" и копируем остаток внутрь FarSave1.reg размещая его между "REGEDIT4" и "[HKEY_CURRENT_USER\Software\Far]". Берем "dw32reg.exe" (входит в комплект "дополнительных системных утилит", поставляемых вместе с doswin32) и запускаем его: "dw32reg.exe /C FarSave1.reg". Образуется файл "DOSWIN32.RGD", который мы копируем в одну директорию с doswin32.exe. Это и будет нашим реестром, с которым станет работать FAR.

Большинство win32-программ из FAR'а не запускаются, поскольку практически все exe сейчас собираются без релокаций и претендуют на память уже занятую FAR'ом. Приходится каждый раз выходить из FAR'а, запуская их из чистой командной строки. Галимо, конечно, но терпимо (текущий каталог при этом сохраняется). Обойти программу можно перебазированием FAR'а. Для этого нам понадобиться утилита rebase.exe, входящая в состав MS Visual Studio и Platform SDK, а запускается она так: "rebase -b 0x80000000 far.exe". В нормальных условиях адрес 80000000h занят операционной системой и никогда не выделяется прикладным приложениям, поэтому никаких конфликтов с запускаемыми программами под doswin32 не возникает. Такой файл будет запускаться и под Windows NT, которая автоматически переместит его в свободный регион. С Windows 9x имеются определенные проблемы (этот адрес занят совместно используемыми memory-mapped файлами) и лучше зачеркнуть два нуля, перебазировавшись на 0x800000, но тут возможны конфликты с уже загружаемыми приложениями. (Примечание: alfa-версии FAR'а обычно собираются без релокаций и не могут быть перебазированы. Все beta- и stable-версии полностью перемещаемы). Свои собственные программы лучше всего собирать с перемещаемыми элементами (ключ /FIXED:NO линкера MS link), чтобы "подружить" их с FAR'ом. Если программа компоновалось линкером ulink (созданного все тем же Юрием Хароном) с ключом -ay[x], то под Windows задача пойдет как "родное" win32-приложение, а под MS-DOS будет автоматически искать doswin32 в текущем каталоге и в PATH'ах, самостоятельно загружая расширитель, освобождая пользователей от лишних телодвижений.

FAR

Рисунок 5. FAR, запущенный под doswin32 под пропатченным BOCHS'ем.

Заключение

Только настоящий хакер (такой как Юрий Харон), способен на подлинные чудеса - такие, например, как создание "облегченного" клона NT, размещающегося вместе с FAR'ом на одной дискете и работающем на всем оборудовании, какое только встретится ему на пути. doswin32 - это не игрушка из серии "собрались в кучу пионеры и заточили ништяки от не фиг делать". Это профессиональный инструмент, пригодный для серьезной работы. И он действительно работает во многих встраиваемых системах - там, где использование Windows затруднено или крайне нежелательно. Еще его используют школы, которые не могут позволить себе нормальный компьютер, а учить детей современным языкам программирования все-таки приходится...

Словом, doswin32 - это то самое средство, которого все так давно ждали и которое наконец появилось и стало доступно всем желающим.

Ссылки по теме