doswin32

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

крис касперски ака мыщъх no-email

….и на обломках Microsoft'а напишут наши имена

фидошное

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

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

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

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

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

Под 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.

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

  1. полноценный DPMI-расширитель, переводящий процессор в защищенный режим, поддерживающий виртуальную память (включая подкачку на диск!), и содержащий «переходники» из защищенного режима к функциям MS-DOS;
  2. загрузчик PE-файлов, «переваривающий» как исполняемые файлы, так и динамические библиотеки (DLL);
  3. основные системные функции базовых Windows-библиотек: ernel32.dll, user32.dll, advapi32.dll, ole32.dll, shell32.dll, mpr.dll, ntdll.dll, version.dll, winmm.dll, oleaut32.dll, rpcrt4.dll, winspool.drv, gdi32.dll (разумеется, реализован не полный набор точек входа — для консольных задач полный и не нужен, а места требуется много. к тому же, многие точки входа «реализованы» в виде «заглушек», состоящих из одного только returnERROR_CALL_NOT_IMPLMENTED, returnERROR_INVALID_HANDLE и т. д. Это — «патентованная» технология Windows 9x — объявить функцию в SDK и тут же «заткнуть» ее, чтобы никто не использовал);
  4. реестр и ini-файлы (функции реестра реализованы не слишком производительно и работа с большими объемами данных вызывает определенные тормоза, так же сохранение изменений на диск происходит либо только по явному запросу RegFlushKey, либо по завершению процесса);
  5. буфер обмена (поддерживаются только форматы CF_TEXT, CF_OEMTEXT и RegisterClipboardFormat, причем перекодировка между форматами не проводится, поскольку ANSI-codepageOEM-codepage всезде одинаковые);

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

  1. многозадачности/многопоточности (вызов CreateThread не реализован);
  2. раздельных адресных пространств (все задачи выполняются в единой области памяти, что в частности, делает невозможным запуск из FAR'а программ без релокаций, поскольку они хотят исполняться в уже занятым FAR'ом регионе памяти и не могут быть перемещены на другое место, ведь таблицы перемещаемых элементов у них нет);
  3. сети (библиотека WINSOCK.DLL в doswin32 не реализована, а это значит, что мы не можем взаимодействовать с сетью «напрямую», тем не менее какая-то сетевая поддержка в MS-DOS все-таки есть, в частности она может монтировать сетевые диски NovellNetware, которые замечательно видит doswin32);
  4. поддержки NTFS (наверное, это самый больной вопрос, препятствующий использованию doswin32 как системной дискетки для «починки» упавшей NT, тем не менее мы можем использовать NTFS-драйвера от сторонних производителей, подробнее о которых рассказывается в моей книге «Техника восстановления данных», к тому есть надежда «примерить» NTFS-for-DOS Мрака Руссиновича и doswin32, чем Харон сейчас и занимается);
  5. графической и оконной подсистемы (функции user32.dll и gdi32.dll не реализованы и доступен лишь текстовой режим)

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

doswin32_image_1.jpg

Рисунок 2 FAR, запущенный из чистой MS-DOS под 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 Байт) — загрузчик для отладчика TurboDebugger, 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».

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

К сожалению, под VM Ware и некоторыми другими эмуляторами при попытке запуска «тяжеловесных» программ наподобие FAR'а или PKZIP'а doswin32 вылетает с воплем об ошибке (см. рис 3). Под «борщом» (эмулятором BOCHS) PKZIP уже запускается, но… FAR по-прежнему продолжает не работать: обламывается с поиском языковых файлов и тихо кончает в черный экран. Так проявляют себя ошибки эмулятора, для исправления которых к статье прилагается специальный патч, подготовленный Юрием Хароном (не ищите его ни на официальном сайте борща, ни на сайте самого doswin32. Это 100% эксклюзив). Просто скопируйте файлы в директорию исходных текстов борща версии 2.1.1 (внимание! совместимость с остальными версиями не гарантирована!) и перекомпилируйте проект. Теперь FAR запускается как ни в чем не бывало и черный экран окрашивается в приятный голубой цвет.

Рисунок 4 при запуске FAR'а под doswin32, запущенным под BOCSH'ем, на экране появляется сообщение «error: cannotloadlanguagedata» и загрузка прекращается

Сам 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'ах, самостоятельно загружая расширитель, освобождая пользователей от лишних телодвижений.

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

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

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

Настоящему программисту для работы достаточно FAR'а (с colorer'ом), MS VC 6/Borland C++ и TurboDebugger'а, а все остальное ему на фиг не нужно.

Не удивляетесь, если под doswin32 компьютер перестанет реализовать на Ctrl-Alt-Del. Это не клавиатура сломалась. Это doswin32 ее перехватывает и блокирует перезагрузку, чтобы не потерять не сохраненные данные. Если хотите перезагрузится — давите reset.

«Прототипом» doswin32 был борландовский Powerpack. Собственно, изначально я за это взялся просто потому, что багланд уже много лет его не поддерживает и там не > только «перестало хватать» необходимых точек в api, но и память он использует (по нынешним временам) не оптимально. Ну а дальше «понеслось» :)

  1. DosWin32:
    1. официальный сайт поддержки, с которого можно выкачать исполнительное ядро системы, документацию, дополнительные утилиты, и другую полезную всячину: http:www.doswin32.com; - FreeDOSproject: - бесплатный клон MS-DOS, доступный для скачивания в виде готовых образов: http:www.freedos.org;
  2. BOCHS:
    1. бесплатный эмулятор PC, распространяющийся в исходных текстах, но содержащий большое количество ошибок, препятствующих нормальной работе doswin32, поэтому для версии 2.1.1 Харон выпустил специальный закрытый патч: http:prdownloads.sourceforge.net/bochs/bochs-2.2.1.tar.gz?download; - FAR: - замечательный файловый менеджер консольного типа, работающий под Windows, последнюю версию которого можно всегда найти в разделе обновлений: http://www.farmanager.com/updates.php?l=ru__;