Формат файла ресурсов .res

Тема в разделе 'ОФФ-ТОПИК: Общение игроков', создана пользователем Avis, 17 май 2014.

  1. Avis Аллодер

  2. Avis Аллодер

    Заголовок и таблица элементов (MFT) файла .res

    Каждый ресурсный файл состоит из заголовка и таблицы ресурсов, описывающей расположение различных элементов внутри файла. Структура таблицы ресурсов имеет древовидный характер. Для краткости обозначим эту таблицу как MFT (Master File Table).

    Структура заголовка
    Структура заголовка состоит из 4-ех байтной сигнатуры и 5-ти 4-ех байтных целочисленных значений. Общий размер заголовка 4+4*5=24 байта.
    Код:
    structure ResFileHeader {
            int Signature
            int EntryFirst
            int EntryCount
            int Reserved
            int TableOffset
            int TableLength
    }
    
    Signature
    Сигнатура имеет значение 26h:59h:41h:31h, в символьном представлении "&YA1".
    EntryFirst
    Индекс первого корневого элемента MFT.
    EntryCount
    Количество корневых элементов MFT.
    Reserved
    (Имеет значение, смысл которого от меня ускользнул)
    TableOffset
    Смещение в байтах, относительно начала файла, до таблицы MFT. Таблица MFT начинается непосредственно с первого элемента.
    TableLength
    Общее количество элементов таблицы MFT.

    Структуры элементов таблицы MFT.
    Структура элемента состоит из 4-ех целочисленных значений и 16ти байтового символьного заголовка. Общий размер элемента МFT 4х4+16=32 байта. Элементы MFT можно разделить на 2 категории - элементы описывающие древовидную иерархию и элементы описывающие блок данных в файле ресурсов. То есть, представляют из себя каталоги и файлы. Различить их можно по 4ому целочисленному значению.
    Общий вид структуры элемента:
    Код:
    structure MftEntry {
            int Value1
            int Value2
            int Value3
            int Type
            char[] Title
    }
    
    Type
    Тип элемента. Значение 1 - узел (node) древовидной структуры (представим как каталог, папка, etc...). Значение 0 - элемент данных (item), описывающий расположение и тип ресурса.
    Title
    Заголовок элемента. Размер фиксирован и составляет 16 байт. Строка символов должна заканчиваться 0. Для элемента данных (item), содержит расширение, то есть представим как файл filename.ext.

    Значение Value1 для всех типов элементов всегда 0.

    Таким образом структура MftEntry для узлов и элементов данных, может быть скорректирована так:
    Код:
    structure MftNode {
            int Reserved
            int ChildFirst
            int ChildCount
            int Type
            char[] Title
    }
    
    Reserved
    Всегда 0.
    ChildFirst
    Индекс первого дочернего элемента.
    ChildCount
    Количество дочерних элементов.
    Type
    Здесь всегда 1.
    Title
    Заголовок элемента.
    Код:
    structure MftItem {
            int Reserved
            int Offset
            int Size
            int Type
            char[] Title
    }
    
    Reserved
    Всегда 0.
    Offset
    Смещение относительно начала файла до начала блока данных.
    Size
    Размер блока данных.
    Type
    Здесь всегда 0.
    Title
    Заголовок элемента.


    Проиллюстрирую выше сказанное.

    Заголовок файла .res в Hex редакторе. В порядке следования: Signature, EntryFirst, EntryCount, Reserved, TableOffset, TableLength
    [IMG]
    Значение в поле TableOffset смещение, относительно начала файла до начала таблицы MFT. Результат перехода по смещению - первый элемент таблицы.
    [IMG]
    Далее следуют остальные элементы, в количестве, указанном в поле TableLength . Позиция элемента в таблице определяет индекс элемента. Таким образом определяется и список корневых элементов (root): значение в поле EntryFirst - индекс первого корневого элемента, EntryCount - количество корневых элементов. Начиная с корневых элементов, строится древовидная иерархия элементов.
    На примере первого элемента. Согласно 4ому целочисленному значению тип элемента - узел (каталог) - структура MftNode. ChildFirst (2 поле) определяет индекс первого дочернего элемента 7, ChildCount (3 поле) - количество дочерних элементов 4. Синим цветом отмечен заголовок Title - строка символов с завершающим нулем. В примере имеет значение "equipment". Размер строки фиксирован - 16 символов. То, что следует после завершающего нуля - мусор.

    Пример визуализации таблицы MFT ресурсного файла PATCH.RES :)
    [IMG]

    Вложения:

    Redeemer нравится это.
  3. Avis Аллодер

    Media форматы в файле ресурса .res

    Текст представлен элементами MFT с расширением "txt".

    Звук представлен элементами MFT с расширением "wav".

    Графические форматы.

    Элементы MFT, содержащие графику имеют расширения "bmp", "png", "16a", "256".
    Графическую информацию также содержат элементы MFT с расширениями .16а, .256. Структуры .16а, .256 эквивалентны. К сожалению у меня нет достоверной информации по способу хранения непосредственно графической информации. Косвенная же информация указывает на то, что изображение кодируется методами схожими с RLE кодированием применяемыми в формате BMP (клоны RLE4 и RLE8 для 256 и 16a соответственно).

    Структуры .16а, .256
    Блок данных на который ссылается элемент MFT начинается с палитры, имеющий фиксированный размер 1024 байта. Палитра 256 цветов, где цвет описывается стандартной структурой RGBQUAD.
    После палитры следуют блоки данных, состоящих из заголовка и собственно данных. Заголовок занимает 12 байт. Блок может быть представлен структурой вида:
    Код:
    structure Sprite {
            int Width
            int Height
            int Size
            byte[] Data
    }
    
    Width
    Ширина изображения
    Height
    Высота изображения
    Size
    Размер данных содержащих изображение.
    Data
    Блок данных, содержащий изображение, в байтах в количестве указанном в поле Size.

    За последним блоком Sprite следует 2-ух байтное целое, содержащее количество блоков Sprite и 2-ух байтный трейлер окончания, имеющий фиксированное значение. Таким образом итоговая структура блоков 16а и 256 может быть представлена как:
    Код:
    structure Extention16a256 {
            byte[] Palette
            Sprite[] Sprites
            short SpriteCount
            short Trailer
    }
    
    Redeemer нравится это.

Поделиться этой страницей