Как в Quake.exe внедрили TCP/IP-стек

Как в Quake.exe внедрили TCP/IP-стек

Quake, вышедший в июне 1996 года, пережил три этапа эволюции компьютерных технологий. Появление аппаратного 3D-ускорения, бурное развитие Интернета и смена операционных систем бросили вызов разработчикам, которым пришлось оперативно адаптировать игру под новые реалии.

Рост Windows 95 и Windows NT

С активным продвижением Windows 95 и Windows NT компания Microsoft постепенно отходила от MS-DOS. В период с 1996 по 1997 год доля DOS на пользовательских ПК сократилась вдвое. В то время как Blizzard North рисковала и выпускала Diablo исключительно для Windows 95, id Software реализовала единый исполняемый файл quake.exe, запускавшийся и в DOS, и в Windows.

Удивительно, но TCP/IP-стек Quake оказался надёжнее встроенного в Windows 95. Разберёмся, как разработчикам это удалось.

Обзор quake.exe

quake.exe — это MS-DOS-программа, скомпилированная под расширитель DJGPP. Если для DOOM использовался Watcom, то для кросс-компиляции Quake на Alpha-серверах применили GCC-порт DJGPP.

$ file quake.exe  
quake.exe: MS-DOS executable, COFF for MS-DOS, DJGPP go32 DOS extender

Как и DOS/4GW от Watcom, DJGPP добавляет к 16-битному DOS-режиму плоскую 32-битную адресацию. Клиент расширителя встроен в quake.exe, сервер — в cwsdpmi.exe. С самого начала id Software договорилась с разработчиками DJGPP об обеспечении совместимости DPMI-клиента как с собственным сервером, так и с Windows 95 DPMI.

Схема DPMI

«Программа писалась под собственный DOS-расширитель, но на практике общалась с DPMI-хостом Windows.»
— Реймонд Чен

Именно благодаря поддержке DPMI Windows 95 quake.exe одинаково хорошо работал и в DOS, и в Win95.

Запуск в DOS

В отличие от DOOM, где нужно было всего два файла, у Quake их десяток. Для игры в DOS достаточно четырёх: quake.exe, config.cfg, pak0.pak и cwsdpmi.exe.

./quake.exe
./id1/config.cfg
./id1/pak0.pak
./cwsdpmi.exe

Сетевые режимы в DOS

Quake предлагал четыре сетевых протокола. Два — для 1vs1 (модем и «Direct Connection» через COM-порт), два — для групповых матчей: IPX (LAN) и TCP/IP (глобальная сеть). По умолчанию IPX и TCP/IP в DOS были отключены.

Подключение IPX и TCP/IP

Файл PDIPX.EXE загружал TSR-драйвер IPX, позволяя Quake обнаруживать его и включать IPX-режим. TCP/IP требовал платного TSR BWNFS от Beame & Whiteside, стоившего $395 (≈ $830 в 2025 г.). Вряд ли многие играли в Quake под DOS по TCP/IP.

Запуск в Windows 95

В Win95 quake.exe запускался в эмуляторе DOS со встроенным DPMI-сервером. Пользователи избавлялись от настройки звуковой карты через BLASTER, но Windows 95 требовала не 8, а 16 МиБ ОЗУ. Файловый состав оставался прежним, за исключением того, что cwsdpmi.exe не использовался.

./quake.exe
./id1/config.cfg
./id1/pak0.pak

Скрипт q95.bat

С запуском через q95.bat Quake «туннелировался» в WinSock через Mpath. Всплывающее окно «Launching Quake» сообщает, что игра работает поверх Microsoft TCP/IP.

Mpath и Chunnel

Mpath Interactive предоставляла сервис для поиска игровых сессий в Интернете. Через их «Gizmo» игроки могли выбирать «комнаты», общаться в чате и сразу подключаться к матчам. Интеграция требовала порта исходного кода Quake, чтобы клиент и сервер взаимодействовали с их инфраструктурой.

«Мы лицензировали Chunnel для Quake DOS, чтобы он мог работать в Mplayer и подключаться к нашим серверам.»
— Ларри Хастингс, Mpath Interactive

Первый Chunnel обеспечивал обмен данными между DOS-клиентом и Winsock через VxD-драйверы и DLL.

Архитектура Chunnel

В qlaunch.exe содержатся функции MPlayer, quakeudp.dll выступает мостом к wsock32.dll, а genvxd.dll вместе с mgenvxd.vxd устанавливают виртуальное устройство для прерывания 0x48. BSD-функции сокетов в mpplc.c перенаправляются через DPMI-и Win32-прерывания к Winsock.

Эволюция QuakeWorld

После декабря 1996 г. все DOS-бинарники (последний — vquake.exe) были заменены на чисто Win32-версии (winquake.exe, glquake.exe) с прямым обращением к wsock32.dll.

Ссылки

 

Источник

Читайте также