//! The file header is at the start of the SGA archive struct _SgaFileHeader { char* sIdentifier; //!< 8 bytes "_ARCHIVE" unsigned long iVersion; //!< DoW is v2 , CoH is v4 long* iToolMD5; //!< First MD5 wchar_t* sArchiveType; //!< Unicode string (128 bytes - 64 * wchar) long* iMD5; //!< Second MD5 unsigned long iDataHeaderSize; unsigned long iDataOffset; unsigned long iPlatform; //!< v4 only; 1 = win32 }; #pragma pack( push, sga_formats, 1 ) struct _SgaDataHeaderInfo { unsigned long iToCOffset; //!< Where in the data header ToCs start unsigned short int iToCCount; unsigned long iDirOffset; //!< Where in the data header directories start unsigned short int iDirCount; unsigned long iFileOffset; //!< Where in the data header files start unsigned short int iFileCount; unsigned long iItemOffset; //!< Where in the data header strings start unsigned short int iItemCount; }; struct _SgaToC { char sAlias[64]; char sBaseDirName[64]; short unsigned int iStartDir; short unsigned int iEndDir; short unsigned int iStartFile; short unsigned int iEndFile; unsigned long iFolderOffset; //!< Unknown }; struct _SgaDirInfo { unsigned long iNameOffset; short unsigned int iSubDirBegin; short unsigned int iSubDirEnd; short unsigned int iFileBegin; short unsigned int iFileEnd; }; struct _SgaFileInfo { unsigned long iNameOffset; unsigned long iFlags; //!< 0x00 = uncompressed, 0x10 = zlib large file, 0x20 = zlib small file (< 4kb) unsigned long iDataOffset; unsigned long iDataLengthCompressed; unsigned long iDataLength; }; struct _SgaFileInfo4 { unsigned long iNameOffset; unsigned long iDataOffset; unsigned long iDataLengthCompressed; unsigned long iDataLength; unsigned long iModificationTime; unsigned short iFlags; }; #pragma pack( pop, sga_formats)