Двоичный формат составного файла (CFBF), также называемый Составной файл, Формат составного документа или Файл составного документа V2 (CDF) - это составной формат файла документа для хранения множества файлов и потоков в одном файле. на диске. CFBF разработан Microsoft и является реализацией Microsoft COM Structured Storage.
Microsoft открыла формат для использования другими, и теперь он используется во множестве программ от Microsoft Word и Microsoft Access для Business Objects. Он также составляет основу Advanced Authoring Format.
В самом простом случае двоичный формат составного файла представляет собой контейнер с небольшими ограничениями о том, что в нем можно хранить.
Файловая структура CFBF примерно напоминает файловую систему FAT . Файл разделен на секторы, которые связаны вместе с таблицей размещения файлов (не путать с файловой системой с тем же именем), которая содержит цепочки секторов, связанных с каждым файлом, каталог содержит информацию для содержащихся файлов с идентификатором сектора. (SID) для начального сектора цепочки и так далее.
Файл CFBF состоит из 512-байтовой записи заголовка, за которой следует ряд секторов, размер которых определен в заголовке. В литературе определяется, что секторы имеют длину 512 или 4096 байт, хотя формат потенциально способен поддерживать секторы размером от 128 байт и выше в степени 2 (128, 256, 512, 1024 и т. Д.). Нижний предел 128 - это минимум, необходимый для размещения одной записи каталога в секторе каталога.
В CFBF могут присутствовать несколько типов секторов:
Ниже приводится более подробная информация о заголовке и каждом типе сектора.
Заголовок CFBF занимает первые 512 байтов файла и информацию, необходимую для интерпретации остальной части файла. Объявление структуры C-Style ниже (извлеченное из спецификации низкоуровневого контейнера AAFA) показывает элементы заголовка CFBF и их назначение:
typedef unsigned long ULONG; // 4 байта typedef unsigned short USHORT; // 2 байта typedef short OFFSET; // 2 байта typedef ULONG SECT; // 4 байта typedef ULONG FSINDEX; // 4 байта typedef USHORT FSOFFSET; // 2 байта typedef USHORT WCHAR; // 2 байта typedef ULONG DFSIGNATURE; // 4 байта typedef unsigned char BYTE; // 1 байт typedef unsigned short WORD; // 2 байта typedef unsigned long DWORD; // 4 байта typedef ULONG SID; // 4 байта typedef GUID CLSID; // 16 байтов struct StructuredStorageHeader {// [смещение от начала (байты), длина (байты)] BYTE _abSig [8]; // [00H, 08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, // 0x1a, 0xe1} для текущей версии CLSID _clsid; // [08H, 16] зарезервировано должно быть равно нулю (WriteClassStg / // GetClassFile использует идентификатор класса корневого каталога) USHORT _uMinorVersion; // [18H, 02] второстепенная версия формата: 33 // записана ссылочной реализацией USHORT _uDllVersion; // [1AH, 02] основная версия dll / формат: 3 для // секторов размером 512 байт, 4 для секторов размером 4 КБ USHORT _uByteOrder; // [1CH, 02] 0xFFFE: указывает порядок байтов Intel USHORT _uSectorShift; // [1EH, 02] размер секторов в степени двойки; // обычно 9 с указанием 512-байтовых секторов USHORT _uMiniSectorShift; // [20H, 02] размер мини-секторов в степени двойки; // обычно 6, указывающие на 64-байтовые мини-секторы USHORT _usReserved; // [22H, 02] зарезервировано, должно быть нулевым ULONG _ulReserved1; // [24H, 04] зарезервировано, должно быть нулем FSINDEX _csectDir; // [28H, 04] должен быть равен нулю для 512-байтовых секторов, // количество СЕКЦИЙ в цепочке каталогов для // секторов 4 КБ FSINDEX _csectFat; // [2CH, 04] количество SECT в цепочке FAT SECT _sectDirStart; // [30H, 04] первый SECT в цепочке каталогов DFSIGNATURE _signature; // [34H, 04] подпись, используемая для транзакций; // должен быть нулевым. Эталонная реализация // не поддерживает транзакции ULONG _ulMiniSectorCutoff; // [38H, 04] максимальный размер мини-потока; // обычно 4096 байт SECT _sectMiniFatStart; // [3CH, 04] первый СЕКЦИЯ в цепочке MiniFAT FSINDEX _csectMiniFat; // [40H, 04] количество SECT в цепочке MiniFAT SECT _sectDifStart; // [44H, 04] первый SECT в цепочке DIFAT FSINDEX _csectDif; // [48H, 04] количество SECT в цепочке DIFAT SECT _sectFat [109]; // [4CH, 436] SECT первых 109 секторов FAT};
При объединении в единый поток совокупность секторов FAT определяет статус и связь каждого сектора в файле. Каждая запись в FAT имеет длину 4 байта и содержит номер следующего сектора в цепочке FAT или одно из следующих специальных значений:
Сектор блокировки диапазона должен существовать в файлах размером более 2 ГБ и не должен существовать в файлах размером менее 2 ГБ. Сектор блокировки диапазона должен содержать в файле диапазон байтов от 0x7FFFFF00 до 0x7FFFFFFF. Эта область зарезервирована реализацией Microsoft COM для хранения информации о блокировке диапазона байтов для одновременного доступа.