/* Игра: Fallout 1 Формат: DAT Сжатие: LZSS или нет Защита: Нет Автор: Кубышев Владимир Адрес: http://andrey.wom.ru/mrripper Почта: crom@echo.ru */ Формат не имеет никакого ярко выраженного начала. Заголовок формата: struct { long nDirs; //количество директорий в FAT long ?????; long ?????; //всегда 0 (?) WORD ?????; WORD ?????; } DAT_header; Описание элемента FAT: Сразу за заголовком идет FAT, разделенная на 2 части: 1. Директории struct { BYTE DirLen; //Длина строки имени (без завершающего 0) char Dir[DirLen]; //Имя директотрии } DIRItem; Такая структура повторяется nDirs раз и описывает одну директотрию. Директория с именем "." означает корневую. 2. Файлы Список файлов поделен на группы. Каждая группа соответствует своей директории. Группы идут в порядке объявления директорий, т.е. сначала файлы, принадлежащие корневой директории (если есть такие), а потом другие. 2.1 Заголовок группы Перед каждой группой файлов находится заголовок со следующей структурой: struct { long nFiles; //количество файлов в группе long ??????; long ??????; WORD ??????; WORD ??????; } GroupItem; 2.2 Список файлов группы struct { BYTE NameLen; //Длина строки имени (без завершающего 0) char Name[NameLen]; //Имя файла long Flag; //Если равен 0x40, значит файл упакован long Offset; //Абсолютное смещение от начала DAT файла long Unpacked; //Размер распакованного файла long Packed; //Размер упакованного файла (у неупакованных файлов = 0) } FileItem; Такая структура повторяется nFiles раз и описывает один файл группы. После идет следующая группа и тд. После все групп находятся непосредственно сами файлы. Пояснение: допустим такая структура файлов: \ | |----FILE1.TXT |----FILE2.TXT |----FILE3.TXT |----DIR1 | | | |----FILE4.TXT | |----FILE5.TXT | |----DIR2 | | | |----FILE6.TXT |----DIR3 | |----FILE7.TXT В DAT файле это будет выглядеть так: [DAT header] . DIR1 DIR1\DIR2 DIR3 [Group header] FILE1.TXT\ FILE2.TXT |- принадлежат . FILE3.TXT/ [Group header] FILE4.TXT\ FILE5.TXT/ принадлежат DIR1 [Group header] FILE6.TXT- принадлежит DIR2 [Group header] FILE7.TXT- принадлежит DIR3 [Files] -------------------------------------------------------------- Замечание о сжатии. Некоторые файлы сжаты алгоритмом LZSS. Все сжатые файлы делятся на блоки по 4-5 Кбайт. Поэтому структуру сжатого файла можно представить как: struct { WORD BlockSize; //Размер сжатого блока BYTE Block[BlockSize]; } PackedBlock; Упакованные файлы могут содержать 1 или больше таких блоков. Отсюда алгоритм распаковки: 1. Читаем размер блока. 2. Читаем блок 3. Распаковываем блок 4. Записываем распакованный блок в файл (дальше будем дописывать) 5. Если файл не закончился, то переходим к п.1 Сам алгоритм декодирования можно взять из исходников плагина к Mr.Ripper'у или поискать в Internet. Не сжатые файлы, естественно, на блоки не разбиты.