Общий подход я уже описывал в комментариях: создаётся RAMDRIVE, и на него разворачивается двухтомный SFX-архив. Но есть много тонкостей:
- Как видно на видео выше, распакованная папка Windows у меня занимает 6.2 МБ. Я взял за основу список файлов Micro95, и дополнительно удалил файлы, оказавшиеся необязательными — например, шрифты и драйвер
dosnet.vxd
. Кроме того,vmm32.vxd
я распаковал, и удалил бывшие внутри него необязательные драйвера.
Можно было уменьшить Windows ещё сильнее, пересобравvmm32.vxd
после удаления необязательных драйверов (освобождается почти мегабайт, но сжимается такойvmm32.vxd
хуже, чем распакованные VXD), заменив оболочку на классический «Диспетчер программ» (освобождается целый мегабайт за счётexplorer.exe
иshell32.dll
), и/или отказавшись от поддержки командной строки (освобождается 155 КБ за счётpifmgr.dll
,vgafull.3gr
,winoa386.mod
); но я решил, что без этих компонентов Windows 95 становится полностью бесполезной.
Со всем этим, на втором флоппике у меня оставались ещё 247 свободных КБ, так что я смог добавить к минимальному набору файлов ещё «Блокнот» и три аплета «Панели управления»; даже и с ними один килобайт на флоппике остался незанятым :-)
Fun fact: среди оставшихся файлов поровну (по 19) 16-битных NE и 32-битных PE, подтверждая байку о том, что Windows 95 была 32-битной ровно наполовину. - Проект Micro95 публиковал минимальное содержимое
system.ini
,win.ini
, и реестра. К ним я тоже подошёл творчески: вsystem.ini
на самом деле достаточно двух строк
[386Enh] mouse=*vmouse
Существованиеwin.ini
необязательно; а с предложенным ими вариантом реестра перестают работать ярлыки, Корзина и Панель управления, так что реестр я урезал менее агрессивно. - Для сжатия Windows лучше всего подошёл WinAce: уровень сжатия у него почти такой же, как у WinRAR, но SFX-модуль для DOS меньше на 32 КБ, и его можно уменьшить ещё на килобайт, пережав UPX-ом c ключом
--ultra-brute
. Ещё 31 КБ удалось выиграть, сжав UPX-ом драйвераhimem.sys
,ramdrive.sys
,ifshlp.sys
- Для того, чтобы работали ярлыки (в т.ч. «Перезагрузка в режиме MS-DOS»), при распаковке Windows должны воссоздаваться длинные имена файлов (LFN). SFX-модули делают это при помощи LFN API, который доступен в MS-DOS 7+ только после загрузки графической среды Windows. Я нашёл опенсорсный драйвер DOSLFN, заброшенный в 2012; к сожалению, под версией DOS, родной для Windows 95, он не работал из-за бага: наличие в DOS поддержки FAT32 определялось некорректно, так что в Windows 95 он думал, что поддержка есть, пытался ей пользоваться, и терпел неудачу. (В DOS 6.x и более старых, а также в Windows 95 OSR2 и более новых, драйвер работал корректно.) Для того, чтобы исправить этот баг, достаточно было закомментировать в исходнике две строчки:
;== 6. Determine the presence of the FAT32 API == mov ax,7302h ;extended get DPB mov dl,0 ;current drive mov cx,3fh ;length of buffer mov di,ofs truename_buf;buffer stc ;for pre-DOS7 int 21h jnc @@ext ; On Win95 4.00.950, it always fails with AX=1 ; cmp ax,7300h ;did it fail because there's no such call? ; jne @@ext ;no, it didn't like the drive
Раз мне всё равно пришлось перекомпилировать DOSLFN, я заодно расставил по всему коду условную компиляцию, чтобы получить возможность уменьшить файл в полтора раза, отключив ненужные мне возможности — переключение языков сообщений, поддержку Unicode, и поддержку CD-ROM. Пропатченный исходник я положил на tyomitch.github.io/doslfn.asm; все мои изменения можно увидеть на github.com/tyomitch/tyomitch.github.io/commit/ad8a2
Поскольку Windows 95 в 2018 была передана в общественное достояние, то я не нарушаю ничьи авторские права, публикуя образы двух моих флоппиков:
demon416nds
В 16 битном режиме она и на одну дискету помнится влазит