Files
easy7zip/7zip/Archive/Rar/RarHeader.h
Igor Pavlov 8c1b5c7b7e 3.13
2016-05-28 00:15:41 +01:00

215 lines
4.0 KiB
C++
Executable File

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