Compound File Binary Format (CFBF), также называемый Compound File , Compound Document format , [1] или Composite Document File V2 [2] (CDF), — это формат файла составного документа для хранения множества файлов и потоков в одном файле на диске. CFBF разработан корпорацией Microsoft и является реализацией Microsoft COM Structured Storage . [3] [4] [5] Формат файла используется для хранения объектов хранения и потоковых объектов в иерархической структуре в одном файле. [6]
Microsoft открыла формат для использования другими, и теперь он используется в различных программах от Microsoft Word и Microsoft Access до Business Objects. [ требуется ссылка ] Он также составляет основу Advanced Authoring Format . [7]
В простейшем случае двоичный формат составного файла представляет собой контейнер с небольшими ограничениями на то, что может в нем храниться.
Структура файла CFBF в общих чертах напоминает файловую систему FAT . Файл разделен на сектора , которые соединены вместе с таблицей размещения файлов (не путать с одноименной файловой системой), которая содержит цепочки секторов, относящихся к каждому файлу, каталог содержит информацию о содержащихся файлах с идентификатором сектора (SID) для начального сектора цепочки и т. д.
Файл CFBF состоит из 512-байтовой записи заголовка, за которой следует ряд секторов, размер которых определен в заголовке. В литературе секторы определяются как имеющие длину 512 или 4096 байт, хотя формат потенциально способен поддерживать секторы размером от 128 байт и выше в степенях 2 (128, 256, 512, 1024 и т. д.). Нижний предел в 128 — это минимум, необходимый для размещения одной записи каталога в секторе каталога. [ релевантно? ]
В CFBF могут присутствовать несколько типов секторов:
Более подробная информация о заголовке и каждом типе сектора приведена ниже.
Заголовок CFBF занимает первые 512 байт файла и информацию, необходимую для интерпретации остальной части файла. Декларация структуры в стиле C ниже (извлеченная из спецификации контейнера низкого уровня 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 байт, // количество SECT в цепочке каталогов для секторов размером 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] первый SECT в цепочке 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 или одно из следующих специальных значений:
Range Lock Sector должен существовать в файлах размером более 2 ГБ и не должен существовать в файлах размером менее 2 ГБ. Range Lock Sector должен содержать диапазон байтов от 0x7FFFFF00 до 0x7FFFFFFF в файле. Эта область зарезервирована реализацией COM от Microsoft для хранения информации о блокировке байтового диапазона для одновременного доступа.