rlm@1
|
1 // Archive/RarHeader.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __ARCHIVE_RAR_HEADER_H
|
rlm@1
|
4 #define __ARCHIVE_RAR_HEADER_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "Common/Types.h"
|
rlm@1
|
7
|
rlm@1
|
8 namespace NArchive{
|
rlm@1
|
9 namespace NRar{
|
rlm@1
|
10 namespace NHeader{
|
rlm@1
|
11
|
rlm@1
|
12 const int kMarkerSize = 7;
|
rlm@1
|
13 extern Byte kMarker[kMarkerSize];
|
rlm@1
|
14
|
rlm@1
|
15 const int kArchiveSolid = 0x1;
|
rlm@1
|
16
|
rlm@1
|
17 namespace NBlockType
|
rlm@1
|
18 {
|
rlm@1
|
19 enum EBlockType
|
rlm@1
|
20 {
|
rlm@1
|
21 kMarker = 0x72,
|
rlm@1
|
22 kArchiveHeader = 0x73,
|
rlm@1
|
23 kFileHeader = 0x74,
|
rlm@1
|
24 kCommentHeader = 0x75,
|
rlm@1
|
25 kOldAuthenticity = 0x76,
|
rlm@1
|
26 kSubBlock = 0x77,
|
rlm@1
|
27 kRecoveryRecord = 0x78,
|
rlm@1
|
28 kAuthenticity = 0x79,
|
rlm@1
|
29
|
rlm@1
|
30 kEndOfArchive = 0x7B // Is not safe
|
rlm@1
|
31 };
|
rlm@1
|
32 }
|
rlm@1
|
33
|
rlm@1
|
34 namespace NArchive
|
rlm@1
|
35 {
|
rlm@1
|
36 const UInt16 kVolume = 1;
|
rlm@1
|
37 const UInt16 kComment = 2;
|
rlm@1
|
38 const UInt16 kLock = 4;
|
rlm@1
|
39 const UInt16 kSolid = 8;
|
rlm@1
|
40 const UInt16 kNewVolName = 0x10; // ('volname.partN.rar')
|
rlm@1
|
41 const UInt16 kAuthenticity = 0x20;
|
rlm@1
|
42 const UInt16 kRecovery = 0x40;
|
rlm@1
|
43 const UInt16 kBlockEncryption = 0x80;
|
rlm@1
|
44 const UInt16 kFirstVolume = 0x100; // (set only by RAR 3.0 and later)
|
rlm@1
|
45 const UInt16 kEncryptVer = 0x200; // RAR 3.6 there is EncryptVer Byte in End of MainHeader
|
rlm@1
|
46
|
rlm@1
|
47 const int kHeaderSizeMin = 7;
|
rlm@1
|
48
|
rlm@1
|
49 struct CBlock
|
rlm@1
|
50 {
|
rlm@1
|
51 UInt16 CRC;
|
rlm@1
|
52 Byte Type;
|
rlm@1
|
53 UInt16 Flags;
|
rlm@1
|
54 UInt16 Size;
|
rlm@1
|
55 UInt16 Reserved1;
|
rlm@1
|
56 UInt32 Reserved2;
|
rlm@1
|
57 // UInt16 GetRealCRC() const;
|
rlm@1
|
58 };
|
rlm@1
|
59
|
rlm@1
|
60 const int kArchiveHeaderSize = 13;
|
rlm@1
|
61
|
rlm@1
|
62 const int kBlockHeadersAreEncrypted = 0x80;
|
rlm@1
|
63
|
rlm@1
|
64 struct CHeader360: public CBlock
|
rlm@1
|
65 {
|
rlm@1
|
66 Byte EncryptVersion;
|
rlm@1
|
67 bool IsEncrypted() const { return (Flags & NHeader::NArchive::kBlockEncryption) != 0; }
|
rlm@1
|
68 bool IsThereEncryptVer() const { return (Flags & NHeader::NArchive::kEncryptVer) != 0; }
|
rlm@1
|
69 bool IsEncryptOld() const { return (!IsThereEncryptVer() || EncryptVersion < 36); }
|
rlm@1
|
70 UInt32 GetBaseSize() const { return kArchiveHeaderSize + (IsEncryptOld() ? 0 : 1); }
|
rlm@1
|
71 };
|
rlm@1
|
72 }
|
rlm@1
|
73
|
rlm@1
|
74 namespace NFile
|
rlm@1
|
75 {
|
rlm@1
|
76 const int kSplitBefore = 1 << 0;
|
rlm@1
|
77 const int kSplitAfter = 1 << 1;
|
rlm@1
|
78 const int kEncrypted = 1 << 2;
|
rlm@1
|
79 const int kComment = 1 << 3;
|
rlm@1
|
80 const int kSolid = 1 << 4;
|
rlm@1
|
81
|
rlm@1
|
82 const int kDictBitStart = 5;
|
rlm@1
|
83 const int kNumDictBits = 3;
|
rlm@1
|
84 const int kDictMask = (1 << kNumDictBits) - 1;
|
rlm@1
|
85 const int kDictDirectoryValue = 0x7;
|
rlm@1
|
86
|
rlm@1
|
87 const int kSize64Bits = 1 << 8;
|
rlm@1
|
88 const int kUnicodeName = 1 << 9;
|
rlm@1
|
89 const int kSalt = 1 << 10;
|
rlm@1
|
90 const int kOldVersion = 1 << 11;
|
rlm@1
|
91 const int kExtTime = 1 << 12;
|
rlm@1
|
92 // const int kExtFlags = 1 << 13;
|
rlm@1
|
93 // const int kSkipIfUnknown = 1 << 14;
|
rlm@1
|
94
|
rlm@1
|
95 const int kLongBlock = 1 << 15;
|
rlm@1
|
96
|
rlm@1
|
97 /*
|
rlm@1
|
98 struct CBlock
|
rlm@1
|
99 {
|
rlm@1
|
100 // UInt16 HeadCRC;
|
rlm@1
|
101 // Byte Type;
|
rlm@1
|
102 // UInt16 Flags;
|
rlm@1
|
103 // UInt16 HeadSize;
|
rlm@1
|
104 UInt32 PackSize;
|
rlm@1
|
105 UInt32 UnPackSize;
|
rlm@1
|
106 Byte HostOS;
|
rlm@1
|
107 UInt32 FileCRC;
|
rlm@1
|
108 UInt32 Time;
|
rlm@1
|
109 Byte UnPackVersion;
|
rlm@1
|
110 Byte Method;
|
rlm@1
|
111 UInt16 NameSize;
|
rlm@1
|
112 UInt32 Attributes;
|
rlm@1
|
113 };
|
rlm@1
|
114 */
|
rlm@1
|
115
|
rlm@1
|
116 /*
|
rlm@1
|
117 struct CBlock32
|
rlm@1
|
118 {
|
rlm@1
|
119 UInt16 HeadCRC;
|
rlm@1
|
120 Byte Type;
|
rlm@1
|
121 UInt16 Flags;
|
rlm@1
|
122 UInt16 HeadSize;
|
rlm@1
|
123 UInt32 PackSize;
|
rlm@1
|
124 UInt32 UnPackSize;
|
rlm@1
|
125 Byte HostOS;
|
rlm@1
|
126 UInt32 FileCRC;
|
rlm@1
|
127 UInt32 Time;
|
rlm@1
|
128 Byte UnPackVersion;
|
rlm@1
|
129 Byte Method;
|
rlm@1
|
130 UInt16 NameSize;
|
rlm@1
|
131 UInt32 Attributes;
|
rlm@1
|
132 UInt16 GetRealCRC(const void *aName, UInt32 aNameSize,
|
rlm@1
|
133 bool anExtraDataDefined = false, Byte *anExtraData = 0) const;
|
rlm@1
|
134 };
|
rlm@1
|
135 struct CBlock64
|
rlm@1
|
136 {
|
rlm@1
|
137 UInt16 HeadCRC;
|
rlm@1
|
138 Byte Type;
|
rlm@1
|
139 UInt16 Flags;
|
rlm@1
|
140 UInt16 HeadSize;
|
rlm@1
|
141 UInt32 PackSizeLow;
|
rlm@1
|
142 UInt32 UnPackSizeLow;
|
rlm@1
|
143 Byte HostOS;
|
rlm@1
|
144 UInt32 FileCRC;
|
rlm@1
|
145 UInt32 Time;
|
rlm@1
|
146 Byte UnPackVersion;
|
rlm@1
|
147 Byte Method;
|
rlm@1
|
148 UInt16 NameSize;
|
rlm@1
|
149 UInt32 Attributes;
|
rlm@1
|
150 UInt32 PackSizeHigh;
|
rlm@1
|
151 UInt32 UnPackSizeHigh;
|
rlm@1
|
152 UInt16 GetRealCRC(const void *aName, UInt32 aNameSize) const;
|
rlm@1
|
153 };
|
rlm@1
|
154 */
|
rlm@1
|
155
|
rlm@1
|
156 const int kLabelFileAttribute = 0x08;
|
rlm@1
|
157 const int kWinFileDirectoryAttributeMask = 0x10;
|
rlm@1
|
158
|
rlm@1
|
159 enum CHostOS
|
rlm@1
|
160 {
|
rlm@1
|
161 kHostMSDOS = 0,
|
rlm@1
|
162 kHostOS2 = 1,
|
rlm@1
|
163 kHostWin32 = 2,
|
rlm@1
|
164 kHostUnix = 3,
|
rlm@1
|
165 kHostMacOS = 4,
|
rlm@1
|
166 kHostBeOS = 5
|
rlm@1
|
167 };
|
rlm@1
|
168 }
|
rlm@1
|
169
|
rlm@1
|
170 namespace NBlock
|
rlm@1
|
171 {
|
rlm@1
|
172 const UInt16 kLongBlock = 1 << 15;
|
rlm@1
|
173 struct CBlock
|
rlm@1
|
174 {
|
rlm@1
|
175 UInt16 CRC;
|
rlm@1
|
176 Byte Type;
|
rlm@1
|
177 UInt16 Flags;
|
rlm@1
|
178 UInt16 HeadSize;
|
rlm@1
|
179 // UInt32 DataSize;
|
rlm@1
|
180 };
|
rlm@1
|
181 }
|
rlm@1
|
182
|
rlm@1
|
183 /*
|
rlm@1
|
184 struct CSubBlock
|
rlm@1
|
185 {
|
rlm@1
|
186 UInt16 HeadCRC;
|
rlm@1
|
187 Byte HeadType;
|
rlm@1
|
188 UInt16 Flags;
|
rlm@1
|
189 UInt16 HeadSize;
|
rlm@1
|
190 UInt32 DataSize;
|
rlm@1
|
191 UInt16 SubType;
|
rlm@1
|
192 Byte Level; // Reserved : Must be 0
|
rlm@1
|
193 };
|
rlm@1
|
194
|
rlm@1
|
195 struct CCommentBlock
|
rlm@1
|
196 {
|
rlm@1
|
197 UInt16 HeadCRC;
|
rlm@1
|
198 Byte HeadType;
|
rlm@1
|
199 UInt16 Flags;
|
rlm@1
|
200 UInt16 HeadSize;
|
rlm@1
|
201 UInt16 UnpSize;
|
rlm@1
|
202 Byte UnpVer;
|
rlm@1
|
203 Byte Method;
|
rlm@1
|
204 UInt16 CommCRC;
|
rlm@1
|
205 };
|
rlm@1
|
206
|
rlm@1
|
207
|
rlm@1
|
208 struct CProtectHeader
|
rlm@1
|
209 {
|
rlm@1
|
210 UInt16 HeadCRC;
|
rlm@1
|
211 Byte HeadType;
|
rlm@1
|
212 UInt16 Flags;
|
rlm@1
|
213 UInt16 HeadSize;
|
rlm@1
|
214 UInt32 DataSize;
|
rlm@1
|
215 Byte Version;
|
rlm@1
|
216 UInt16 RecSectors;
|
rlm@1
|
217 UInt32 TotalBlocks;
|
rlm@1
|
218 Byte Mark[8];
|
rlm@1
|
219 };
|
rlm@1
|
220 */
|
rlm@1
|
221
|
rlm@1
|
222 }}}
|
rlm@1
|
223
|
rlm@1
|
224 #endif
|