Windows 95 на двух флоппиках

    В этом году мы отпраздновали четверть века с Windows 95. Её минимальная установка занимала 30 МБ; народные умельцы ужимали её до 5 МБ после удаления всех «лишних» файлов и сжатия UPX-ом оставшихся. А как насчёт двух флоппиков по 1.44 МБ, вместе с загрузчиком?

    Общий подход я уже описывал в комментариях: создаётся 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 была передана в общественное достояние, то я не нарушаю ничьи авторские права, публикуя образы двух моих флоппиков:

    Источник