rlm@1: // Archive/RarHeader.h rlm@1: rlm@1: #ifndef __ARCHIVE_RAR_HEADER_H rlm@1: #define __ARCHIVE_RAR_HEADER_H rlm@1: rlm@1: #include "Common/Types.h" rlm@1: rlm@1: namespace NArchive{ rlm@1: namespace NRar{ rlm@1: namespace NHeader{ rlm@1: rlm@1: const int kMarkerSize = 7; rlm@1: extern Byte kMarker[kMarkerSize]; rlm@1: rlm@1: const int kArchiveSolid = 0x1; rlm@1: rlm@1: namespace NBlockType rlm@1: { rlm@1: enum EBlockType rlm@1: { rlm@1: kMarker = 0x72, rlm@1: kArchiveHeader = 0x73, rlm@1: kFileHeader = 0x74, rlm@1: kCommentHeader = 0x75, rlm@1: kOldAuthenticity = 0x76, rlm@1: kSubBlock = 0x77, rlm@1: kRecoveryRecord = 0x78, rlm@1: kAuthenticity = 0x79, rlm@1: rlm@1: kEndOfArchive = 0x7B // Is not safe rlm@1: }; rlm@1: } rlm@1: rlm@1: namespace NArchive rlm@1: { rlm@1: const UInt16 kVolume = 1; rlm@1: const UInt16 kComment = 2; rlm@1: const UInt16 kLock = 4; rlm@1: const UInt16 kSolid = 8; rlm@1: const UInt16 kNewVolName = 0x10; // ('volname.partN.rar') rlm@1: const UInt16 kAuthenticity = 0x20; rlm@1: const UInt16 kRecovery = 0x40; rlm@1: const UInt16 kBlockEncryption = 0x80; rlm@1: const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later) rlm@1: const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader rlm@1: rlm@1: const int kHeaderSizeMin = 7; rlm@1: rlm@1: struct CBlock rlm@1: { rlm@1: UInt16 CRC; rlm@1: Byte Type; rlm@1: UInt16 Flags; rlm@1: UInt16 Size; rlm@1: UInt16 Reserved1; rlm@1: UInt32 Reserved2; rlm@1: // UInt16 GetRealCRC() const; rlm@1: }; rlm@1: rlm@1: const int kArchiveHeaderSize = 13; rlm@1: rlm@1: const int kBlockHeadersAreEncrypted = 0x80; rlm@1: rlm@1: struct CHeader360: public CBlock rlm@1: { rlm@1: Byte EncryptVersion; rlm@1: bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; } rlm@1: bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; } rlm@1: bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); } rlm@1: UInt32 GetBaseSize() const { return kArchiveHeaderSize + (IsEncryptOld() ? 0 : 1); } rlm@1: }; rlm@1: } rlm@1: rlm@1: namespace NFile rlm@1: { rlm@1: const int kSplitBefore = 1 << 0; rlm@1: const int kSplitAfter = 1 << 1; rlm@1: const int kEncrypted = 1 << 2; rlm@1: const int kComment = 1 << 3; rlm@1: const int kSolid = 1 << 4; rlm@1: rlm@1: const int kDictBitStart = 5; rlm@1: const int kNumDictBits = 3; rlm@1: const int kDictMask = (1 << kNumDictBits) - 1; rlm@1: const int kDictDirectoryValue = 0x7; rlm@1: rlm@1: const int kSize64Bits = 1 << 8; rlm@1: const int kUnicodeName = 1 << 9; rlm@1: const int kSalt = 1 << 10; rlm@1: const int kOldVersion = 1 << 11; rlm@1: const int kExtTime = 1 << 12; rlm@1: // const int kExtFlags = 1 << 13; rlm@1: // const int kSkipIfUnknown = 1 << 14; rlm@1: rlm@1: const int kLongBlock = 1 << 15; rlm@1: rlm@1: /* rlm@1: struct CBlock rlm@1: { rlm@1: // UInt16 HeadCRC; rlm@1: // Byte Type; rlm@1: // UInt16 Flags; rlm@1: // UInt16 HeadSize; rlm@1: UInt32 PackSize; rlm@1: UInt32 UnPackSize; rlm@1: Byte HostOS; rlm@1: UInt32 FileCRC; rlm@1: UInt32 Time; rlm@1: Byte UnPackVersion; rlm@1: Byte Method; rlm@1: UInt16 NameSize; rlm@1: UInt32 Attributes; rlm@1: }; rlm@1: */ rlm@1: rlm@1: /* rlm@1: struct CBlock32 rlm@1: { rlm@1: UInt16 HeadCRC; rlm@1: Byte Type; rlm@1: UInt16 Flags; rlm@1: UInt16 HeadSize; rlm@1: UInt32 PackSize; rlm@1: UInt32 UnPackSize; rlm@1: Byte HostOS; rlm@1: UInt32 FileCRC; rlm@1: UInt32 Time; rlm@1: Byte UnPackVersion; rlm@1: Byte Method; rlm@1: UInt16 NameSize; rlm@1: UInt32 Attributes; rlm@1: UInt16 GetRealCRC(const void *aName, UInt32 aNameSize, rlm@1: bool anExtraDataDefined = false, Byte *anExtraData = 0) const; rlm@1: }; rlm@1: struct CBlock64 rlm@1: { rlm@1: UInt16 HeadCRC; rlm@1: Byte Type; rlm@1: UInt16 Flags; rlm@1: UInt16 HeadSize; rlm@1: UInt32 PackSizeLow; rlm@1: UInt32 UnPackSizeLow; rlm@1: Byte HostOS; rlm@1: UInt32 FileCRC; rlm@1: UInt32 Time; rlm@1: Byte UnPackVersion; rlm@1: Byte Method; rlm@1: UInt16 NameSize; rlm@1: UInt32 Attributes; rlm@1: UInt32 PackSizeHigh; rlm@1: UInt32 UnPackSizeHigh; rlm@1: UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const; rlm@1: }; rlm@1: */ rlm@1: rlm@1: const int kLabelFileAttribute = 0x08; rlm@1: const int kWinFileDirectoryAttributeMask = 0x10; rlm@1: rlm@1: enum CHostOS rlm@1: { rlm@1: kHostMSDOS = 0, rlm@1: kHostOS2 = 1, rlm@1: kHostWin32 = 2, rlm@1: kHostUnix = 3, rlm@1: kHostMacOS = 4, rlm@1: kHostBeOS = 5 rlm@1: }; rlm@1: } rlm@1: rlm@1: namespace NBlock rlm@1: { rlm@1: const UInt16 kLongBlock = 1 << 15; rlm@1: struct CBlock rlm@1: { rlm@1: UInt16 CRC; rlm@1: Byte Type; rlm@1: UInt16 Flags; rlm@1: UInt16 HeadSize; rlm@1: // UInt32 DataSize; rlm@1: }; rlm@1: } rlm@1: rlm@1: /* rlm@1: struct CSubBlock rlm@1: { rlm@1: UInt16 HeadCRC; rlm@1: Byte HeadType; rlm@1: UInt16 Flags; rlm@1: UInt16 HeadSize; rlm@1: UInt32 DataSize; rlm@1: UInt16 SubType; rlm@1: Byte Level; // Reserved : Must be 0 rlm@1: }; rlm@1: rlm@1: struct CCommentBlock rlm@1: { rlm@1: UInt16 HeadCRC; rlm@1: Byte HeadType; rlm@1: UInt16 Flags; rlm@1: UInt16 HeadSize; rlm@1: UInt16 UnpSize; rlm@1: Byte UnpVer; rlm@1: Byte Method; rlm@1: UInt16 CommCRC; rlm@1: }; rlm@1: rlm@1: rlm@1: struct CProtectHeader rlm@1: { rlm@1: UInt16 HeadCRC; rlm@1: Byte HeadType; rlm@1: UInt16 Flags; rlm@1: UInt16 HeadSize; rlm@1: UInt32 DataSize; rlm@1: Byte Version; rlm@1: UInt16 RecSectors; rlm@1: UInt32 TotalBlocks; rlm@1: Byte Mark[8]; rlm@1: }; rlm@1: */ rlm@1: rlm@1: }}} rlm@1: rlm@1: #endif