#ifndef _RAR_HEADERS_ #define _RAR_HEADERS_ #define SIZEOF_MARKHEAD 7 #define SIZEOF_OLDMHD 7 #define SIZEOF_NEWMHD 13 #define SIZEOF_OLDLHD 21 #define SIZEOF_NEWLHD 32 #define SIZEOF_SHORTBLOCKHEAD 7 #define SIZEOF_LONGBLOCKHEAD 11 #define SIZEOF_SUBBLOCKHEAD 14 #define SIZEOF_COMMHEAD 13 #define SIZEOF_PROTECTHEAD 26 #define SIZEOF_AVHEAD 14 #define SIZEOF_SIGNHEAD 15 #define SIZEOF_UOHEAD 18 #define SIZEOF_MACHEAD 22 #define SIZEOF_EAHEAD 24 #define SIZEOF_BEEAHEAD 24 #define SIZEOF_STREAMHEAD 26 #define PACK_VER 29 #define PACK_CRYPT_VER 29 #define UNP_VER 36 #define CRYPT_VER 29 #define AV_VER 20 #define PROTECT_VER 20 #define MHD_VOLUME 0x0001U #define MHD_COMMENT 0x0002U #define MHD_LOCK 0x0004U #define MHD_SOLID 0x0008U #define MHD_PACK_COMMENT 0x0010U #define MHD_NEWNUMBERING 0x0010U #define MHD_AV 0x0020U #define MHD_PROTECT 0x0040U #define MHD_PASSWORD 0x0080U #define MHD_FIRSTVOLUME 0x0100U #define MHD_ENCRYPTVER 0x0200U #define LHD_SPLIT_BEFORE 0x0001U #define LHD_SPLIT_AFTER 0x0002U #define LHD_PASSWORD 0x0004U #define LHD_COMMENT 0x0008U #define LHD_SOLID 0x0010U #define LHD_WINDOWMASK 0x00e0U #define LHD_WINDOW64 0x0000U #define LHD_WINDOW128 0x0020U #define LHD_WINDOW256 0x0040U #define LHD_WINDOW512 0x0060U #define LHD_WINDOW1024 0x0080U #define LHD_WINDOW2048 0x00a0U #define LHD_WINDOW4096 0x00c0U #define LHD_DIRECTORY 0x00e0U #define LHD_LARGE 0x0100U #define LHD_UNICODE 0x0200U #define LHD_SALT 0x0400U #define LHD_VERSION 0x0800U #define LHD_EXTTIME 0x1000U #define LHD_EXTFLAGS 0x2000U #define SKIP_IF_UNKNOWN 0x4000U #define LONG_BLOCK 0x8000U #define EARC_NEXT_VOLUME 0x0001U // not last volume #define EARC_DATACRC 0x0002U // store CRC32 of RAR archive (now used only in volumes) #define EARC_REVSPACE 0x0004U // reserve space for end of REV file 7 byte record #define EARC_VOLNUMBER 0x0008U // store a number of current volume enum HEADER_TYPE { MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74,COMM_HEAD=0x75,AV_HEAD=0x76, SUB_HEAD=0x77,PROTECT_HEAD=0x78,SIGN_HEAD=0x79,NEWSUB_HEAD=0x7a, ENDARC_HEAD=0x7b }; enum { EA_HEAD=0x100,UO_HEAD=0x101,MAC_HEAD=0x102,BEEA_HEAD=0x103, NTACL_HEAD=0x104,STREAM_HEAD=0x105 }; enum HOST_SYSTEM { HOST_MSDOS=0,HOST_OS2=1,HOST_WIN32=2,HOST_UNIX=3,HOST_MACOS=4, HOST_BEOS=5,HOST_MAX }; #define SUBHEAD_TYPE_CMT "CMT" #define SUBHEAD_TYPE_ACL "ACL" #define SUBHEAD_TYPE_STREAM "STM" #define SUBHEAD_TYPE_UOWNER "UOW" #define SUBHEAD_TYPE_AV "AV" #define SUBHEAD_TYPE_RR "RR" #define SUBHEAD_TYPE_OS2EA "EA2" #define SUBHEAD_TYPE_BEOSEA "EABE" /* new file inherits a subblock when updating a host file */ #define SUBHEAD_FLAGS_INHERITED 0x80000000 #define SUBHEAD_FLAGS_CMT_UNICODE 0x00000001 struct OldMainHeader { byte Mark[4]; ushort HeadSize; byte Flags; }; struct OldFileHeader { uint PackSize; uint UnpSize; ushort FileCRC; ushort HeadSize; uint FileTime; byte FileAttr; byte Flags; byte UnpVer; byte NameSize; byte Method; }; struct MarkHeader { byte Mark[7]; }; struct BaseBlock { ushort HeadCRC; HEADER_TYPE HeadType;//byte ushort Flags; ushort HeadSize; bool IsSubBlock() { if (HeadType==SUB_HEAD) return(true); if (HeadType==NEWSUB_HEAD && (Flags & LHD_SOLID)!=0) return(true); return(false); } }; struct BlockHeader:BaseBlock { union { uint DataSize; uint PackSize; }; }; struct MainHeader:BaseBlock { ushort HighPosAV; uint PosAV; byte EncryptVer; }; #define SALT_SIZE 8 struct FileHeader:BlockHeader { uint UnpSize; byte HostOS; uint FileCRC; uint FileTime; byte UnpVer; byte Method; ushort NameSize; union { uint FileAttr; uint SubFlags; }; /* optional */ uint HighPackSize; uint HighUnpSize; /* names */ char FileName[NM]; wchar FileNameW[NM]; /* optional */ Array SubData; byte Salt[SALT_SIZE]; RarTime mtime; RarTime ctime; RarTime atime; RarTime arctime; /* dummy */ int64 FullPackSize; int64 FullUnpSize; void Clear(size_t SubDataSize) { SubData.Alloc(SubDataSize); Flags=LONG_BLOCK; SubFlags=0; } bool CmpName(const char *Name) { return(strcmp(FileName,Name)==0); } FileHeader& operator = (FileHeader &hd) { SubData.Reset(); memcpy(this,&hd,sizeof(*this)); SubData.CleanData(); SubData=hd.SubData; return(*this); } }; struct EndArcHeader:BaseBlock { uint ArcDataCRC; // optional archive CRC32 ushort VolNumber; // optional current volume number }; // SubBlockHeader and its successors were used in RAR 2.x format. // RAR 3.x uses FileHeader with NEWSUB_HEAD HeadType for subblocks. struct SubBlockHeader:BlockHeader { ushort SubType; byte Level; }; struct CommentHeader:BaseBlock { ushort UnpSize; byte UnpVer; byte Method; ushort CommCRC; }; struct ProtectHeader:BlockHeader { byte Version; ushort RecSectors; uint TotalBlocks; byte Mark[8]; }; struct AVHeader:BaseBlock { byte UnpVer; byte Method; byte AVVer; uint AVInfoCRC; }; struct SignHeader:BaseBlock { uint CreationTime; ushort ArcNameSize; ushort UserNameSize; }; struct UnixOwnersHeader:SubBlockHeader { ushort OwnerNameSize; ushort GroupNameSize; /* dummy */ char OwnerName[NM]; char GroupName[NM]; }; struct EAHeader:SubBlockHeader { uint UnpSize; byte UnpVer; byte Method; uint EACRC; }; struct StreamHeader:SubBlockHeader { uint UnpSize; byte UnpVer; byte Method; uint StreamCRC; ushort StreamNameSize; /* dummy */ byte StreamName[NM]; }; struct MacFInfoHeader:SubBlockHeader { uint fileType; uint fileCreator; }; #endif