[UDFS]
[reactos.git] / reactos / drivers / filesystems / udfs / udf_info / osta_misc.h
1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6
7 #ifndef _OSTA_MISC_H_
8 #define _OSTA_MISC_H_
9
10 /* based on ECMA 167 structure definitions */
11 #include "ecma_167.h"
12
13 #pragma pack(push, 1)
14
15 /* -------- Basic types and constants ----------- */
16 /* UDF character set (UDF 1.50 2.1.2) */
17 #define UDF_CHAR_SET_TYPE 0
18 #define UDF_CHAR_SET_INFO "OSTA Compressed Unicode"
19
20 #define UDF_ID_DEVELOPER ("*WINNT " VER_STR_PRODUCT_NAME " UDF")
21
22 #define UDF_ID_DEVELOPER_ADAPTEC "*Adaptec DirectCD"
23
24 /* UDF 1.02 2.2.6.4 */
25 struct LogicalVolIntegrityDescImpUse
26 {
27 EntityID impIdent;
28 uint32 numFiles;
29 uint32 numDirs;
30 uint16 minUDFReadRev;
31 uint16 minUDFWriteRev;
32 uint16 maxUDFWriteRev;
33 };
34
35 /* UDF 1.02 2.2.7.2 */
36 /* LVInformation may be present in ImpUseVolDesc.impUse */
37 struct ImpUseVolDescImpUse
38 {
39 charspec LVICharset;
40 dstring logicalVolIdent[128];
41 dstring LVInfo1[36];
42 dstring LVInfo2[36];
43 dstring LVInfo3[36];
44 EntityID impIdent;
45 uint8 impUse[128];
46 };
47
48 struct UdfPartitionMap2
49 {
50 uint8 partitionMapType;
51 uint8 partitionMapLength;
52 uint8 reserved1[2];
53 EntityID partIdent;
54 uint16 volSeqNum;
55 uint16 partitionNum;
56 uint8 reserved2[24];
57 };
58
59 /* UDF 1.5 2.2.8 */
60 struct VirtualPartitionMap
61 {
62 uint8 partitionMapType; /* 2 */
63 uint8 partitionMapLength; /* 64 */
64 uint8 reserved1[2]; /* #00 */
65 EntityID partIdent;
66 uint16 volSeqNum;
67 uint16 partitionNum;
68 uint8 reserved2[24]; /* #00 */
69 };
70
71 #define UDF_VAT_FREE_ENTRY 0xffffffff
72
73 /* UDF 1.5 2.2.9 */
74 typedef struct _SPARABLE_PARTITION_MAP
75 {
76 uint8 partitionMapType; /* 2 */
77 uint8 partitionMapLength; /* 64 */
78 uint8 reserved1[2]; /* #00 */
79 EntityID partIdent; /* Flags = 0 */
80 /* Id = UDF_ID_SPARABLE */
81 /* IdSuf = 2.1.5.3 */
82 uint16 volSeqNum;
83 uint16 partitionNum;
84 uint16 packetLength; /* 32 */
85 uint8 numSparingTables;
86 uint8 reserved2[1]; /* #00 */
87 uint32 sizeSparingTable;
88 // uint32 locSparingTable[0];
89 // uint8 pad[0];
90 } SPARABLE_PARTITION_MAP, *PSPARABLE_PARTITION_MAP;
91
92 #define UDF_TYPE1_MAP15 0x1511U
93 #define UDF_VIRTUAL_MAP15 0x1512U
94 #define UDF_VIRTUAL_MAP20 0x2012U
95 #define UDF_SPARABLE_MAP15 0x1522U
96 #define UDF_METADATA_MAP25 0x2522U
97
98 #ifndef PACKETSIZE_UDF
99 #define PACKETSIZE_UDF 32
100 #endif //PACKETSIZE_UDF
101
102 /* UDF 2.5 */
103 typedef struct _METADATA_PARTITION_MAP
104 {
105 uint8 partitionMapType; /* 2 */
106 uint8 partitionMapLength; /* 64 */
107 uint8 reserved1[2]; /* #00 */
108 EntityID partIdent; /* Flags = 0 */
109 /* Id = UDF_ID_METADATA */
110 /* IdSuf = 2.1.5.3 */
111 uint16 volSeqNum;
112 uint16 partitionNum;
113 uint32 metadataFELocation;
114 uint32 metadataMirrorFELocation;
115 uint32 metadataBitmapFELocation;
116 uint32 allocationUnit; /* blocks */
117 uint16 alignmentUnit; /* blocks */
118 uint8 flags;
119 uint8 pad[5];
120 } METADATA_PARTITION_MAP, *PMETADATA_PARTITION_MAP;
121
122 #define UDF_METADATA_DUPLICATED 0x01U
123
124 /* DVD Copyright Management Info, see UDF 1.02 3.3.4.5.1.2 */
125 /* when ImpUseExtendedAttr.impIdent= "*UDF DVD CGMS Info" */
126 struct DVDCopyrightImpUse {
127 uint16 headerChecksum;
128 uint8 CGMSInfo;
129 uint8 dataType;
130 uint8 protectionSystemInfo[4];
131 };
132
133 /* the impUse of long_ad used in AllocDescs - UDF 1.02 2.3.10.1 */
134 struct ADImpUse
135 {
136 uint16 flags;
137 uint8 impUse[4];
138 };
139
140 /* the impUse of long_ad used in AllocDescs - UDF 1.02 2.3.10.1 */
141 struct FidADImpUse
142 {
143 uint8 reserved[2];
144 uint32 uniqueID;
145 };
146
147 /* UDF 1.02 2.3.10.1 */
148 #define UDF_EXTENT_LENGTH_MASK 0x3FFFFFFF
149 #define UDF_EXTENT_FLAG_MASK 0xc0000000
150 #define UDF_EXTENT_FLAG_ERASED 0x40000000
151
152 /*
153 * Important! VirtualAllocationTables are
154 * very different between 1.5 and 2.0!
155 */
156
157 /* ----------- 1.5 ------------- */
158 /* UDF 1.5 2.2.10 */
159 #define UDF_FILE_TYPE_VAT15 0x0U
160
161 /* UDF 1.5 2.2.10 - VAT layout: */
162 struct VirtualAllocationTable15 {
163 /* uint32 VirtualSector[0];*/
164 EntityID ident;
165 uint32 previousVATICB;
166 };
167 /* where number of VirtualSector's is (VATSize-36)/4 */
168
169 /* ----------- 2.0 ------------- */
170 /* UDF 2.0 2.2.10 */
171 #define UDF_FILE_TYPE_VAT20 0xf8U
172
173 /* UDF 2.0 2.2.10 (different from 1.5!) */
174 struct VirtualAllocationTable20 {
175 uint16 lengthHeader;
176 uint16 lengthImpUse;
177 dstring logicalVolIdent[128];
178 uint32 previousVatICBLoc;
179 uint32 numFIDSFiles;
180 uint32 numFIDSDirectories; /* non-parent */
181 uint16 minReadRevision;
182 uint16 minWriteRevision;
183 uint16 maxWriteRevision;
184 uint16 reserved;
185 /* uint8 impUse[0];*/
186 /* uint32 vatEntry[0];*/
187 };
188
189 /* Sparing maps, see UDF 1.5 2.2.11 */
190 typedef struct _SparingEntry {
191 uint32 origLocation;
192 uint32 mappedLocation;
193 } SparingEntry;
194
195 #define SPARING_LOC_AVAILABLE 0xffffffff
196 #define SPARING_LOC_CORRUPTED 0xfffffff0
197
198 typedef SparingEntry SPARING_ENTRY;
199 typedef SPARING_ENTRY* PSPARING_ENTRY;
200
201 typedef SPARING_ENTRY SPARING_MAP;
202 typedef PSPARING_ENTRY PSPARING_MAP;
203
204 /* sparing maps, see UDF 2.0 2.2.11 */
205 typedef struct _SPARING_TABLE {
206 tag descTag;
207 EntityID sparingIdent; /* *UDF Sparing Table */
208 uint16 reallocationTableLen;
209 uint16 reserved; /* #00 */
210 uint32 sequenceNum;
211 // SparingEntry mapEntry[0];
212 } SPARING_TABLE, *PSPARING_TABLE;
213
214 /* Identifier Suffixes, see EntityID */
215
216 typedef struct {
217 uint16 currentRev;
218 uint8 flags;
219 uint8 reserved[5];
220 } domainIdentSuffix;
221
222 #define ENTITYID_FLAGS_HARD_RO 0x01U
223 #define ENTITYID_FLAGS_SOFT_RO 0x02U
224
225 typedef struct {
226 uint16 currentRev;
227 uint8 OSClass;
228 uint8 OSIdent;
229 uint8 reserved[4];
230 } UDFIdentSuffix;
231
232 typedef struct {
233 uint8 OSClass;
234 uint8 OSIdent;
235 uint8 reserved[6];
236 } impIdentSuffix;
237
238 /* Unique ID maps, see UDF 2.0 2.2.11 */
239
240 typedef struct {
241 uint32 uniqueID;
242 uint32 parentLogicalBlock;
243 uint32 objectLogicalBlock;
244 uint16 parentPartitionReferenceNum;
245 uint16 objectPartitionReferenceNum;
246 } UniqueIDEntry;
247
248 typedef UniqueIDEntry UID_MAPPING_ENTRY;
249 typedef UID_MAPPING_ENTRY* PUID_MAPPING_ENTRY;
250
251 typedef struct {
252 EntityID ident;
253 uint32 flags;
254 uint32 entryCount;
255 uint8 reserved[8];
256 // UniqueIDEntry mapEntry[0];
257 } UniqueIDMappingData;
258
259 typedef UniqueIDMappingData UID_MAPPING_TABLE;
260 typedef UID_MAPPING_TABLE* PUID_MAPPING_TABLE;
261
262 /* Entity Identifiers (UDF 1.50 6.1) */
263 #define UDF_ID_COMPLIANT "*OSTA UDF Compliant"
264 #define UDF_ID_LV_INFO "*UDF LV Info"
265 #define UDF_ID_FREE_EA "*UDF FreeEASpace"
266 #define UDF_ID_FREE_APP_EA "*UDF FreeAppEASpace"
267 #define UDF_ID_DVD_CGMS "*UDF DVD CGMS Info"
268 #define UDF_ID_OS2_EA "*UDF OS/2 EA"
269 #define UDF_ID_OS2_EA_LENGTH "*UDF OS/2 EALength"
270 #define UDF_ID_OS400_DIRINFO "*UDF OS/400 DirInfo"
271 #define UDF_ID_MAC_VOLUME "*UDF Mac VolumeInfo"
272 #define UDF_ID_MAC_FINDER "*UDF Mac FinderInfo"
273 #define UDF_ID_MAC_UNIQUE "*UDF Mac UniqueIDTable"
274 #define UDF_ID_MAC_RESOURCE "*UDF Mac ResourceFork"
275 #define UDF_ID_VIRTUAL "*UDF Virtual Partition"
276 #define UDF_ID_SPARABLE "*UDF Sparable Partition"
277 #define UDF_ID_METADATA "*UDF Metadata Partition"
278 #define UDF_ID_ALLOC "*UDF Virtual Alloc Tbl"
279 #define UDF_ID_SPARING "*UDF Sparing Table"
280
281 /* Operating System Identifiers (UDF 1.50 6.3) */
282 #define UDF_OS_CLASS_UNDEF 0x00U
283 #define UDF_OS_CLASS_DOS 0x01U
284 #define UDF_OS_CLASS_OS2 0x02U
285 #define UDF_OS_CLASS_MAC 0x03U
286 #define UDF_OS_CLASS_UNIX 0x04U
287 #define UDF_OS_CLASS_WIN95 0x05U
288 #define UDF_OS_CLASS_WINNT 0x06U
289 #define UDF_OS_CLASS_OS400 0x07U
290 #define UDF_OS_CLASS_BEOS 0x08U
291 #define UDF_OS_CLASS_WINCE 0x09U
292
293 #define UDF_OS_ID_GENERIC 0x00U
294 #define UDF_OS_ID_UNDEF 0x00U
295 #define UDF_OS_ID_DOS 0x00U
296 #define UDF_OS_ID_OS2 0x00U
297 #define UDF_OS_ID_MAC 0x00U
298 #define UDF_OS_ID_UNIX 0x00U
299 #define UDF_OS_ID_WIN95 0x00U
300 #define UDF_OS_ID_WINNT 0x00U
301 #define UDF_OS_ID_OS400 0x00U
302 #define UDF_OS_ID_BEOS 0x00U
303
304 #define UDF_OS_ID_AIX 0x01U
305 #define UDF_OS_ID_SOLARIS 0x02U
306 #define UDF_OS_ID_HPUX 0x03U
307 #define UDF_OS_ID_IRIX 0x04U
308 #define UDF_OS_ID_LINUX 0x05U
309 #define UDF_OS_ID_MKLINUX 0x06U
310 #define UDF_OS_ID_FREEBSD 0x07U
311 #define UDF_OS_ID_NETBSD 0x08U
312
313 #define UDF_NAME_PAD 4
314 #define UDF_NAME_LEN 255
315 #define UDF_EXT_SIZE 5 // ???
316 #define UDF_PATH_LEN 1023
317 #define UDF_VOL_LABEL_LEN 32
318
319 /* Reserved file names */
320
321 #define UDF_FN_NON_ALLOCATABLE L"Non-Allocatable Space"
322 #define UDF_FN_NON_ALLOCATABLE_2 L"Non-Allocatable List"
323
324 #define UDF_FN_NON_ALLOCATABLE_USER "Non-Allocatable Space"
325 #define UDF_FN_NON_ALLOCATABLE_2_USER "Non-Allocatable List"
326
327 /* Reserved system stream names */
328 /* METADATA bit shall be set to 1 */
329
330 #define UDF_SN_UID_MAPPING L"*UDF Unique ID Mapping Data"
331 #define UDF_SN_NON_ALLOCATABLE L"*UDF Non-Allocatable Space"
332 #define UDF_SN_POWER_CAL_TABLE L"*UDF Power Cal Table"
333 #define UDF_SN_BACKUP L"*UDF Backup"
334
335 /* Reserved non-system stream names */
336 /* METADATA bit shall be set to 0 */
337
338 #define UDF_SN_MAC_RESOURCE_FORK L"*UDF Macintosh Resource Fork"
339 #define UDF_SN_OS2_EA L"*UDF OS/2 EA"
340 #define UDF_SN_NT_ACL L"*UDF NT ACL"
341 #define UDF_SN_UNIX_ACL L"*UDF UNIX ACL"
342
343 #define UDF_RESERVED_NAME_HDR L"*UDF "
344
345 /* ----------- 2.01 ------------ */
346 /* UDF 2.0 2.2.10 */
347 #define UDF_FILE_TYPE_REALTIME 0xf9U
348
349 #define TID_ADAPTEC_LOGICAL_VOL_DESC 0x9999U
350
351 #pragma pack(pop)
352
353 #endif /* _OSTA_MISC_H */