Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

articles:doswin32 [2017/09/05 02:55] (текущий)
Строка 1: Строка 1:
 +====== doswin32 ======
 +<​sub>​{{doswin32.odt|Original file}}</​sub>​
 +
 +====== windows на одной дискете ======
 +
 +крис касперски ака мыщъх no-email
 +
 +//....и на обломках ////​Microsoft////'​а напишут наши имена//​
 +
 +//​фидошное//​
 +
 +**штатная конфигурация ****Windows**** весит сотни мегабайт,​ с каждым годом становясь все тяжелее и тяжелее. тем не менее, в максимально урезанном варианте система свободно умещается на одну дискету вместе с ****FAR****'​ом и парой-тройкой мелких программ. это чудо осуществляется с помощью утилиты ****doswin****32,​ созданной гениальным хакером и удивительным человеком Юрием Хароном,​ о которой мы и собираемся рассказать**
 +
 +===== введение =====
 +
 +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 и другие консольные приложения (запуск файлов,​ обработанных упаковщиками или защищенных протекторами не гарантирован и зачастую они не запускаются). Скорость работы выше всяких похвал и даже на древнем оборудовании все буквально летает.
 +
 +{{doswin32_Image_0.png?​553}}
 +
 +Рисунок 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 Кбайт (!),​ — это все, что нам нужно для нормальной работы. В этот крохотный объем Харону удалось втиснуть:​
 +
 +  - **полноценный ****DPMI****-расширитель**,​ переводящий процессор в защищенный режим, поддерживающий виртуальную память (включая подкачку на диск!), и содержащий "​переходники"​ из защищенного режима к функциям MS-DOS;
 +  - **загрузчик ****PE****-файлов**,​ "​переваривающий"​ как исполняемые файлы, так и динамические библиотеки (DLL);
 +  - **основные системные функции базовых ****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 и тут же "​заткнуть"​ ее, чтобы никто не использовал);​
 +  - **реестр и ****ini****-файлы **(функции реестра реализованы не слишком производительно и работа с большими объемами данных вызывает определенные тормоза,​ так же сохранение изменений на диск происходит либо только по явному запросу RegFlushKey,​ либо по завершению процесса);​
 +  - **буфер обмена** (поддерживаются только форматы CF_TEXT, CF_OEMTEXT и RegisterClipboardFormat,​ причем перекодировка между форматами не проводится,​ поскольку ANSI-codepageOEM-codepage всезде одинаковые);​
 +А вот список того, чего здесь нет:
 +
 +  - //​многозадачности/​многопоточности//​ (вызов CreateThread не реализован);​
 +  - //​раздельных адресных пространств//​ (все задачи выполняются в единой области памяти,​ что в частности,​ делает невозможным запуск из FAR'а программ без релокаций,​ поскольку они хотят исполняться в уже занятым FAR'​ом регионе памяти и не могут быть перемещены на другое место, ведь таблицы перемещаемых элементов у них нет);
 +  - //​сети//​ (библиотека WINSOCK.DLL в doswin32 не реализована,​ а это значит,​ что мы не можем взаимодействовать с сетью "​напрямую",​ тем не менее какая-то сетевая поддержка в MS-DOS все-таки есть, в частности она может монтировать сетевые диски NovellNetware,​ которые замечательно видит doswin32);
 +  - //​поддержки ////NTFS// (наверное,​ это самый больной вопрос,​ препятствующий использованию doswin32 как системной дискетки для "​починки"​ упавшей NT, тем не менее мы можем использовать NTFS-драйвера от сторонних производителей,​ подробнее о которых рассказывается в моей книге "​Техника восстановления данных",​ к тому есть надежда "​примерить"​ NTFS-for-DOS Мрака Руссиновича и doswin32, чем Харон сейчас и занимается);​
 +  - //​графической и оконной подсистемы //​(функции user32.dll и gdi32.dll не реализованы и доступен лишь текстовой режим)
 +Таким образом,​ doswin32 позволяет запускать не сильно извращенные консольные программы,​ к которым помимо FAR'а относятся компиляторы,​ линкеры,​ отладчики типа TurboDebugger и прочий инструментарий. А настоящему программисту ничего другого для счастья и не нужно! Шутка. На самом деле никто не предлагает устанавливать doswin32 на устаревшее оборудование только затем, чтобы программировать под него (хотя, если вы стеснены в средствах,​ то… почему бы и нет?). Вместо этого мы будем программировать //для// него! Для устаревшего оборудования в смысле,​ которое можно использовать и как "​фундамент"​ встраиваемых систем реального времени,​ и как рабочие станции "​тонких"​ клиентов,​ и еще как черте что. На периферии сплошь и рядом стоит MS-DOS, под которую постоянно простят что-то написать/​дописать,​ но не возвращаться же ради этого в давно забытый,​ похороненный и заброшенный TurboPascal?​! Конечно же нет! Достаточно написать консольное win32-приложение (при желании и под TurboVision),​ использующее "​плоскую"​ модель память и кучу готовых библиотек,​ откомпилировать его своим любимым компилятором и… запустить в MS-DOS с помощью doswin32!
 +
 +{{doswin32_Image_1.jpg?​553}}
 +
 +Рисунок 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 Байт) — загрузчик для отладчика 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 приложениями. По "​настояниям трудящихся"​ я там сделал возможность их применять,​ но тогда до запуска d////​oswin////​32 нужно установить несколько env-var, описанных в документации — при. Юрия Харона//​). Выход из эмулятора по команде "​exit"​.
 +
 +
 +
 +{{doswin32_Image_2.png?​553}}
 +
 +Рисунок 3 попытка запуска FAR'а под doswin32, запущенным под VMWare приводит к выбросу исключения
 +
 +К сожалению,​ под VM Ware и некоторыми другими эмуляторами при попытке запуска "​тяжеловесных"​ программ наподобие FAR'а или PKZIP'​а doswin32 вылетает с воплем об ошибке (см. рис 3). Под "​борщом"​ (эмулятором BOCHS) PKZIP уже запускается,​ но… FAR по-прежнему продолжает не работать:​ обламывается с поиском языковых файлов и тихо кончает в черный экран. Так проявляют себя ошибки эмулятора,​ для исправления которых к статье прилагается специальный патч, подготовленный Юрием Хароном (не ищите его ни на официальном сайте борща, ни на сайте самого doswin32. Это 100% эксклюзив). Просто скопируйте файлы в директорию исходных текстов борща версии 2.1.1 (//​**внимание**////​! совместимость с остальными версиями не гарантирована!//​) и перекомпилируйте проект. Теперь FAR запускается как ни в чем не бывало и черный экран окрашивается в приятный голубой цвет.
 +
 +{{doswin32_Image_3.png?​553}}
 +
 +Рисунок 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'​ах,​ самостоятельно загружая расширитель,​ освобождая пользователей от лишних телодвижений.
 +
 +{{doswin32_Image_4.png?​553}}
 +
 +Рисунок 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, но и память он использует (по нынешним временам) не оптимально. Ну а дальше "​понеслось"​ :)
 +
 +===== >>>​ врезка ссылки по теме =====
 +
 +  - **DosWin****32**:​
 +    - официальный сайт поддержки,​ с которого можно выкачать исполнительное ядро системы,​ документацию,​ дополнительные утилиты,​ и другую полезную всячину:​ __http____://​____www____.____doswin____32.____com__;​
 +  - **FreeDOS****project**:​
 +    - бесплатный клон MS-DOS, доступный для скачивания в виде готовых образов:​ __http____://​____www____.____freedos____.____org__;​
 +  - **BOCHS**:
 +    - бесплатный эмулятор 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__;​
 +