Binary Format för sammansatt fil - Compound File Binary Format

Compound File Binary Format (CFBF), även kallad Compound File , Compound Document Format eller Composite Document File V2 Document (CDF), är ett sammansatt dokumentfilformat för lagring av många filer och strömmar i en enda fil på en disk. CFBF är utvecklad av Microsoft och är en implementering av Microsoft COM Structured Storage .

Microsoft har öppnat formatet för användning av andra och det används nu i en mängd olika program från Microsoft Word och Microsoft Access till Business Objects. Det utgör också grunden för Advanced Authoring Format .

Översikt

I det enklaste är Compound File Binary Format en behållare, med liten begränsning av vad som kan lagras i det.

En CFBF-filstruktur liknar löst ett FAT- filsystem . Filen är indelad i sektorer som är kedjade tillsammans med en filallokeringstabell (får inte misstas med filsystemet med samma namn) som innehåller kedjor av sektorer som är relaterade till varje fil, en katalog innehåller information för innehöll filer med ett sektor-ID (SID) för startkedjan i en kedja och så vidare.

Strukturera

CFBF-filen består av en 512-Byte header-post följt av ett antal sektorer vars storlek definieras i rubriken. Litteraturen definierar sektorer till att vara antingen 512 eller 4096 byte i längd, även om formatet potentiellt kan stödja sektorer som sträcker sig i storlek från 128-Bytes och uppåt med krafter på 2 (128, 256, 512, 1024, etc.). Den lägre gränsen på 128 är det minsta som krävs för att passa en enda katalogpost i en katalogsektor.

Det finns flera typer av sektorer som kan finnas i en CFBF:

  • File Allocation Table (FAT) Sector - innehåller kedjor av sektorindex precis som en FAT gör i FAT / FAT32-filsystemen
  • MiniFAT-sektorer - liknar FAT men lagrar kedjor av minisektorer inom Mini-Stream
  • Dubbelindirekt FAT (DIFAT) sektor - innehåller kedjor av FAT-sektorindex
  • Katalogsektor - innehåller katalogposter
  • Stream Sector - innehåller godtyckliga fildata
  • Range Lock Sector - innehåller låsområdet för byteområde för en stor fil

Mer information ges nedan för rubriken och varje sektortyp.

CFBF Header-format

CFBF Header upptar de första 512 byte av filen och information som krävs för att tolka resten av filen. C-Style-strukturdeklarationen nedan (extraherad från AAFA: s lågnivåbehållarspecifikation) visar medlemmarna i CFBF-rubriken och deras syfte:

 typedef unsigned long ULONG;    // 4 Bytes
 typedef unsigned short USHORT;  // 2 Bytes
 typedef short OFFSET;           // 2 Bytes
 typedef ULONG SECT;             // 4 Bytes
 typedef ULONG FSINDEX;          // 4 Bytes
 typedef USHORT FSOFFSET;        // 2 Bytes
 typedef USHORT WCHAR;           // 2 Bytes
 typedef ULONG DFSIGNATURE;      // 4 Bytes
 typedef unsigned char BYTE;     // 1 Byte
 typedef unsigned short WORD;    // 2 Bytes
 typedef unsigned long DWORD;    // 4 Bytes
 typedef ULONG SID;              // 4 Bytes
 typedef GUID CLSID;             // 16 Bytes

 struct StructuredStorageHeader { // [offset from start (bytes), length (bytes)]
     BYTE _abSig[8];             // [00H,08] {0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1,
                                 // 0x1a, 0xe1} for current version
     CLSID _clsid;               // [08H,16] reserved must be zero (WriteClassStg/
                                 // GetClassFile uses root directory class id)
     USHORT _uMinorVersion;      // [18H,02] minor version of the format: 33 is
                                 // written by reference implementation
     USHORT _uDllVersion;        // [1AH,02] major version of the dll/format: 3 for
                                 // 512-byte sectors, 4 for 4 KB sectors
     USHORT _uByteOrder;         // [1CH,02] 0xFFFE: indicates Intel byte-ordering
     USHORT _uSectorShift;       // [1EH,02] size of sectors in power-of-two;
                                 // typically 9 indicating 512-byte sectors
     USHORT _uMiniSectorShift;   // [20H,02] size of mini-sectors in power-of-two;
                                 // typically 6 indicating 64-byte mini-sectors
     USHORT _usReserved;         // [22H,02] reserved, must be zero
     ULONG _ulReserved1;         // [24H,04] reserved, must be zero
     FSINDEX _csectDir;          // [28H,04] must be zero for 512-byte sectors,
                                 // number of SECTs in directory chain for 4 KB
                                 // sectors
     FSINDEX _csectFat;          // [2CH,04] number of SECTs in the FAT chain
     SECT _sectDirStart;         // [30H,04] first SECT in the directory chain
     DFSIGNATURE _signature;     // [34H,04] signature used for transactions; must
                                 // be zero. The reference implementation
                                 // does not support transactions
     ULONG _ulMiniSectorCutoff;  // [38H,04] maximum size for a mini stream;
                                 // typically 4096 bytes
     SECT _sectMiniFatStart;     // [3CH,04] first SECT in the MiniFAT chain
     FSINDEX _csectMiniFat;      // [40H,04] number of SECTs in the MiniFAT chain
     SECT _sectDifStart;         // [44H,04] first SECT in the DIFAT chain
     FSINDEX _csectDif;          // [48H,04] number of SECTs in the DIFAT chain
     SECT _sectFat[109];         // [4CH,436] the SECTs of first 109 FAT sectors
 };

File Allocation Table (FAT) sektorer

När samlingen av FAT-sektorer sammanförs som en enda ström definierar status och koppling för varje sektor i filen. Varje post i FAT är 4 byte i längd och innehåller sektornumret för nästa sektor i en FAT-kedja eller ett av följande specialvärden:

  • FREESECT (0xFFFFFFFF) - anger en oanvänd sektor
  • ENDOFCHAIN ​​(0xFFFFFFFE) - markerar den sista sektorn i en FAT-kedja
  • FATSECT (0xFFFFFFFD) - markerar en sektor som används för att lagra en del av FAT
  • DIFSECT (0xFFFFFFFC) - markerar en sektor som används för att lagra en del av DIFAT

Range Lock Sector

Den Range Lock Sector måste finnas i filer som är större än 2 GB i storlek och får inte finnas i filer som är mindre än 2 GB. Range Lock Sector måste innehålla byteområdet 0x7FFFFF00 till 0x7FFFFFFF i filen. Detta område är reserverat av Microsofts COM-implementering för lagring av låsinformation för byteområde för samtidig åtkomst.

Ordlista

  • FAT - File Allocation Table, även känd som: SAT - Sector Allocation Table
  • DIFAT - Dubbelindirekt filtilldelningstabell
  • FAT Chain - en grupp FAT-poster som anger de sektorer som tilldelats en ström i filen
  • Stream - en virtuell fil som upptar ett antal sektorer inom CFBF
  • Sektor - tilldelningsenheten inom CFBF, vanligtvis 512 eller 4096 Bytes i längd

Se även

referenser

externa länkar