Исследование формата файла ресурсов .res и все что с этим связано. Заголовок и таблица элементов (MFT) файла .resMedia форматы в файле ресурса .res.
Заголовок и таблица элементов (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 Значение в поле TableOffset смещение, относительно начала файла до начала таблицы MFT. Результат перехода по смещению - первый элемент таблицы. Далее следуют остальные элементы, в количестве, указанном в поле TableLength . Позиция элемента в таблице определяет индекс элемента. Таким образом определяется и список корневых элементов (root): значение в поле EntryFirst - индекс первого корневого элемента, EntryCount - количество корневых элементов. Начиная с корневых элементов, строится древовидная иерархия элементов. На примере первого элемента. Согласно 4ому целочисленному значению тип элемента - узел (каталог) - структура MftNode. ChildFirst (2 поле) определяет индекс первого дочернего элемента 7, ChildCount (3 поле) - количество дочерних элементов 4. Синим цветом отмечен заголовок Title - строка символов с завершающим нулем. В примере имеет значение "equipment". Размер строки фиксирован - 16 символов. То, что следует после завершающего нуля - мусор. Пример визуализации таблицы MFT ресурсного файла PATCH.RES
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 }