VirtualBox

source: vbox/trunk/include/iprt/formats/udf.h@ 68844

Last change on this file since 68844 was 68687, checked in by vboxsync, 7 years ago

iprt/formats/*.h: Use assertcompile.h instead of assert.h.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 80.5 KB
Line 
1/* $Id: udf.h 68687 2017-09-06 18:11:39Z vboxsync $ */
2/** @file
3 * IPRT, Universal Disk Format (UDF).
4 */
5
6/*
7 * Copyright (C) 2017 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef ___iprt_formats_udf_h
28#define ___iprt_formats_udf_h
29
30#include <iprt/types.h>
31#include <iprt/assertcompile.h>
32#include <iprt/formats/iso9660.h>
33
34
35/** @defgroup grp_rt_formats_udf Universal Disk Format (UDF) structures and definitions
36 * @ingroup grp_rt_formats
37 *
38 * References:
39 * - https://www.ecma-international.org/publications/files/ECMA-ST/Ecma-167.pdf
40 * - http://www.osta.org/specs/pdf/udf260.pdf
41 * - http://wiki.osdev.org/UDF
42 * - https://sites.google.com/site/udfintro/
43 *
44 * @{
45 */
46
47/**
48 * UDF d-character string (@ecma167{1,7.2.12,25}).
49 *
50 * This is mainly to mark what's d-strings and what's not.
51 */
52typedef char UDFDSTRING;
53/** Pointer to an UDF dstring. */
54typedef UDFDSTRING *PUDFDSTRING;
55/** Pointer to a const UDF dstring. */
56typedef UDFDSTRING const *PCUDFDSTRING;
57
58/**
59 * UDF extent allocation descriptor (AD) (@ecma167{3,7.1,42}).
60 */
61typedef struct UDFEXTENTAD
62{
63 /** Extent length in bytes. */
64 uint32_t cb;
65 /** Extent offset (logical sector number).
66 * If @a cb is zero, this is also zero. */
67 uint32_t off;
68} UDFEXTENTAD;
69AssertCompileSize(UDFEXTENTAD, 8);
70/** Pointer to an UDF extent descriptor. */
71typedef UDFEXTENTAD *PUDFEXTENTAD;
72/** Pointer to a const UDF extent descriptor. */
73typedef UDFEXTENTAD const *PCUDFEXTENTAD;
74
75
76/**
77 * UDF logical block address (@ecma167{4,7.1,73}).
78 */
79#pragma pack(2)
80typedef struct UDFLBADDR
81{
82 /** Logical block number, relative to the start of the given partition. */
83 uint32_t off;
84 /** Partition reference number. */
85 uint16_t uPartitionNo;
86} UDFLBADDR;
87#pragma pack()
88AssertCompileSize(UDFLBADDR, 6);
89/** Pointer to an UDF logical block address. */
90typedef UDFLBADDR *PUDFLBADDR;
91/** Pointer to a const UDF logical block address. */
92typedef UDFLBADDR const *PCUDFLBADDR;
93
94
95/** @name UDF_AD_TYPE_XXX - Allocation descriptor types.
96 *
97 * Used by UDFSHORTAD::uType, UDFLONGAD::uType and UDFEXTAD::uType.
98 *
99 * See @ecma167{4,14.14.1.1,116}.
100 *
101 * @{ */
102/** Recorded and allocated.
103 * Also used for zero length descriptors. */
104#define UDF_AD_TYPE_RECORDED_AND_ALLOCATED 0
105/** Allocated but not recorded. */
106#define UDF_AD_TYPE_ONLY_ALLOCATED 1
107/** Not recorded nor allocated. */
108#define UDF_AD_TYPE_FREE 2
109/** Go figure. */
110#define UDF_AD_TYPE_NEXT 3
111/** @} */
112
113/**
114 * UDF short allocation descriptor (@ecma167{4,14.14.1,116}).
115 */
116typedef struct UDFSHORTAD
117{
118#ifdef RT_BIG_ENDIAN
119 /** Extent type (UDF_AD_TYPE_XXX). */
120 uint32_t uType : 2;
121 /** Extent length in bytes, top 2 bits . */
122 uint32_t cb : 30;
123#else
124 /** Extent length in bytes. */
125 uint32_t cb : 30;
126 /** Extent type (UDF_AD_TYPE_XXX). */
127 uint32_t uType : 2;
128#endif
129 /** Extent offset (logical sector number). */
130 uint32_t off;
131} UDFSHORTAD;
132AssertCompileSize(UDFSHORTAD, 8);
133/** Pointer to an UDF short allocation descriptor. */
134typedef UDFSHORTAD *PUDFSHORTAD;
135/** Pointer to a const UDF short allocation descriptor. */
136typedef UDFSHORTAD const *PCUDFSHORTAD;
137
138/**
139 * UDF long allocation descriptor (@ecma167{4,14.14.2,116}).
140 */
141#pragma pack(2)
142typedef struct UDFLONGAD
143{
144#ifdef RT_BIG_ENDIAN
145 /** Extent type (UDF_AD_TYPE_XXX). */
146 uint32_t uType : 2;
147 /** Extent length in bytes, top 2 bits . */
148 uint32_t cb : 30;
149#else
150 /** Extent length in bytes. */
151 uint32_t cb : 30;
152 /** Extent type (UDF_AD_TYPE_XXX). */
153 uint32_t uType : 2;
154#endif
155 /** Extent location. */
156 UDFLBADDR Location;
157 /** Implementation use area. */
158 union
159 {
160 /** Generic view. */
161 uint8_t ab[6];
162 /** Used in FIDs.
163 * See @udf260{2.3.10.1,66}, @udf260{2.3.4.3,58}.
164 */
165 struct
166 {
167 /** Flags (UDF_AD_IMP_USE_FLAGS_XXX). */
168 uint16_t fFlags;
169 /** Unique ID. */
170 uint32_t idUnique;
171 } Fid;
172 } ImplementationUse;
173} UDFLONGAD;
174#pragma pack()
175AssertCompileSize(UDFLONGAD, 16);
176/** Pointer to an UDF long allocation descriptor. */
177typedef UDFLONGAD *PUDFLONGAD;
178/** Pointer to a const UDF long allocation descriptor. */
179typedef UDFLONGAD const *PCUDFLONGAD;
180
181/** @name UDF_AD_IMP_USE_FLAGS_XXX - UDFLONGAD::ImplementationUse::Fid::fFlags values
182 * See @udf260{2.3.10.1,66}.
183 * @{ */
184/** Set if erased and the extend is of the type UDF_AD_TYPE_ONLY_ALLOCATED. */
185#define UDF_AD_IMP_USE_FLAGS_ERASED UINT16_C(0x0001)
186/** Valid mask. */
187#define UDF_AD_IMP_USE_FLAGS_VALID_MASK UINT16_C(0x0001)
188/** @} */
189
190/**
191 * UDF extended allocation descriptor (@ecma167{4,14.14.3,117}).
192 */
193typedef struct UDFEXTAD
194{
195#ifdef RT_BIG_ENDIAN
196 /** 0x00: Extent type (UDF_AD_TYPE_XXX). */
197 uint32_t uType : 2;
198 /** 0x00: Extent length in bytes, top 2 bits . */
199 uint32_t cb : 30;
200 /** 0x04: Reserved, MBZ. */
201 uint32_t uReserved : 2;
202 /** 0x04: Number of bytes recorded. */
203 uint32_t cbRecorded : 30;
204#else
205 /** 0x00: Extent length in bytes. */
206 uint32_t cb : 30;
207 /** 0x00: Extent type (UDF_AD_TYPE_XXX). */
208 uint32_t uType : 2;
209 /** 0x04: Number of bytes recorded. */
210 uint32_t cbRecorded : 30;
211 /** 0x04: Reserved, MBZ. */
212 uint32_t uReserved : 2;
213#endif
214 /** 0x08: Number of bytes of information (from first byte). */
215 uint32_t cbInformation;
216 /** 0x0c: Extent location. */
217 UDFLBADDR Location;
218 /** 0x12: Implementation use area. */
219 uint8_t abImplementationUse[2];
220} UDFEXTAD;
221AssertCompileSize(UDFEXTAD, 20);
222/** Pointer to an UDF extended allocation descriptor. */
223typedef UDFEXTAD *PUDFEXTAD;
224/** Pointer to a const UDF extended allocation descriptor. */
225typedef UDFEXTAD const *PCUDFEXTAD;
226
227
228/**
229 * UDF timestamp (@ecma167{1,7.3,25}, @udf260{2.1.4,19}).
230 */
231typedef struct UDFTIMESTAMP
232{
233 /** 0x00: Type and timezone. */
234 uint16_t uTypeAndZone;
235 /** 0x02: The year. */
236 int16_t iYear;
237 /** 0x04: Month of year (1-12). */
238 uint8_t uMonth;
239 /** 0x05: Day of month (1-31). */
240 uint8_t uDay;
241 /** 0x06: Hour of day (0-23). */
242 uint8_t uHour;
243 /** 0x07: Minute of hour (0-59). */
244 uint8_t uMinute;
245 /** 0x08: Second of minute (0-60 if type 2, otherwise 0-59). */
246 uint8_t uSecond;
247 /** 0x09: Number of Centiseconds (0-99). */
248 uint8_t cCentiseconds;
249 /** 0x0a: Number of hundreds of microseconds (0-99). Unit is 100us. */
250 uint8_t cHundredsOfMicroseconds;
251 /** 0x0b: Number of microseconds (0-99). */
252 uint8_t cMicroseconds;
253} UDFTIMESTAMP;
254AssertCompileSize(UDFTIMESTAMP, 12);
255/** Pointer to an UDF timestamp. */
256typedef UDFTIMESTAMP *PUDFTIMESTAMP;
257/** Pointer to a const UDF timestamp. */
258typedef UDFTIMESTAMP const *PCUDFTIMESTAMP;
259
260
261/**
262 * UDF character set specficiation (@ecma167{1,7.2.1,21}, @udf260{2.1.2,18}).
263 */
264typedef struct UDFCHARSPEC
265{
266 /** The character set type (UDF_CHAR_SET_TYPE_XXX) */
267 uint8_t uType;
268 /** Character set information. */
269 uint8_t abInfo[63];
270} UDFCHARSPEC;
271AssertCompileSize(UDFCHARSPEC, 64);
272/** Pointer to UDF character set specification. */
273typedef UDFCHARSPEC *PUDFCHARSPEC;
274/** Pointer to const UDF character set specification. */
275typedef UDFCHARSPEC const *PCUDFCHARSPEC;
276
277/** @name UDF_CHAR_SET_TYPE_XXX - Character set types.
278 * @{ */
279/** CS0: By agreement between the medium producer and consumer.
280 * See UDF_CHAR_SET_OSTA_COMPRESSED_UNICODE. */
281#define UDF_CHAR_SET_TYPE_BY_AGREEMENT UINT8_C(0x00)
282/** CS1: ASCII (ECMA-6) with all or part of the specified graphic characters. */
283#define UDF_CHAR_SET_TYPE_ASCII UINT8_C(0x01)
284/** CS5: Latin-1 (ECMA-94) with all graphical characters. */
285#define UDF_CHAR_SET_TYPE_LATIN_1 UINT8_C(0x05)
286/* there are more defined here, but they are mostly useless, since UDF only uses CS0. */
287
288/** The CS0 definition used by the UDF specification. */
289#define UDF_CHAR_SET_OSTA_COMPRESSED_UNICODE UDF_CHAR_SET_TYPE_BY_AGREEMENT
290/** String to put in the UDFCHARSEPC::abInfo field for UDF CS0. */
291#define UDF_CHAR_SET_OSTA_COMPRESSED_UNICODE_INFO "OSTA Compressed Unicode"
292/** @} */
293
294
295/**
296 * UDF entity identifier (@ecma167{1,7.4,26}, @udf260{2.1.5,20}).
297 */
298typedef struct UDFENTITYID
299{
300 /** 0x00: Flags (UDFENTITYID_FLAGS_XXX). */
301 uint8_t fFlags;
302 /** 0x01: Identifier string (see UDF_ENTITY_ID_XXX). */
303 char achIdentifier[23];
304 /** 0x18: Identifier suffix. */
305 union
306 {
307 /** Domain ID suffix. */
308 struct
309 {
310 uint16_t uUdfRevision;
311 uint8_t fDomain;
312 uint8_t abReserved[5];
313 } Domain;
314
315 /** UDF ID suffix. */
316 struct
317 {
318 uint16_t uUdfRevision;
319 uint8_t bOsClass;
320 uint8_t idOS;
321 uint8_t abReserved[4];
322 } Udf;
323
324
325 /** Implementation ID suffix. */
326 struct
327 {
328 uint8_t bOsClass;
329 uint8_t idOS;
330 uint8_t achImplUse[6];
331 } Implementation;
332
333 /** Application ID suffix / generic. */
334 uint8_t abApplication[8];
335 } Suffix;
336} UDFENTITYID;
337AssertCompileSize(UDFENTITYID, 32);
338/** Pointer to UDF entity identifier. */
339typedef UDFENTITYID *PUDFENTITYID;
340/** Pointer to const UDF entity identifier. */
341typedef UDFENTITYID const *PCUDFENTITYID;
342
343/** @name UDF_ENTITY_ID_XXX - UDF identifier strings
344 *
345 * See @udf260{2.1.5.2,21}.
346 *
347 * @{ */
348/** Primary volume descriptor, implementation ID field.
349 * Implementation ID suffix. */
350#define UDF_ENTITY_ID_PVD_IMPLEMENTATION "*Developer ID"
351/** Primary volume descriptor, application ID field.
352 * Application ID suffix. */
353#define UDF_ENTITY_ID_PVD_APPLICATION "*Application ID"
354
355/** Implementation use volume descriptor, implementation ID field.
356 * UDF ID suffix. */
357#define UDF_ENTITY_ID_IUVD_IMPLEMENTATION "*UDF LV Info"
358/** Implementation use volume descriptor, implementation ID field in Use field.
359 * Implementation ID suffix. */
360#define UDF_ENTITY_ID_IUVD_USE_IMPLEMENTATION "*Developer ID"
361
362/** Partition descriptor, implementation ID field.
363 * Implementation ID suffix. */
364#define UDF_ENTITY_ID_PD_IMPLEMENTATION "*Developer ID"
365/** Partition descriptor, partition contents field, set to indicate UDF
366 * (ECMA-167 3rd edition). Application ID suffix. */
367#define UDF_ENTITY_ID_PD_PARTITION_CONTENTS_UDF "+NSR03"
368/** Partition descriptor, partition contents field, set to indicate ISO-9660
369 * (ECMA-119). Application ID suffix. */
370#define UDF_ENTITY_ID_PD_PARTITION_CONTENTS_ISO9660 "+CD001"
371/** Partition descriptor, partition contents field, set to indicate ECMA-168.
372 * Application ID suffix. */
373#define UDF_ENTITY_ID_PD_PARTITION_CONTENTS_CDW "+CDW02"
374/** Partition descriptor, partition contents field, set to indicate FAT
375 * (ECMA-107). Application ID suffix. */
376#define UDF_ENTITY_ID_PD_PARTITION_CONTENTS_FAT "+FDC01"
377
378/** Logical volume descriptor, implementation ID field.
379 * Implementation ID suffix. */
380#define UDF_ENTITY_ID_LVD_IMPLEMENTATION "*Developer ID"
381/** Logical volume descriptor, domain ID field.
382 * Domain ID suffix. */
383#define UDF_ENTITY_ID_LVD_DOMAIN "*OSTA UDF Compliant"
384
385/** File set descriptor, domain ID field.
386 * Domain ID suffix. */
387#define UDF_ENTITY_FSD_LVD_DOMAIN "*OSTA UDF Compliant"
388
389/** File identifier descriptor, implementation use field.
390 * Implementation ID suffix. */
391#define UDF_ENTITY_ID_FID_IMPLEMENTATION_USE "*Developer ID"
392
393/** File entry, implementation ID field.
394 * Implementation ID suffix. */
395#define UDF_ENTITY_ID_FE_IMPLEMENTATION "*Developer ID"
396
397/** Device specification extended attribute, implementation use field.
398 * Implementation ID suffix. */
399#define UDF_ENTITY_ID_DSEA_IMPLEMENTATION_USE "*Developer ID"
400
401/** UDF implementation use extended attribute, implementation ID field, set
402 * to free EA space. UDF ID suffix. */
403#define UDF_ENTITY_ID_IUEA_FREE_EA_SPACE "*UDF FreeEASpace"
404/** UDF implementation use extended attribute, implementation ID field, set
405 * to DVD copyright management information. UDF ID suffix. */
406#define UDF_ENTITY_ID_IUEA_DVD_CGMS_INFO "*UDF DVD CGMS Info"
407/** UDF implementation use extended attribute, implementation ID field, set
408 * to OS/2 extended attribute length. UDF ID suffix. */
409#define UDF_ENTITY_ID_IUEA_OS2_EA_LENGTH "*UDF OS/2 EALength"
410/** UDF implementation use extended attribute, implementation ID field, set
411 * to Machintosh OS volume information. UDF ID suffix. */
412#define UDF_ENTITY_ID_IUEA_MAC_VOLUME_INFO "*UDF Mac VolumeInfo"
413/** UDF implementation use extended attribute, implementation ID field, set
414 * to Machintosh Finder Info. UDF ID suffix. */
415#define UDF_ENTITY_ID_IUEA_MAC_FINDER_INFO "*UDF Mac FinderInfo"
416/** UDF implementation use extended attribute, implementation ID field, set
417 * to OS/400 extended directory information. UDF ID suffix. */
418#define UDF_ENTITY_ID_IUEA_OS400_DIR_INFO "*UDF OS/400 DirInfo"
419
420/** Non-UDF implementation use extended attribute, implementation ID field.
421 * Implementation ID suffix. */
422#define UDF_ENTITY_ID_NUIUSEA_IMPLEMENTATION "*Developer ID"
423
424/** UDF application use extended attribute, application ID field, set
425 * to free application use EA space. UDF ID suffix. */
426#define UDF_ENTITY_ID_AUEA_FREE_EA_SPACE "*UDF FreeAppEASpace"
427
428/** Non-UDF application use extended attribute, implementation ID field.
429 * Application ID suffix. */
430#define UDF_ENTITY_ID_NUAUEA_IMPLEMENTATION "*Application ID"
431
432/** UDF unique ID mapping data, implementation ID field.
433 * Implementation ID suffix. */
434#define UDF_ENTITY_ID_UIMD_IMPLEMENTATION "*Developer ID"
435
436/** Power calibration table stream, implementation ID field.
437 * Implementation ID suffix. */
438#define UDF_ENTITY_ID_PCTS_IMPLEMENTATION "*Developer ID"
439
440/** Logical volume integrity descriptor, implementation ID field.
441 * Implementation ID suffix. */
442#define UDF_ENTITY_ID_LVID_IMPLEMENTATION "*Developer ID"
443
444/** Virtual partition map, partition type field.
445 * UDF ID suffix. */
446#define UDF_ENTITY_ID_VPM_PARTITION_TYPE "*UDF Virtual Partition"
447
448/** Virtual allocation table, implementation use field.
449 * Implementation ID suffix. */
450#define UDF_ENTITY_ID_VAT_IMPLEMENTATION_USE "*Developer ID"
451
452/** Sparable partition map, partition type field.
453 * UDF ID suffix. */
454#define UDF_ENTITY_ID_SPM_PARTITION_TYPE "*UDF Sparable Partition"
455
456/** Sparing table, sparing identifier field.
457 * UDF ID suffix. */
458#define UDF_ENTITY_ID_ST_SPARING "*UDF Sparting Table"
459
460/** Metadata partition map, partition type field.
461 * UDF ID suffix. */
462#define UDF_ENTITY_ID_MPM_PARTITION_TYPE "*UDF Metadata Partition"
463
464/** @} */
465
466
467/**
468 * UDF descriptor tag (@ecma167{3,7.2,42}, @udf260{2.2.1,26}).
469 */
470typedef struct UDFTAG
471{
472 /** Tag identifier (UDF_TAG_ID_XXX). */
473 uint16_t idTag;
474 /** Descriptor version. */
475 uint16_t uVersion;
476 /** Tag checksum.
477 * Sum of each byte in the structure with this field as zero. */
478 uint8_t uChecksum;
479 /** Reserved, MBZ. */
480 uint8_t bReserved;
481 /** Tag serial number. */
482 uint16_t uTagSerialNo;
483 /** Descriptor CRC. */
484 uint16_t uDescriptorCrc;
485 /** Descriptor CRC length. */
486 uint16_t cbDescriptorCrc;
487 /** The tag location (logical sector number). */
488 uint32_t offTag;
489} UDFTAG;
490AssertCompileSize(UDFTAG, 16);
491/** Pointer to an UDF descriptor tag. */
492typedef UDFTAG *PUDFTAG;
493/** Pointer to a const UDF descriptor tag. */
494typedef UDFTAG const *PCUDFTAG;
495
496/** @name UDF_TAG_ID_XXX - UDF descriptor tag IDs.
497 * @{ */
498#define UDF_TAG_ID_PRIMARY_VOL_DESC UINT16_C(0x0001) /**< UDFPRIMARYVOLUMEDESC */
499#define UDF_TAG_ID_ANCHOR_VOLUME_DESC_PTR UINT16_C(0x0002) /**< UDFANCHORVOLUMEDESCPTR */
500#define UDF_TAG_ID_VOLUME_DESC_PTR UINT16_C(0x0003) /**< UDFVOLUMEDESCPTR */
501#define UDF_TAG_ID_IMPLEMENATION_USE_VOLUME_DESC UINT16_C(0x0004) /**< UDFIMPLEMENTATIONUSEVOLUMEDESC */
502#define UDF_TAG_ID_PARTITION_DESC UINT16_C(0x0005) /**< UDFPARTITIONDESC */
503#define UDF_TAG_ID_LOGICAL_VOLUME_DESC UINT16_C(0x0006) /**< UDFLOGICALVOLUMEDESC */
504#define UDF_TAG_ID_UNALLOCATED_SPACE_DESC UINT16_C(0x0007) /**< UDFUNALLOCATEDSPACEDESC */
505#define UDF_TAG_ID_TERMINATING_DESC UINT16_C(0x0008) /**< UDFTERMINATINGDESC */
506#define UDF_TAG_ID_LOGICAL_VOLUME_INTEGRITY_DESC UINT16_C(0x0009) /**< UDFLOGICALVOLINTEGRITYDESC */
507#define UDF_TAG_ID_FILE_SET_DESC UINT16_C(0x0100)
508#define UDF_TAG_ID_FILE_ID_DESC UINT16_C(0x0101)
509#define UDF_TAG_ID_ALLOCATION_EXTENT_DESC UINT16_C(0x0102)
510#define UDF_TAG_ID_INDIRECT_ENTRY UINT16_C(0x0103)
511#define UDF_TAG_ID_TERMINAL_ENTRY UINT16_C(0x0104)
512#define UDF_TAG_ID_FILE_ENTRY UINT16_C(0x0105)
513#define UDF_TAG_ID_EXTENDED_ATTRIB_HDR_DESC UINT16_C(0x0106)
514#define UDF_TAG_ID_UNALLOCATED_SPACE_ENTRY UINT16_C(0x0107)
515#define UDF_TAG_ID_SPACE_BITMAP_DESC UINT16_C(0x0108)
516#define UDF_TAG_ID_PARTITION_INTEGERITY_DESC UINT16_C(0x0109)
517#define UDF_TAG_ID_EXTENDED_FILE_ENTRY UINT16_C(0x010a)
518/** @} */
519
520
521/**
522 * UDF primary volume descriptor (PVD) (@ecma167{3,10.1,50},
523 * @udf260{2.2.2,27}).
524 */
525typedef struct UDFPRIMARYVOLUMEDESC
526{
527 /** 0x000: The descriptor tag (UDF_TAG_ID_PRIMARY_VOL_DESC). */
528 UDFTAG Tag;
529 /** 0x010: Volume descriptor sequence number. */
530 uint32_t uVolumeDescSeqNo;
531 /** 0x014: Primary volume descriptor number. */
532 uint32_t uPrimaryVolumeDescNo;
533 /** 0x018: Volume identifier (dstring). */
534 UDFDSTRING achVolumeID[32];
535 /** 0x038: Volume sequence number. */
536 uint16_t uVolumeSeqNo;
537 /** 0x03a: Maximum volume sequence number. */
538 uint16_t uMaxVolumeSeqNo;
539 /** 0x03c: Interchange level. */
540 uint16_t uInterchangeLevel;
541 /** 0x03e: Maximum interchange level. */
542 uint16_t uMaxInterchangeLevel;
543 /** 0x040: Character set bitmask (aka list). Each bit correspond to a
544 * character set number. */
545 uint32_t fCharacterSets;
546 /** 0x044: Maximum character set bitmask (aka list). */
547 uint32_t fMaxCharacterSets;
548 /** 0x048: Volume set identifier (dstring). This starts with 16 unique
549 * characters, the first 8 being the hex represenation of a time value. */
550 UDFDSTRING achVolumeSetID[128];
551 /** 0x0c8: Descriptor character set.
552 * For achVolumeSetID and achVolumeID. */
553 UDFCHARSPEC DescCharSet;
554 /** 0x108: Explanatory character set.
555 * For VolumeAbstract and VolumeCopyrightNotice data. */
556 UDFCHARSPEC ExplanatoryCharSet;
557 /** 0x148: Volume abstract. */
558 UDFEXTENTAD VolumeAbstract;
559 /** 0x150: Volume copyright notice. */
560 UDFEXTENTAD VolumeCopyrightNotice;
561 /** 0x158: Application identifier (UDF_ENTITY_ID_PVD_APPLICATION). */
562 UDFENTITYID idApplication;
563 /** 0x178: Recording date and time. */
564 UDFTIMESTAMP RecordingTimestamp;
565 /** 0x184: Implementation identifier (UDF_ENTITY_ID_PVD_IMPLEMENTATION). */
566 UDFENTITYID idImplementation;
567 /** 0x1a4: Implementation use. */
568 uint8_t abImplementationUse[64];
569 /** 0x1e4: Predecessor volume descriptor sequence location. */
570 uint32_t offPredecessorVolDescSeq;
571 /** 0x1e8: Flags (UDF_PVD_FLAGS_XXX). */
572 uint16_t fFlags;
573 /** 0x1ea: Reserved. */
574 uint8_t abReserved[22];
575} UDFPRIMARYVOLUMEDESC;
576AssertCompileSize(UDFPRIMARYVOLUMEDESC, 512);
577/** Pointer to a UDF primary volume descriptor. */
578typedef UDFPRIMARYVOLUMEDESC *PUDFPRIMARYVOLUMEDESC;
579/** Pointer to a const UDF primary volume descriptor. */
580typedef UDFPRIMARYVOLUMEDESC const *PCUDFPRIMARYVOLUMEDESC;
581
582/** @name UDF_PVD_FLAGS_XXX - Flags for UDFPRIMARYVOLUMEDESC::fFlags.
583 * @{ */
584/** Indicates that the volume set ID is common to all members of the set. */
585#define UDF_PVD_FLAGS_COMMON_VOLUME_SET_ID UINT16_C(0x0001)
586/** @} */
587
588
589/**
590 * UDF anchor volume descriptor pointer (AVDP) (@ecma167{3,10.2,53},
591 * @udf260{2.2.3,29}).
592 *
593 * This is stored at least two of these locations:
594 * - logical sector 256
595 * - logical sector N - 256.
596 * - logical sector N.
597 */
598typedef struct UDFANCHORVOLUMEDESCPTR
599{
600 /** 0x00: The descriptor tag (UDF_TAG_ID_ANCHOR_VOLUME_DESC_PTR). */
601 UDFTAG Tag;
602 /** 0x10: The extent descripting the main volume descriptor sequence. */
603 UDFEXTENTAD MainVolumeDescSeq;
604 /** 0x18: Location of the backup descriptor sequence. */
605 UDFEXTENTAD ReserveVolumeDescSeq;
606 /** 0x20: Reserved, probably must be zeros. */
607 uint8_t abReserved[0x1e0];
608} UDFANCHORVOLUMEDESCPTR;
609AssertCompileSize(UDFANCHORVOLUMEDESCPTR, 512);
610/** Pointer to UDF anchor volume descriptor pointer. */
611typedef UDFANCHORVOLUMEDESCPTR *PUDFANCHORVOLUMEDESCPTR;
612/** Pointer to const UDF anchor volume descriptor pointer. */
613typedef UDFANCHORVOLUMEDESCPTR const *PCUDFANCHORVOLUMEDESCPTR;
614
615
616/**
617 * UDF volume descriptor pointer (VDP) (@ecma167{3,10.3,53}).
618 */
619typedef struct UDFVOLUMEDESCPTR
620{
621 /** 0x00: The descriptor tag (UDF_TAG_ID_VOLUME_DESC_PTR). */
622 UDFTAG Tag;
623 /** 0x10: Volume descriptor sequence number. */
624 uint32_t uVolumeDescSeqNo;
625 /** 0x14: Location of the next volume descriptor sequence. */
626 UDFEXTENTAD NextVolumeDescSeq;
627 /** 0x1c: Reserved, probably must be zeros. */
628 uint8_t abReserved[484];
629} UDFVOLUMEDESCPTR;
630AssertCompileSize(UDFVOLUMEDESCPTR, 512);
631/** Pointer to UDF volume descriptor pointer. */
632typedef UDFVOLUMEDESCPTR *PUDFVOLUMEDESCPTR;
633/** Pointer to const UDF volume descriptor pointer. */
634typedef UDFVOLUMEDESCPTR const *PCUDFVOLUMEDESCPTR;
635
636
637/**
638 * UDF implementation use volume descriptor (IUVD) (@ecma167{3,10.4,55},
639 * @udf260{2.2.7,35}).
640 */
641typedef struct UDFIMPLEMENTATIONUSEVOLUMEDESC
642{
643 /** 0x00: The descriptor tag (UDF_TAG_ID_IMPLEMENATION_USE_VOLUME_DESC). */
644 UDFTAG Tag;
645 /** 0x10: Volume descriptor sequence number. */
646 uint32_t uVolumeDescSeqNo;
647 /** 0x14: The implementation identifier (UDF_ENTITY_ID_IUVD_IMPLEMENTATION). */
648 UDFENTITYID idImplementation;
649 /** 0x34: The implementation use area. */
650 union
651 {
652 /** Generic view. */
653 uint8_t ab[460];
654 /** Logical volume information (@udf260{2.2.7.2,35}). */
655 struct
656 {
657 /** 0x034: The character set used in this sub-structure. */
658 UDFCHARSPEC Charset;
659 /** 0x074: Logical volume identifier. */
660 UDFDSTRING achVolumeID[128];
661 /** 0x0f4: Info string \#1. */
662 UDFDSTRING achInfo1[36];
663 /** 0x118: Info string \#2. */
664 UDFDSTRING achInfo2[36];
665 /** 0x13c: Info string \#3. */
666 UDFDSTRING achInfo3[36];
667 /** 0x160: The implementation identifier
668 * (UDF_ENTITY_ID_IUVD_USE_IMPLEMENTATION). */
669 UDFENTITYID idImplementation;
670 /** 0x180: Additional use bytes. */
671 uint8_t abUse[128];
672 } Lvi;
673 } ImplementationUse;
674} UDFIMPLEMENTATIONUSEVOLUMEDESC;
675AssertCompileSize(UDFIMPLEMENTATIONUSEVOLUMEDESC, 512);
676AssertCompileMemberOffset(UDFIMPLEMENTATIONUSEVOLUMEDESC, ImplementationUse.Lvi.Charset, 0x034);
677AssertCompileMemberOffset(UDFIMPLEMENTATIONUSEVOLUMEDESC, ImplementationUse.Lvi.achVolumeID, 0x074);
678AssertCompileMemberOffset(UDFIMPLEMENTATIONUSEVOLUMEDESC, ImplementationUse.Lvi.achInfo1, 0x0f4);
679AssertCompileMemberOffset(UDFIMPLEMENTATIONUSEVOLUMEDESC, ImplementationUse.Lvi.achInfo2, 0x118);
680AssertCompileMemberOffset(UDFIMPLEMENTATIONUSEVOLUMEDESC, ImplementationUse.Lvi.achInfo3, 0x13c);
681AssertCompileMemberOffset(UDFIMPLEMENTATIONUSEVOLUMEDESC, ImplementationUse.Lvi.idImplementation, 0x160);
682/** Pointer to an UDF implementation use volume descriptor. */
683typedef UDFIMPLEMENTATIONUSEVOLUMEDESC *PUDFIMPLEMENTATIONUSEVOLUMEDESC;
684/** Pointer to a const UDF implementation use volume descriptor. */
685typedef UDFIMPLEMENTATIONUSEVOLUMEDESC const *PCUDFIMPLEMENTATIONUSEVOLUMEDESC;
686
687
688/**
689 * UDF partition header descriptor (@ecma167{4,14.3,90}, @udf260{2.3.3,56}).
690 *
691 * This is found in UDFPARTITIONDESC::ContentsUse.
692 */
693typedef struct UDFPARTITIONHDRDESC
694{
695 /** 0x00: Unallocated space table location. Zero length means no table. */
696 UDFSHORTAD UnallocatedSpaceTable;
697 /** 0x08: Unallocated space bitmap location. Zero length means no bitmap. */
698 UDFSHORTAD UnallocatedSpaceBitmap;
699 /** 0x10: Partition integrity table location. Zero length means no table. */
700 UDFSHORTAD PartitionIntegrityTable;
701 /** 0x18: Freed space table location. Zero length means no table. */
702 UDFSHORTAD FreedSpaceTable;
703 /** 0x20: Freed space bitmap location. Zero length means no bitmap. */
704 UDFSHORTAD FreedSpaceBitmap;
705 /** 0x28: Reserved, MBZ. */
706 uint8_t abReserved[88];
707} UDFPARTITIONHDRDESC;
708AssertCompileSize(UDFPARTITIONHDRDESC, 128);
709AssertCompileMemberOffset(UDFPARTITIONHDRDESC, PartitionIntegrityTable, 0x10);
710AssertCompileMemberOffset(UDFPARTITIONHDRDESC, abReserved, 0x28);
711/** Pointer to an UDF partition header descriptor. */
712typedef UDFPARTITIONHDRDESC *PUDFPARTITIONHDRDESC;
713/** Pointer to a const UDF partition header descriptor. */
714typedef UDFPARTITIONHDRDESC const *PCUDFPARTITIONHDRDESC;
715
716
717/**
718 * UDF partition descriptor (PD) (@ecma167{3,10.5,55}, @udf260{2.2.14,51}).
719 */
720typedef struct UDFPARTITIONDESC
721{
722 /** 0x000: The descriptor tag (UDF_TAG_ID_PARTITION_DESC). */
723 UDFTAG Tag;
724 /** 0x010: Volume descriptor sequence number. */
725 uint32_t uVolumeDescSeqNo;
726 /** 0x014: The partition flags (UDF_PARTITION_FLAGS_XXX). */
727 uint16_t fFlags;
728 /** 0x016: The partition number. */
729 uint16_t uPartitionNo;
730 /** 0x018: Partition contents (UDF_ENTITY_ID_PD_PARTITION_CONTENTS_XXX). */
731 UDFENTITYID PartitionContents;
732 /** 0x038: partition contents use (depends on the PartitionContents field). */
733 union
734 {
735 /** Generic view. */
736 uint8_t ab[128];
737 /** UDF partition header descriptor (UDF_ENTITY_ID_PD_PARTITION_CONTENTS_UDF). */
738 UDFPARTITIONHDRDESC Hdr;
739 } ContentsUse;
740 /** 0x0b8: Access type (UDF_PART_ACCESS_TYPE_XXX). */
741 uint32_t uAccessType;
742 /** 0x0bc: Partition starting location (logical sector number). */
743 uint32_t offLocation;
744 /** 0x0c0: Partition length in sectors. */
745 uint32_t cSectors;
746 /** 0x0c4: Implementation identifier (UDF_ENTITY_ID_PD_IMPLEMENTATION). */
747 UDFENTITYID idImplementation;
748 /** 0x0e4: Implemenation use bytes. */
749 union
750 {
751 /** Generic view. */
752 uint8_t ab[128];
753
754 } ImplementationUse;
755 /** 0x164: Reserved. */
756 uint8_t abReserved[156];
757} UDFPARTITIONDESC;
758AssertCompileSize(UDFPARTITIONDESC, 512);
759
760/** @name UDF_PART_ACCESS_TYPE_XXX - UDF partition access types
761 *
762 * See @ecma167{3,10.5.7,57}, @udf260{2.2.14.2,51}.
763 *
764 * @{ */
765/** Access not specified by this field. */
766#define UDF_PART_ACCESS_TYPE_NOT_SPECIFIED UINT32_C(0x00000000)
767/** Read only: No writes. */
768#define UDF_PART_ACCESS_TYPE_READ_ONLY UINT32_C(0x00000001)
769/** Write once: Sectors can only be written once. */
770#define UDF_PART_ACCESS_TYPE_WRITE_ONCE UINT32_C(0x00000002)
771/** Rewritable: Logical sectors may require preprocessing before writing. */
772#define UDF_PART_ACCESS_TYPE_REWRITABLE UINT32_C(0x00000003)
773/** Overwritable: No restrictions on writing. */
774#define UDF_PART_ACCESS_TYPE_OVERWRITABLE UINT32_C(0x00000004)
775/** @} */
776
777
778/**
779 * Logical volume descriptor (LVD) (@ecma167{3,10.6,58}, @udf260{2.2.4,30}).
780 *
781 * @note Variable length.
782 */
783typedef struct UDFLOGICALVOLUMEDESC
784{
785 /** 0x000: The descriptor tag (UDF_TAG_ID_LOGICAL_VOLUME_DESC). */
786 UDFTAG Tag;
787 /** 0x010: Volume descriptor sequence number. */
788 uint32_t uVolumeDescSeqNo;
789 /** 0x014: Character set used in the achLogicalVolumeID field. */
790 UDFCHARSPEC DescriptorCharSet;
791 /** 0x054: The logical volume ID (label). */
792 UDFDSTRING achLogicalVolumeID[128];
793 /** 0x0d4: Logical block size (in bytes). */
794 uint32_t cbLogicalBlock;
795 /** 0x0d8: Domain identifier (UDF_ENTITY_ID_LVD_DOMAIN). */
796 UDFENTITYID idDomain;
797 /** 0x0f8: Logical volume contents use. */
798 union
799 {
800 /** Byte view. */
801 uint8_t ab[16];
802 /** The extent containing the file set descriptor. */
803 UDFLONGAD FileSetDescriptor;
804 } ContentsUse;
805 /** 0x108: Map table length (in bytes). */
806 uint32_t cbMapTable;
807 /** 0x10c: Number of partition maps. */
808 uint32_t cPartitionMaps;
809 /** 0x110: Implementation identifier (UDF_ENTITY_ID_LVD_IMPLEMENTATION). */
810 UDFENTITYID idImplementation;
811 /** 0x130: Implementation use. */
812 union
813 {
814 /** Byte view. */
815 uint8_t ab[128];
816 } ImplementationUse;
817 /** 0x1b0: Integrity sequence extent. Can be zero if cPartitionMaps is zero. */
818 UDFEXTENTAD IntegritySeqExtent;
819 /** 0x1b8: Partition maps (length given by @a cPartitionMaps). */
820 uint8_t abPartitionMaps[RT_FLEXIBLE_ARRAY];
821} UDFLOGICALVOLUMEDESC;
822AssertCompileMemberOffset(UDFLOGICALVOLUMEDESC, abPartitionMaps, 0x1b8);
823/** Pointer to an UDF logical volume descriptor. */
824typedef UDFLOGICALVOLUMEDESC *PUDFLOGICALVOLUMEDESC;
825/** Pointer to a const UDF logical volume descriptor. */
826typedef UDFLOGICALVOLUMEDESC const *PCUDFLOGICALVOLUMEDESC;
827
828
829/**
830 * UDF unallocated space descriptor (USD) (@ecma167{3,10.8,61}, @udf260{2.2.5,32}).
831 *
832 * @note Variable length.
833 */
834typedef struct UDFUNALLOCATEDSPACEDESC
835{
836 /** 0x00: The descriptor tag (UDF_TAG_ID_UNALLOCATED_SPACE_DESC). */
837 UDFTAG Tag;
838 /** 0x10: Volume descriptor sequence number. */
839 uint32_t uVolumeDescSeqNo;
840 /** 0x14: Number of allocation descriptors in the array below. */
841 uint32_t cAllocationDescriptors;
842 /** 0x18: Allocation descriptors (variable length). */
843 UDFEXTENTAD aAllocationDescriptors[RT_FLEXIBLE_ARRAY];
844} UDFUNALLOCATEDSPACEDESC;
845AssertCompileMemberOffset(UDFUNALLOCATEDSPACEDESC, aAllocationDescriptors, 0x18);
846/** Pointer to an UDF unallocated space descriptor. */
847typedef UDFUNALLOCATEDSPACEDESC *PUDFUNALLOCATEDSPACEDESC;
848/** Pointer to a const UDF unallocated space descriptor. */
849typedef UDFUNALLOCATEDSPACEDESC const *PCUDFUNALLOCATEDSPACEDESC;
850
851
852/**
853 * UDF terminating descriptor (@ecma167{3,10.9,62}, @ecma167{4,14.2,62}).
854 */
855typedef struct UDFTERMINATINGDESC
856{
857 /** 0x00: The descriptor tag (UDF_TAG_ID_TERMINATING_DESC). */
858 UDFTAG Tag;
859 /** 0x10: Reserved, MBZ. */
860 uint8_t abReserved[496];
861} UDFTERMINATINGDESC;
862/** Pointer to an UDF terminating descriptor. */
863typedef UDFTERMINATINGDESC *PUDFTERMINATINGDESC;
864/** Pointer to a const UDF terminating descriptor. */
865typedef UDFTERMINATINGDESC const *PCUDFTERMINATINGDESC;
866
867
868/**
869 * UDF logical volume integrity descriptor (LVID) (@ecma167{3,10.10,62},
870 * @udf260{2.2.6,32}).
871 */
872typedef struct UDFLOGICALVOLINTEGRITYDESC
873{
874 /** 0x00: The descriptor tag (UDF_TAG_ID_TERMINATING_DESC). */
875 UDFTAG Tag;
876 /** 0x10: Recording timestamp. */
877 UDFTIMESTAMP RecordingTimestamp;
878 /** 0x1c: Integrity type (UDF_LVID_TYPE_XXX). */
879 uint32_t uIntegrityType;
880 /** 0x20: The next integrity extent. */
881 UDFEXTENTAD NextIntegrityExtent;
882 /** 0x28: Number of partitions. */
883 uint32_t cPartitions;
884 /** 0x2c: Length of implementation use. */
885 uint32_t cbImplementationUse;
886 /**
887 * There are two tables each @a cPartitions in size. The first is the free
888 * space table. The second the size table.
889 *
890 * Following these tables there are @a cbImplemenationUse bytes of space for
891 * the implementation to use.
892 */
893 uint32_t aTables[RT_FLEXIBLE_ARRAY];
894} UDFLOGICALVOLINTEGRITYDESC;
895AssertCompileMemberOffset(UDFLOGICALVOLINTEGRITYDESC, cbImplementationUse, 0x2c);
896AssertCompileMemberOffset(UDFLOGICALVOLINTEGRITYDESC, aTables, 0x30);
897/** Pointer to an UDF logical volume integrity descriptor. */
898typedef UDFLOGICALVOLINTEGRITYDESC *PUDFLOGICALVOLINTEGRITYDESC;
899/** Pointer to a const UDF logical volume integrity descriptor. */
900typedef UDFLOGICALVOLINTEGRITYDESC const *PCUDFLOGICALVOLINTEGRITYDESC;
901
902/** @name UDF_LVID_TYPE_XXX - Integirty types.
903 * @{ */
904#define UDF_LVID_TYPE_OPEN UINT32_C(0x00000000)
905#define UDF_LVID_TYPE_CLOSE UINT32_C(0x00000001)
906/** @} */
907
908/**
909 * UDF file set descriptor (FSD) (@ecma167{4,14.1,86}, @udf260{2.3.2,54}).
910 */
911typedef struct UDFFILESETDESC
912{
913 /** 0x000: The descriptor tag (UDF_TAG_ID_FILE_SET_DESC). */
914 UDFTAG Tag;
915 /** 0x010: Recording timestamp. */
916 UDFTIMESTAMP RecordingTimestamp;
917 /** 0x01c: Interchange level. */
918 uint16_t uInterchangeLevel;
919 /** 0x01e: Maximum interchange level. */
920 uint16_t uMaxInterchangeLevel;
921 /** 0x020: Character set bitmask (aka list). Each bit correspond to a
922 * character set number. */
923 uint32_t fCharacterSets;
924 /** 0x024: Maximum character set bitmask (aka list). */
925 uint32_t fMaxCharacterSets;
926 /** 0x028: File set number. */
927 uint32_t uFileSetNo;
928 /** 0x02c: File set descriptor number. */
929 uint32_t uFileSetDescNo;
930 /** 0x030: Logical volume identifier character set. */
931 UDFCHARSPEC LogicalVolumeIDCharSet;
932 /** 0x070: Logical volume identifier string. */
933 UDFDSTRING achLogicalVolumeID[128];
934 /** 0x0e0: File set character set. */
935 UDFCHARSPEC FileSetCharSet;
936 /** 0x130: Identifier string for this file set. */
937 UDFDSTRING achFileSetID[32];
938 /** 0x150: Names a root file containing copyright info. Optional. */
939 UDFDSTRING achCopyrightFile[32];
940 /** 0x170: Names a root file containing an abstract for the file set. Optional. */
941 UDFDSTRING achAbstractFile[32];
942 /** 0x190: Root directory information control block location (ICB).
943 * An ICB is a sequence made up of UDF_TAG_ID_FILE_ENTRY,
944 * UDF_TAG_ID_INDIRECT_ENTRY, and UDF_TAG_ID_TERMINAL_ENTRY descriptors. */
945 UDFLONGAD RootDirIcb;
946 /** 0x1a0: Domain identifier (UDF_ENTITY_FSD_LVD_DOMAIN). Optional. */
947 UDFENTITYID idDomain;
948 /** 0x1c0: Next location with file set descriptors location, 0 if none. */
949 UDFLONGAD NextExtent;
950 /** 0x1d0: Location of the system stream directory associated with the
951 * file set. Optional. */
952 UDFLONGAD SystemStreamDirIcb;
953 /** 0x1e0: Reserved, MBZ. */
954 uint8_t abReserved[32];
955} UDFFILESETDESC;
956AssertCompileSize(UDFFILESETDESC, 512);
957/** Pointer to an UDF file set descriptor. */
958typedef UDFFILESETDESC *PUDFFILESETDESC;
959/** Pointer to a const UDF file set descriptor. */
960typedef UDFFILESETDESC const *PCUDFFILESETDESC;
961
962
963/**
964 * UDF file identifier descriptor (FID) (@ecma167{4,14.4,91}, @udf260{2.3.4,57}).
965 */
966typedef struct UDFFILEIDDESC
967{
968 /** 0x00: The descriptor tag (UDF_TAG_ID_FILE_ID_DESC). */
969 UDFTAG Tag;
970 /** 0x10: File version number (1..32767). Always set to 1. */
971 uint16_t uVersion;
972 /** 0x12: File characteristics (UDF_FILE_FLAGS_XXX). */
973 uint8_t fFlags;
974 /** 0x13: File identifier (name) length. */
975 uint8_t cbName;
976 /** 0x14: Location of an information control block describing the file.
977 * Can be null if marked deleted. The implementation defined part of
978 * this contains additional flags and a unique ID. */
979 UDFLONGAD Icb;
980 /** 0x24: Length of implementation use field (in bytes). This can be zero.
981 *
982 * It can be used to prevent the following FID from spanning a block
983 * boundrary, in which case it will be 32 bytes or more, and the it will
984 * start with an UDFENTITYID identifying who last wrote it.
985 *
986 * The latter padding fun is a requirement from write-once media. */
987 uint16_t cbImplementationUse;
988 /** 0x26: Two variable sized fields followed by padding to make the
989 * actual structure size 4 byte aligned. The first field in an
990 * implementation use field with length given by @a cbImplementationUse.
991 * After that is a d-string field with the name of the file, length
992 * specified by @a cbName. */
993 uint8_t abImplementationUse[RT_FLEXIBLE_ARRAY];
994} UDFFILEIDDESC;
995AssertCompileMemberOffset(UDFFILEIDDESC, fFlags, 0x12);
996AssertCompileMemberOffset(UDFFILEIDDESC, cbName, 0x13);
997AssertCompileMemberOffset(UDFFILEIDDESC, Icb, 0x14);
998AssertCompileMemberOffset(UDFFILEIDDESC, abImplementationUse, 0x26);
999/** Pointer to an UDF file set descriptor */
1000typedef UDFFILEIDDESC *PUDFFILEIDDESC;
1001
1002/** Get the pointer to the name field. */
1003#define UDFFILEIDDESC_2_NAME(a_pFid) ((char *)(&(a_pFid)->abImplementationUse[(a_pFid)->cbImplementationUse]))
1004/** Calculates the total size the size of a record. */
1005#define UDFFILEIDDESC_CALC_SIZE_EX(cbImplementationUse, cbName) \
1006 RT_ALIGN_Z(RT_UOFFSETOF(UDFFILEIDDESC, abImplementationUse) + cbImplementationUse + cbName, 4)
1007/** Gets the actual size of a record. */
1008#define UDFFILEIDDESC_GET_SIZE(a_pFid) UDFFILEIDDESC_CALC_SIZE_EX((a_pFid)->cbImplementationUse + (a_pFid)->cbName)
1009
1010/** @name UDF_FILE_FLAGS_XXX
1011 * @{ */
1012/** Existence - Hide the file from the user. */
1013#define UDF_FILE_FLAGS_HIDDEN UINT8_C(0x01)
1014/** Directory - Indicates a directory as apposed to some kind of file or symlink or something (0). */
1015#define UDF_FILE_FLAGS_DIRECTORY UINT8_C(0x02)
1016/** Deleted - Indicate that the file has been deleted. Assoicated descriptors may still be valid, though. */
1017#define UDF_FILE_FLAGS_DELETED UINT8_C(0x04)
1018/** Parent - Indicate the ICB field refers to the parent directory (or mabye
1019 * a file in case of streaming directory). */
1020#define UDF_FILE_FLAGS_PARENT UINT8_C(0x08)
1021/** Metadata - Zero means user data, one means implementation specific metadata.
1022 * Only allowed used in stream directory. */
1023#define UDF_FILE_FLAGS_METADATA UINT8_C(0x10)
1024/** Reserved bits that should be zer. */
1025#define UDF_FILE_FLAGS_RESERVED_MASK UINT8_C(0xe0)
1026/** @} */
1027
1028
1029/**
1030 * UDF allocation extent descriptor (@ecma167{4,14.5,93}, @udf260{2.3.11,67}).
1031 */
1032typedef struct UDFALLOCATIONEXTENTDESC
1033{
1034 /** 0x00: The descriptor tag (UDF_TAG_ID_ALLOCATION_EXTENT_DESC). */
1035 UDFTAG Tag;
1036 /** 0x10: Previous allocation extent location (logical block in current
1037 * partition). */
1038 uint32_t offPrevExtent;
1039 /** 0x14: Size of the following allocation descriptors (in bytes). */
1040 uint32_t cbAllocDescs;
1041 /** 0x18: Allocation descriptors. */
1042 union
1043 {
1044 UDFSHORTAD aShortADs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1045 UDFLONGAD aLongADs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1046 UDFEXTAD aExtADs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1047 } u;
1048} UDFALLOCATIONEXTENTDESC;
1049AssertCompileMemberOffset(UDFALLOCATIONEXTENTDESC, u, 0x18);
1050/** Pointer to an UDF allocation extent descriptor. */
1051typedef UDFALLOCATIONEXTENTDESC *PUDFALLOCATIONEXTENTDESC;
1052/** Pointer to a const UDF allocation extent descriptor. */
1053typedef UDFALLOCATIONEXTENTDESC const *PCUDFALLOCATIONEXTENTDESC;
1054
1055/**
1056 * UDF information control block tag (@ecma167{4,14.6,93}, @udf260{2.3.5,60}).
1057 */
1058typedef struct UDFICBTAG
1059{
1060 /** 0x00: Number of direct entries in this ICB prior to this one. */
1061 uint32_t cEntiresBeforeThis;
1062 /** 0x04: ICB hierarchy building strategy type (UDF_ICB_STRATEGY_TYPE_XXX). */
1063 uint16_t uStrategyType;
1064 /** 0x06: Type specific parameters. */
1065 uint8_t abStrategyParams[2];
1066 /** 0x08: Max number of direct and indirect entries that MAY be recorded in this ICB. */
1067 uint16_t cMaxEntries;
1068 /** 0x0a: Reserved, MBZ. */
1069 uint8_t bReserved;
1070 /** 0x0b: File type (UDF_FILE_TYPE_XXX). */
1071 uint8_t bFileType;
1072 /** 0x0c: Parent ICB location. */
1073 UDFLBADDR ParentIcb;
1074 /** 0x12: Parent ICB location (UDF_ICB_FLAGS_XXX). */
1075 uint16_t fFlags;
1076} UDFICBTAG;
1077AssertCompileSize(UDFICBTAG, 20);
1078typedef UDFICBTAG *PUDFICBTAG;
1079typedef UDFICBTAG const *PCUDFICBTAG;
1080
1081/** @name UDF_ICB_STRATEGY_TYPE_XXX - ICB hierarchy building strategies
1082 *
1083 * See @ecma167{4,14.6.2,94}, @udf260{6.6,121}
1084 *
1085 * @{ */
1086/** Strategy not specified. */
1087#define UDF_ICB_STRATEGY_TYPE_NOT_SPECIFIED UINT16_C(0x0000)
1088/** See @ecma167{4,A.2,129}. */
1089#define UDF_ICB_STRATEGY_TYPE_1 UINT16_C(0x0001)
1090/** See @ecma167{4,A.3,131}. */
1091#define UDF_ICB_STRATEGY_TYPE_2 UINT16_C(0x0002)
1092/** See @ecma167{4,A.4,131}. */
1093#define UDF_ICB_STRATEGY_TYPE_3 UINT16_C(0x0003)
1094/** See @ecma167{4,A.5,131}. */
1095#define UDF_ICB_STRATEGY_TYPE_4 UINT16_C(0x0004)
1096/** Defined by the UDF spec, see @udf260{6.6,121}. */
1097#define UDF_ICB_STRATEGY_TYPE_4096 UINT16_C(0x1000)
1098/** @} */
1099
1100/** @name UDF_ICB_FLAGS_XXX - ICB flags
1101 *
1102 * See @ecma167{4,14.6.8,95}, @udf260{2.3.5.4,61}
1103 *
1104 * @{ */
1105/** Using UDFSHORTAD. */
1106#define UDF_ICB_FLAGS_AD_TYPE_SHORT UINT16_C(0x0000)
1107/** Using UDFLONGAD. */
1108#define UDF_ICB_FLAGS_AD_TYPE_LONG UINT16_C(0x0001)
1109/** Using UDFEXTAD. */
1110#define UDF_ICB_FLAGS_AD_TYPE_EXTENDED UINT16_C(0x0002)
1111/** Single descriptor. */
1112#define UDF_ICB_FLAGS_AD_TYPE_SINGLE UINT16_C(0x0003)
1113/** Allocation type mask. */
1114#define UDF_ICB_FLAGS_AD_TYPE_MASK UINT16_C(0x0007)
1115/** Set on directories that are sorted (according to @ecma167{4,8.6.1,78}).
1116 * @note Directories are never sorted in UDF. */
1117#define UDF_ICB_FLAGS_SORTED_DIRECTORY UINT16_C(0x0008)
1118/** Not relocatable. */
1119#define UDF_ICB_FLAGS_NON_RELOCATABLE UINT16_C(0x0010)
1120/** Indicate that the file needs backing up (DOS attribute). */
1121#define UDF_ICB_FLAGS_ARCHIVE UINT16_C(0x0020)
1122/** Set UID bit (UNIX). */
1123#define UDF_ICB_FLAGS_SET_UID UINT16_C(0x0040)
1124/** Set GID bit (UNIX). */
1125#define UDF_ICB_FLAGS_SET_GID UINT16_C(0x0080)
1126/** Set sticky bit (UNIX). */
1127#define UDF_ICB_FLAGS_STICKY UINT16_C(0x0100)
1128/** Extents are contiguous. */
1129#define UDF_ICB_FLAGS_CONTIGUOUS UINT16_C(0x0200)
1130/** System bit, reserved for implementation use. */
1131#define UDF_ICB_FLAGS_SYSTEM UINT16_C(0x0400)
1132/** Data has been transformed in some way.
1133 * @note UDF shall not set this bit. */
1134#define UDF_ICB_FLAGS_TRANSFORMED UINT16_C(0x0800)
1135/** Directory may contain multi-versioned files.
1136 * @note UDF shall not set this bit. */
1137#define UDF_ICB_FLAGS_MULTI_VERSIONS UINT16_C(0x1000)
1138/** Is a stream in a stream directory. */
1139#define UDF_ICB_FLAGS_STREAM UINT16_C(0x2000)
1140/** Reserved mask. */
1141#define UDF_ICB_FLAGS_RESERVED_MASK UINT16_C(0xc000)
1142/** @} */
1143
1144/** @name UDF_FILE_TYPE_XXX - File types
1145 *
1146 * See @ecma167{4,14.6.6,94}, @udf260{2.3.5.2,60}
1147 *
1148 * @{ */
1149#define UDF_FILE_TYPE_NOT_SPECIFIED UINT8_C(0x00) /**< Not specified by this field. */
1150#define UDF_FILE_TYPE_UNALLOCATED_SPACE_ENTRY UINT8_C(0x01)
1151#define UDF_FILE_TYPE_PARTITION_INTEGRITY_ENTRY UINT8_C(0x02)
1152#define UDF_FILE_TYPE_INDIRECT_ENTRY UINT8_C(0x03)
1153#define UDF_FILE_TYPE_DIRECTORY UINT8_C(0x04)
1154#define UDF_FILE_TYPE_REGULAR_FILE UINT8_C(0x05)
1155#define UDF_FILE_TYPE_BLOCK_DEVICE UINT8_C(0x06)
1156#define UDF_FILE_TYPE_CHARACTER_DEVICE UINT8_C(0x07)
1157#define UDF_FILE_TYPE_EXTENDED_ATTRIBUTES UINT8_C(0x08)
1158#define UDF_FILE_TYPE_FIFO UINT8_C(0x09)
1159#define UDF_FILE_TYPE_SOCKET UINT8_C(0x0a)
1160#define UDF_FILE_TYPE_TERMINAL_ENTRY UINT8_C(0x0b)
1161#define UDF_FILE_TYPE_SYMBOLIC_LINK UINT8_C(0x0c)
1162#define UDF_FILE_TYPE_STREAM_DIRECTORY UINT8_C(0x0d)
1163#define UDF_FILE_TYPE_VAT UINT8_C(0xf8)
1164#define UDF_FILE_TYPE_REAL_TIME_FILE UINT8_C(0xf9)
1165#define UDF_FILE_TYPE_METADATA_FILE UINT8_C(0xfa)
1166#define UDF_FILE_TYPE_METADATA_MIRROR_FILE UINT8_C(0xfb)
1167#define UDF_FILE_TYPE_METADATA_BITMAP_FILE UINT8_C(0xfc)
1168/** @} */
1169
1170
1171/**
1172 * UDF indirect entry (@ecma167{4,14.7,96}).
1173 */
1174typedef struct UDFINDIRECTENTRY
1175{
1176 /** 0x00: The descriptor tag (UDF_TAG_ID_INDIRECT_ENTRY). */
1177 UDFTAG Tag;
1178 /** 0x10: ICB Tag. */
1179 UDFICBTAG IcbTag;
1180 /** 0x24: Indirect ICB location. */
1181 UDFLONGAD IndirectIcb;
1182} UDFINDIRECTENTRY;
1183AssertCompileSize(UDFINDIRECTENTRY, 52);
1184/** Pointer to an UDF indirect entry. */
1185typedef UDFINDIRECTENTRY *PUDFINDIRECTENTRY;
1186/** Pointer to a const UDF indirect entry. */
1187typedef UDFINDIRECTENTRY const *PCUDFINDIRECTENTRY;
1188
1189
1190/**
1191 * UDF terminal entry (@ecma167{4,14.8,97}).
1192 */
1193typedef struct UDFTERMINALENTRY
1194{
1195 /** 0x00: The descriptor tag (UDF_TAG_ID_TERMINAL_ENTRY). */
1196 UDFTAG Tag;
1197 /** 0x10: ICB Tag (UDF_FILE_TYPE_TERMINAL_ENTRY). */
1198 UDFICBTAG IcbTag;
1199} UDFTERMINALENTRY;
1200AssertCompileSize(UDFTERMINALENTRY, 36);
1201/** Pointer to an UDF terminal entry. */
1202typedef UDFTERMINALENTRY *PUDFTERMINALENTRY;
1203/** Pointer to a const UDF terminal entry. */
1204typedef UDFTERMINALENTRY const *PCUDFTERMINALENTRY;
1205
1206
1207/**
1208 * UDF file entry (FE) (@ecma167{4,14.8,97}, @udf260{2.3.6,62}).
1209 *
1210 * @note Total length shall not exceed one logical block.
1211 */
1212typedef struct UDFFILEENTRY
1213{
1214 /** 0x00: The descriptor tag (UDF_TAG_ID_FILE_ENTRY). */
1215 UDFTAG Tag;
1216 /** 0x10: ICB Tag. */
1217 UDFICBTAG IcbTag;
1218 /** 0x24: User ID (UNIX). */
1219 uint32_t uid;
1220 /** 0x28: Group ID (UNIX). */
1221 uint32_t gid;
1222 /** 0x2c: Permission (UDF_PERM_XXX). */
1223 uint32_t fPermissions;
1224 /** 0x30: Number hard links. */
1225 uint16_t cHardlinks;
1226 /** 0x32: Record format (UDF_REC_FMT_XXX). */
1227 uint8_t uRecordFormat;
1228 /** 0x33: Record format (UDF_REC_FMT_XXX). */
1229 uint8_t fRecordDisplayAttribs;
1230 /** 0x34: Record length (in bytes).
1231 * @note Must be zero according to the UDF specification. */
1232 uint32_t cbRecord;
1233 /** 0x38: Information length in bytes (file size). */
1234 uint64_t cbData;
1235 /** 0x40: Number of logical blocks allocated (for file data). */
1236 uint64_t cLogicalBlocks;
1237 /** 0x48: Time of last access (prior to recording the file entry). */
1238 UDFTIMESTAMP AccessTime;
1239 /** 0x54: Time of last data modification. */
1240 UDFTIMESTAMP ModificationTime;
1241 /** 0x60: Time of last attribute/status modification. */
1242 UDFTIMESTAMP ChangeTime;
1243 /** 0x6c: Checkpoint number (defaults to 1). */
1244 uint32_t uCheckpoint;
1245 /** 0x70: Extended attribute information control block location. */
1246 UDFLONGAD ExtAttribIcb;
1247 /** 0x80: Implementation identifier (UDF_ENTITY_ID_FE_IMPLEMENTATION). */
1248 UDFENTITYID idImplementation;
1249 /** 0xa0: Unique ID. */
1250 uint64_t INodeId;
1251 /** 0xa8: Length of extended attributes in bytes, multiple of four. */
1252 uint32_t cbExtAttribs;
1253 /** 0xac: Length of allocation descriptors in bytes, multiple of four. */
1254 uint32_t cbAllocDescs;
1255 /** 0xb0: Two variable sized fields. First @a cbExtAttribs bytes of extended
1256 * attributes, then @a cbAllocDescs bytes of allocation descriptors. */
1257 uint8_t abExtAttribs[RT_FLEXIBLE_ARRAY];
1258} UDFFILEENTRY;
1259AssertCompileMemberOffset(UDFFILEENTRY, abExtAttribs, 0xb0);
1260/** Pointer to an UDF file entry. */
1261typedef UDFFILEENTRY *PUDFFILEENTRY;
1262/** Pointer to a const UDF file entry. */
1263typedef UDFFILEENTRY const *PCUDFFILEENTRY;
1264
1265/** @name UDF_PERM_XXX - UDFFILEENTRY::fPermissions
1266 * See @ecma167{4,14.9.5,99}.
1267 * @{ */
1268#define UDF_PERM_OTH_EXEC UINT32_C(0x00000001)
1269#define UDF_PERM_OTH_WRITE UINT32_C(0x00000002)
1270#define UDF_PERM_OTH_READ UINT32_C(0x00000004)
1271#define UDF_PERM_OTH_ATTRIB UINT32_C(0x00000008)
1272#define UDF_PERM_OTH_DELETE UINT32_C(0x00000010)
1273#define UDF_PERM_OTH_MASK UINT32_C(0x0000001f)
1274
1275#define UDF_PERM_GRP_EXEC UINT32_C(0x00000020)
1276#define UDF_PERM_GRP_WRITE UINT32_C(0x00000040)
1277#define UDF_PERM_GRP_READ UINT32_C(0x00000080)
1278#define UDF_PERM_GRP_ATTRIB UINT32_C(0x00000100)
1279#define UDF_PERM_GRP_DELETE UINT32_C(0x00000200)
1280#define UDF_PERM_GRP_MASK UINT32_C(0x000003e0)
1281
1282#define UDF_PERM_USR_EXEC UINT32_C(0x00000400)
1283#define UDF_PERM_USR_WRITE UINT32_C(0x00000800)
1284#define UDF_PERM_USR_READ UINT32_C(0x00001000)
1285#define UDF_PERM_USR_ATTRIB UINT32_C(0x00002000)
1286#define UDF_PERM_USR_DELETE UINT32_C(0x00004000)
1287#define UDF_PERM_USR_MASK UINT32_C(0x00007c00)
1288
1289#define UDF_PERM_USR_RESERVED_MASK UINT32_C(0xffff8000)
1290/** @} */
1291
1292/** @name UDF_REC_FMT_XXX - Record format.
1293 * See @ecma167{4,14.9.7,100}.
1294 * @{ */
1295/** Not record format specified.
1296 * @note The only allowed value according to the UDF specification. */
1297#define UDF_REC_FMT_NOT_SPECIFIED UINT8_C(0x00)
1298/** @} */
1299
1300/** @name UDF_REC_ATTR_XXX - Record display attributes.
1301 * See @ecma167{4,14.9.8,100}.
1302 * @{ */
1303/** Manner of record display not specified.
1304 * @note The only allowed value according to the UDF specification. */
1305#define UDF_REC_ATTR_NOT_SPECIFIED UINT8_C(0x00)
1306/** @} */
1307
1308
1309/**
1310 * UDF extended attribute header descriptor (@ecma167{4,14.10.1,102},
1311 * @udf260{3.3.4,79}).
1312 */
1313typedef struct UDFEXTATTRIBHDRDESC
1314{
1315 /** 0x00: The descriptor tag (UDF_TAG_ID_EXTENDED_ATTRIB_HDR_DESC). */
1316 UDFTAG Tag;
1317 /** 0x10: Implementation attributes location (byte offset) into the EA space.
1318 * This typically set to UINT32_MAX if not present, though any value larger
1319 * than the EA space will do. */
1320 uint32_t offImplementationAttribs;
1321 /** 0x14: Application attributes location (byte offset) into the EA space.
1322 * This typically set to UINT32_MAX if not present, though any value larger
1323 * than the EA space will do. */
1324 uint32_t offApplicationAttribs;
1325} UDFEXTATTRIBHDRDESC;
1326AssertCompileSize(UDFEXTATTRIBHDRDESC, 24);
1327/** Pointer to an UDF extended attribute header descriptor. */
1328typedef UDFEXTATTRIBHDRDESC *PUDFEXTATTRIBHDRDESC;
1329/** Pointer to a const UDF extended attribute header descriptor. */
1330typedef UDFEXTATTRIBHDRDESC const *PCUDFEXTATTRIBHDRDESC;
1331
1332/**
1333 * UDF character set info EA data (@ecma167{4,14.10.3,104}).
1334 *
1335 * Not needed by UDF.
1336 */
1337typedef struct UDFEADATACHARSETINFO
1338{
1339 /** 0x00/0x0c: The length of the escape sequences (in bytes). */
1340 uint32_t cbEscSeqs;
1341 /** 0x04/0x10: The character set type (UDF_CHAR_SET_TYPE_XXX). */
1342 uint8_t bType;
1343 /** 0x05/0x11: Escape sequences. */
1344 uint8_t abEscSeqs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1345} UDFEADATACHARSETINFO;
1346/** Pointer to UDF character set info EA data. */
1347typedef UDFEADATACHARSETINFO *PUDFEADATACHARSETINFO;
1348/** Pointer to const UDF character set info EA data. */
1349typedef UDFEADATACHARSETINFO const *PCUDFEADATACHARSETINFO;
1350/** UDFGEA::uAttribType value for UDFEADATACHARSETINFO.*/
1351#define UDFEADATACHARSETINFO_ATTRIB_TYPE UINT32_C(0x00000001)
1352/** UDFGEA::uAttribSubtype value for UDFEADATACHARSETINFO. */
1353#define UDFEADATACHARSETINFO_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1354
1355/**
1356 * UDF alternate permissions EA data (@ecma167{4,14.10.4,105}, @udf260{3.3.4.2,80}).
1357 * @note Not recorded according to the UDF specification.
1358 */
1359typedef struct UDFEADATAALTPERM
1360{
1361 /** 0x00/0x0c: Alternative owner ID. */
1362 uint16_t idOwner;
1363 /** 0x02/0x0e: Alternative group ID. */
1364 uint16_t idGroup;
1365 /** 0x04/0x10: Alternative permissions. */
1366 uint16_t fPermission;
1367} UDFEADATAALTPERM;
1368/** Pointer to UDF alternative permissions EA data. */
1369typedef UDFEADATAALTPERM *PUDFEADATAALTPERM;
1370/** Pointer to const UDF alternative permissions EA data. */
1371typedef UDFEADATAALTPERM const *PCUDFEADATAALTPERM;
1372/** UDFGEA::uAttribType value for UDFEADATAALTPERM. */
1373#define UDFEADATAALTPERM_ATTRIB_TYPE UINT32_C(0x00000003)
1374/** UDFGEA::uAttribSubtype value for UDFEADATAALTPERM. */
1375#define UDFEADATAALTPERM_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1376
1377/**
1378 * UDF file times EA data (@ecma167{4,14.10.5,108}, @udf260{3.3.4.3,80}).
1379 * (This is a bit reminiscent of ISO9660RRIPTF.)
1380 */
1381typedef struct UDFEADATAFILETIMES
1382{
1383 /** 0x00/0x0c: Timestamp length. */
1384 uint32_t cbTimestamps;
1385 /** 0x04/0x10: Indicates which timestamps are present
1386 * (UDF_FILE_TIMES_EA_F_XXX). */
1387 uint32_t fFlags;
1388 /** 0x08/0x14: Timestamps. */
1389 UDFTIMESTAMP aTimestamps[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1390} UDFEADATAFILETIMES;
1391/** Pointer to UDF file times EA data. */
1392typedef UDFEADATAFILETIMES *PUDFEADATAFILETIMES;
1393/** Pointer to const UDF file times EA data. */
1394typedef UDFEADATAFILETIMES const *PCUDFEADATAFILETIMES;
1395/** UDFGEA::uAttribType value for UDFEADATAFILETIMES. */
1396#define UDFEADATAFILETIMES_ATTRIB_TYPE UINT32_C(0x00000005)
1397/** UDFGEA::uAttribSubtype value for UDFEADATAFILETIMES. */
1398#define UDFEADATAFILETIMES_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1399
1400/** @name UDF_FILE_TIMES_EA_F_XXX - File times existence flags.
1401 * See @ecma167{4,14.10.5.6,109}
1402 * @{ */
1403#define UDF_FILE_TIMES_EA_F_BIRTH UINT8_C(0x01) /**< Birth (creation) timestamp is recorded. */
1404#define UDF_FILE_TIMES_EA_F_DELETE UINT8_C(0x04) /**< Deletion timestamp is recorded. */
1405#define UDF_FILE_TIMES_EA_F_EFFECTIVE UINT8_C(0x08) /**< Effective timestamp is recorded. */
1406#define UDF_FILE_TIMES_EA_F_BACKUP UINT8_C(0x20) /**< Backup timestamp is recorded. */
1407#define UDF_FILE_TIMES_EA_F_RESERVED_MASK UINT8_C(0xd2)
1408/** @} */
1409
1410/**
1411 * UDF information times EA data (@ecma167{4,14.10.6,109}).
1412 */
1413typedef struct UDFEADATAINFOTIMES
1414{
1415 /** 0x00/0x0c: Timestamp length. */
1416 uint32_t cbTimestamps;
1417 /** 0x04/0x10: Indicates which timestamps are present
1418 * (UDF_INFO_TIMES_EA_F_XXX). */
1419 uint32_t fFlags;
1420 /** 0x08/0x14: Timestamps. */
1421 UDFTIMESTAMP aTimestamps[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1422} UDFEADATAINFOTIMES;
1423/** Pointer to UDF information times EA data. */
1424typedef UDFEADATAINFOTIMES *PUDFEADATAINFOTIMES;
1425/** Pointer to const UDF information times EA data. */
1426typedef UDFEADATAINFOTIMES const *PCUDFEADATAINFOTIMES;
1427/** UDFGEA::uAttribType value for UDFEADATAINFOTIMES. */
1428#define UDFEADATAINFOTIMES_ATTRIB_TYPE UINT32_C(0x00000006)
1429/** UDFGEA::uAttribSubtype value for UDFEADATAINFOTIMES. */
1430#define UDFEADATAINFOTIMES_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1431
1432/** @name UDF_INFO_TIMES_EA_F_XXX - Information times existence flags.
1433 * See @ecma167{4,14.10.6.6,110}
1434 * @{ */
1435#define UDF_INFO_TIMES_EA_F_BIRTH UINT8_C(0x01) /**< Birth (creation) timestamp is recorded. */
1436#define UDF_INFO_TIMES_EA_F_MODIFIED UINT8_C(0x02) /**< Last (data) modified timestamp is recorded. */
1437#define UDF_INFO_TIMES_EA_F_EXPIRE UINT8_C(0x04) /**< Expiration (deletion) timestamp is recorded. */
1438#define UDF_INFO_TIMES_EA_F_EFFECTIVE UINT8_C(0x08) /**< Effective timestamp is recorded. */
1439#define UDF_INFO_TIMES_EA_F_RESERVED_MASK UINT8_C(0xf0)
1440/** @} */
1441
1442/**
1443 * UDF device specification EA data (@ecma167{4,14.10.7,110}, @udf260{3.3.4.4,81}).
1444 */
1445typedef struct UDFEADATADEVICESPEC
1446{
1447 /** 0x00/0x0c: Length of implementation use field. */
1448 uint32_t cbImplementationUse;
1449 /** 0x04/0x10: Major device number. */
1450 uint32_t uMajorDeviceNo;
1451 /** 0x08/0x14: Minor device number. */
1452 uint32_t uMinorDeviceNo;
1453 /** 0x0c/0x18: Implementation use field (variable length).
1454 * UDF specficiation expects UDFENTITYID with
1455 * UDF_ENTITY_ID_DSEA_IMPLEMENTATION_USE as first part here. */
1456 uint8_t abImplementationUse[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1457} UDFEADATADEVICESPEC;
1458/** Pointer to UDF device specification EA data. */
1459typedef UDFEADATADEVICESPEC *PUDFEADATADEVICESPEC;
1460/** Pointer to const UDF device specification EA data. */
1461typedef UDFEADATADEVICESPEC const *PCUDFEADATADEVICESPEC;
1462/** UDFGEA::uAttribType value for UDFEADATADEVICESPEC. */
1463#define UDFEADATADEVICESPEC_ATTRIB_TYPE UINT32_C(0x0000000c)
1464/** UDFGEA::uAttribSubtype value for UDFEADATADEVICESPEC. */
1465#define UDFEADATADEVICESPEC_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1466
1467/**
1468 * UDF free EA space payload for implementation and application use EAs
1469 * (@udf260{3.3.4.5.1.1,82}, @udf260{3.3.4.6.1.1,88}).
1470 *
1471 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_FREE_EA_SPACE.
1472 * UDFEADATAAPPUSE::idImplementation is UDF_ENTITY_ID_AUEA_FREE_EA_SPACE.
1473 */
1474typedef struct UDFFREEEASPACE
1475{
1476 /** 0x00/0x30: Header checksum.
1477 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1478 uint16_t uChecksum;
1479 /** 0x02/0x32: Free space. */
1480 uint8_t abFree[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1481} UDFFREEEASPACE;
1482/** Pointer to UDF free EA space impl/app use payload. */
1483typedef UDFFREEEASPACE *PUDFFREEEASPACE;
1484/** Pointer to const UDF free EA space impl/app use payload. */
1485typedef UDFFREEEASPACE const *PCUDFFREEEASPACE;
1486
1487/**
1488 * UDF DVD copyright management information implementation use EA payload
1489 * (@udf260{3.3.4.5.1.2,83}).
1490 *
1491 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_DVD_CGMS_INFO.
1492 */
1493typedef struct UDFIUEADVDCGMSINFO
1494{
1495 /** 0x00/0x30: Header checksum.
1496 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1497 uint16_t uChecksum;
1498 /** 0x02/0x32: The CGMS information (whatever that is). */
1499 uint8_t bInfo;
1500 /** 0x03/0x33: Data structure type (whatever that is). */
1501 uint8_t bType;
1502 /** 0x04/0x34: Production system information, probably dependend on the
1503 * values of previous fields. */
1504 uint8_t abProtSysInfo[4];
1505} UDFIUEADVDCGMSINFO;
1506/** Pointer to UDF DVD copyright management information implementation use EA payload. */
1507typedef UDFIUEADVDCGMSINFO *PUDFIUEADVDCGMSINFO;
1508/** Pointer to const UDF DVD copyright management information implementation use EA payload. */
1509typedef UDFIUEADVDCGMSINFO const *PCUDFIUEADVDCGMSINFO;
1510
1511/**
1512 * UDF OS/2 EA length implementation use EA payload (@udf260{3.3.4.5.3.1,84}).
1513 *
1514 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_OS2_EA_LENGTH.
1515 */
1516#pragma pack(2)
1517typedef struct UDFIUEAOS2EALENGTH
1518{
1519 /** 0x00/0x30: Header checksum.
1520 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1521 uint16_t uChecksum;
1522 /** 0x02/0x32: The CGMS information (whatever that is). */
1523 uint32_t cbEAs;
1524} UDFIUEAOS2EALENGTH;
1525#pragma pack()
1526AssertCompileMemberOffset(UDFIUEAOS2EALENGTH, cbEAs, 2);
1527/** Pointer to UDF OS/2 EA length implementation use EA payload. */
1528typedef UDFIUEAOS2EALENGTH *PUDFIUEAOS2EALENGTH;
1529/** Pointer to const UDF OS/2 EA length implementation use EA payload. */
1530typedef UDFIUEAOS2EALENGTH const *PCUDFIUEAOS2EALENGTH;
1531
1532/**
1533 * UDF Mac volume info implementation use EA payload (@udf260{3.3.4.5.4.1,84}).
1534 *
1535 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_MAC_VOLUME_INFO.
1536 */
1537#pragma pack(2)
1538typedef struct UDFIUEAMACVOLINFO
1539{
1540 /** 0x00/0x30: Header checksum.
1541 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1542 uint16_t uChecksum;
1543 /** 0x02/0x32: Last modification time. */
1544 UDFTIMESTAMP LastModificationTime;
1545 /** 0x0e/0x3e: Last backup time. */
1546 UDFTIMESTAMP LastBackupTime;
1547 /** 0x1a/0x4e: Volume finder information. */
1548 uint32_t au32FinderInfo[8];
1549} UDFIUEAMACVOLINFO;
1550#pragma pack()
1551AssertCompileMemberOffset(UDFIUEAMACVOLINFO, au32FinderInfo, 0x1a);
1552/** Pointer to UDF Mac volume info implementation use EA payload. */
1553typedef UDFIUEAMACVOLINFO *PUDFIUEAMACVOLINFO;
1554/** Pointer to const UDF Mac volume info implementation use EA payload. */
1555typedef UDFIUEAMACVOLINFO const *PCUDFIUEAMACVOLINFO;
1556
1557/**
1558 * UDF point for use in Mac EAs (@udf260{3.3.4.5.4.2,86}).
1559 */
1560typedef struct UDFMACPOINT
1561{
1562 /** X coordinate. */
1563 int16_t x;
1564 /** Y coordinate. */
1565 int16_t y;
1566} UDFMACPOINT;
1567
1568/**
1569 * UDF rectangle for using Mac EAs (@udf260{3.3.4.5.4.2,86}).
1570 */
1571typedef struct UDFMACRECT
1572{
1573 /** top Y coordinate. */
1574 int16_t yTop;
1575 /** left X coordinate. */
1576 int16_t xLeft;
1577 /** bottom Y coordinate. (exclusive?) */
1578 int16_t yBottom;
1579 /** right X coordinate. (exclusive?) */
1580 int16_t xRight;
1581} UDFMACRECT;
1582
1583/**
1584 * UDF finder directory info for Mac EAs (@udf260{3.3.4.5.4.2,86}).
1585 */
1586typedef struct UDFMACFDINFO
1587{
1588 UDFMACRECT FrRect;
1589 int16_t FrFlags;
1590 UDFMACPOINT FrLocation;
1591 int16_t FrView;
1592} UDFMACFDINFO;
1593AssertCompileSize(UDFMACFDINFO, 16);
1594
1595/**
1596 * UDF finder directory extended info for Mac EAs (@udf260{3.3.4.5.4.2,86}).
1597 */
1598typedef struct UDFMACFDXINFO
1599{
1600 UDFMACPOINT FrScroll;
1601 int32_t FrOpenChain;
1602 uint8_t FrScript;
1603 uint8_t FrXFlags;
1604 uint16_t FrComment;
1605 uint32_t FrPutAway;
1606} UDFMACFDXINFO;
1607AssertCompileSize(UDFMACFDXINFO, 16);
1608
1609/**
1610 * UDF Mac finder info implementation use EA payload (@udf260{3.3.4.5.4.1,84}),
1611 * directory edition.
1612 *
1613 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_MAC_FINDER_INFO.
1614 */
1615typedef struct UDFIUEAMACFINDERINFODIR
1616{
1617 /** 0x00/0x30: Header checksum.
1618 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1619 uint16_t uChecksum;
1620 /** 0x02/0x32: Explicit alignment padding, MBZ. */
1621 uint16_t uPadding;
1622 /** 0x04/0x34: Parent directory ID. */
1623 uint32_t idParentDir;
1624 /** 0x08/0x38: Dir information. */
1625 UDFMACFDINFO DirInfo;
1626 /** 0x18/0x48: Dir extended information. */
1627 UDFMACFDXINFO DirExInfo;
1628} UDFIUEAMACFINDERINFODIR;
1629AssertCompileMemberOffset(UDFIUEAMACFINDERINFODIR, DirInfo, 0x08);
1630AssertCompileMemberOffset(UDFIUEAMACFINDERINFODIR, DirExInfo, 0x18);
1631AssertCompileSize(UDFIUEAMACFINDERINFODIR, 0x28);
1632/** Pointer to UDF Mac finder info for dir implementation use EA payload. */
1633typedef UDFIUEAMACFINDERINFODIR *PUDFIUEAMACFINDERINFODIR;
1634/** Pointer to const UDF Mac finder info for dir implementation use EA payload. */
1635typedef UDFIUEAMACFINDERINFODIR const *PCUDFIUEAMACFINDERINFODIR;
1636
1637/**
1638 * UDF finder file info for Mac EAs (@udf260{3.3.4.5.4.2,86}).
1639 */
1640typedef struct UDFMACFFINFO
1641{
1642 uint32_t FrType;
1643 uint32_t FrCreator;
1644 uint16_t FrFlags;
1645 UDFMACPOINT FrLocation;
1646 int16_t FrFldr;
1647} UDFMACFFINFO;
1648AssertCompileSize(UDFMACFFINFO, 16);
1649
1650/**
1651 * UDF finder file extended info for Mac EAs (@udf260{3.3.4.5.4.2,86}).
1652 */
1653typedef struct UDFMACFFXINFO
1654{
1655 int16_t FrIconID;
1656 uint8_t FdUnused[6];
1657 uint8_t FrScript;
1658 uint8_t FrXFlags;
1659 uint16_t FrComment;
1660 uint32_t FrPutAway;
1661} UDFMACFFXINFO;
1662AssertCompileSize(UDFMACFFXINFO, 16);
1663
1664/**
1665 * UDF Mac finder info implementation use EA payload (@udf260{3.3.4.5.4.1,84}),
1666 * file edition.
1667 *
1668 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_MAC_FINDER_INFO.
1669 */
1670typedef struct UDFIUEAMACFINDERINFOFILE
1671{
1672 /** 0x00/0x30: Header checksum.
1673 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1674 uint16_t uChecksum;
1675 /** 0x02/0x32: Explicit alignment padding, MBZ. */
1676 uint16_t uPadding;
1677 /** 0x04/0x34: Parent directory ID. */
1678 uint32_t idParentDir;
1679 /** 0x08/0x38: File information. */
1680 UDFMACFFINFO FileInfo;
1681 /** 0x18/0x48: File extended information. */
1682 UDFMACFFXINFO FileExInfo;
1683 /** 0x28/0x58: The size of the fork data (in bytes). */
1684 uint32_t cbForkData;
1685 /** 0x2c/0x5c: The size of the fork allocation (in bytes). */
1686 uint32_t cbForkAlloc;
1687} UDFIUEAMACFINDERINFOFILE;
1688AssertCompileMemberOffset(UDFIUEAMACFINDERINFOFILE, FileInfo, 0x08);
1689AssertCompileMemberOffset(UDFIUEAMACFINDERINFOFILE, FileExInfo, 0x18);
1690AssertCompileMemberOffset(UDFIUEAMACFINDERINFOFILE, cbForkData, 0x28);
1691AssertCompileSize(UDFIUEAMACFINDERINFOFILE, 0x30);
1692/** Pointer to UDF Mac finder info for file implementation use EA payload. */
1693typedef UDFIUEAMACFINDERINFOFILE *PUDFIUEAMACFINDERINFOFILE;
1694/** Pointer to const UDF Mac finder info for file implementation use EA payload. */
1695typedef UDFIUEAMACFINDERINFOFILE const *PCUDFIUEAMACFINDERINFOFILE;
1696
1697/**
1698 * UDF OS/400 directory info implementation use EA payload (@udf260{3.3.4.5.6.1,87})
1699 *
1700 * UDFEADATAIMPLUSE::idImplementation is UDF_ENTITY_ID_IUEA_OS400_DIR_INFO.
1701 */
1702typedef struct UDFIUEAOS400DIRINFO
1703{
1704 /** 0x00/0x30: Header checksum.
1705 * @note 16-bit checksum of UDFGEA up thru u.ImplUse.idImplementation. */
1706 uint16_t uChecksum;
1707 /** 0x02/0x32: Explicit alignment padding, MBZ. */
1708 uint16_t uPadding;
1709 /** 0x04/0x34: The directory info, format documented elsewhere. */
1710 uint8_t abDirInfo[44];
1711} UDFIUEAOS400DIRINFO;
1712AssertCompileSize(UDFIUEAOS400DIRINFO, 0x30);
1713/** Pointer to UDF Mac finder info for file implementation use EA payload. */
1714typedef UDFIUEAOS400DIRINFO *PUDFIUEAOS400DIRINFO;
1715/** Pointer to const UDF Mac finder info for file implementation use EA payload. */
1716typedef UDFIUEAOS400DIRINFO const *PCUDFIUEAOS400DIRINFO;
1717
1718
1719/**
1720 * UDF implementation use EA data (@ecma167{4,14.10.8,111}, @udf260{3.3.4.5,82}).
1721 */
1722typedef struct UDFEADATAIMPLUSE
1723{
1724 /** 0x00/0x0c: Length uData in bytes. */
1725 uint32_t cbData;
1726 /** 0x04/0x10: Implementation identifier (UDF_ENTITY_ID_IUEA_XXX). */
1727 UDFENTITYID idImplementation;
1728 /** 0x24/0x30: Implementation use field (variable length). */
1729 union
1730 {
1731 /** Generic byte view. */
1732 uint8_t abData[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1733 /** Free EA space (UDF_ENTITY_ID_IUEA_FREE_EA_SPACE). */
1734 UDFFREEEASPACE FreeEaSpace;
1735 /** DVD copyright management information (UDF_ENTITY_ID_IUEA_DVD_CGMS_INFO). */
1736 UDFIUEADVDCGMSINFO DvdCgmsInfo;
1737 /** OS/2 EA length (UDF_ENTITY_ID_IUEA_OS2_EA_LENGTH). */
1738 UDFIUEAOS2EALENGTH Os2EaLength;
1739 /** Mac volume info (UDF_ENTITY_ID_IUEA_MAC_VOLUME_INFO). */
1740 UDFIUEAMACVOLINFO MacVolInfo;
1741 /** Mac finder info, directory edition (UDF_ENTITY_ID_IUEA_MAC_FINDER_INFO). */
1742 UDFIUEAMACFINDERINFODIR MacFinderInfoDir;
1743 /** Mac finder info, file edition (UDF_ENTITY_ID_IUEA_MAC_FINDER_INFO). */
1744 UDFIUEAMACFINDERINFOFILE MacFinderInfoFile;
1745 /** OS/400 directory info (UDF_ENTITY_ID_IUEA_OS400_DIR_INFO). */
1746 UDFIUEAOS400DIRINFO Os400DirInfo;
1747 } u;
1748} UDFEADATAIMPLUSE;
1749/** Pointer to UDF implementation use EA data. */
1750typedef UDFEADATAIMPLUSE *PUDFEADATAIMPLUSE;
1751/** Pointer to const UDF implementation use EA data. */
1752typedef UDFEADATAIMPLUSE const *PCUDFEADATAIMPLUSE;
1753/** UDFGEA::uAttribType value for UDFEADATAIMPLUSE. */
1754#define UDFEADATAIMPLUSE_ATTRIB_TYPE UINT32_C(0x00000800)
1755/** UDFGEA::uAttribSubtype value for UDFEADATAIMPLUSE. */
1756#define UDFEADATAIMPLUSE_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1757
1758/**
1759 * UDF application use EA data (@ecma167{4,14.10.9,112}, @udf260{3.3.4.6,88}).
1760 */
1761typedef struct UDFEADATAAPPUSE
1762{
1763 /** 0x0c: Length uData in bytes. */
1764 uint32_t cbData;
1765 /** 0x10: Application identifier (UDF_ENTITY_ID_AUEA_FREE_EA_SPACE). */
1766 UDFENTITYID idApplication;
1767 /** 0x30: Application use field (variable length). */
1768 union
1769 {
1770 /** Generic byte view. */
1771 uint8_t ab[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1772 /** Free EA space (UDF_ENTITY_ID_AUEA_FREE_EA_SPACE). */
1773 UDFFREEEASPACE FreeEaSpace;
1774 } uData;
1775} UDFEADATAAPPUSE;
1776/** Pointer to UDF application use EA data. */
1777typedef UDFEADATAAPPUSE *PUDFEADATAAPPUSE;
1778/** Pointer to const UDF application use EA data. */
1779typedef UDFEADATAAPPUSE const *PCUDFEADATAAPPUSE;
1780/** UDFGEA::uAttribType value for UDFEADATAAPPUSE. */
1781#define UDFEADATAAPPUSE_ATTRIB_TYPE UINT32_C(0x00010000)
1782/** UDFGEA::uAttribSubtype value for UDFEADATAAPPUSE. */
1783#define UDFEADATAAPPUSE_ATTRIB_SUBTYPE UINT32_C(0x00000001)
1784
1785/**
1786 * UDF generic extended attribute (@ecma167{4,14.10.2,103}).
1787 */
1788typedef struct UDFGEA
1789{
1790 /** 0x00: Attribute type (UDFXXX_ATTRIB_TYPE). */
1791 uint32_t uAttribType;
1792 /** 0x04: Attribute subtype (UDFXXX_ATTRIB_SUBTYPE). */
1793 uint8_t uAttribSubtype;
1794 /** 0x05: Reserved padding bytes, MBZ. */
1795 uint8_t abReserved[3];
1796 /** 0x08: Size of the whole extended attribute.
1797 * Multiple of four is recommended. */
1798 uint32_t cbAttrib;
1799 /** 0x0c: Attribute data union. */
1800 union
1801 {
1802 /** Generic byte view (variable size). */
1803 uint8_t abData[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1804 /** Character set information (@ecma167{4,14.10.3,104}). */
1805 UDFEADATACHARSETINFO CharSetInfo;
1806 /** Alternate permissions (@ecma167{4,14.10.4,105}, @udf260{3.3.4.2,80}).
1807 * @note Not recorded according to the UDF specification. */
1808 UDFEADATAALTPERM AltPerm;
1809 /** File times (@ecma167{4,14.10.5,108}, @udf260{3.3.4.3,80}).
1810 * (This is a bit reminiscent of ISO9660RRIPTF.) */
1811 UDFEADATAFILETIMES FileTimes;
1812 /** Information times (@ecma167{4,14.10.6,109}). */
1813 UDFEADATAINFOTIMES InfoTimes;
1814 /** Device specification (@ecma167{4,14.10.7,110}, @udf260{3.3.4.4,81}). */
1815 UDFEADATADEVICESPEC DeviceSpec;
1816 /** Implementation use (@ecma167{4,14.10.8,111}, @udf260{3.3.4.5,82}). */
1817 UDFEADATAIMPLUSE ImplUse;
1818 /** Application use (@ecma167{4,14.10.9,112}, @udf260{3.3.4.6,88}). */
1819 UDFEADATAAPPUSE AppUse;
1820 } u;
1821} UDFGEA;
1822AssertCompileMemberOffset(UDFGEA, u, 0x0c);
1823/** Pointer to a UDF extended attribute. */
1824typedef UDFGEA *PUDFGEA;
1825/** Pointer to a const UDF extended attribute. */
1826typedef UDFGEA const *PCUDFGEA;
1827
1828
1829/**
1830 * UDF unallocated space entry (@ecma167{4,14.11,113}, @udf260{2.3.7,64}).
1831 *
1832 * @note Total length shall not exceed one logical block.
1833 */
1834typedef struct UDFUNALLOCATEDSPACEENTRY
1835{
1836 /** 0x00: The descriptor tag (UDF_TAG_ID_UNALLOCATED_SPACE_ENTRY). */
1837 UDFTAG Tag;
1838 /** 0x10: ICB Tag. */
1839 UDFICBTAG IcbTag;
1840 /** 0x24: Size of the allocation desciptors in bytes. */
1841 uint32_t cbAllocDescs;
1842 /** 0x28: Allocation desciptors, type given by IcbTag::fFlags. */
1843 union
1844 {
1845 UDFSHORTAD aShortADs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1846 UDFLONGAD aLongADs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1847 UDFEXTAD aExtADs[RT_FLEXIBLE_ARRAY_IN_NESTED_UNION];
1848 UDFEXTENTAD SingleAD;
1849 } u;
1850} UDFUNALLOCATEDSPACEENTRY;
1851AssertCompileMemberOffset(UDFUNALLOCATEDSPACEENTRY, u, 0x28);
1852/** Pointer to an UDF unallocated space entry. */
1853typedef UDFUNALLOCATEDSPACEENTRY *PUDFUNALLOCATEDSPACEENTRY;
1854/** Pointer to a const UDF unallocated space entry. */
1855typedef UDFUNALLOCATEDSPACEENTRY const *PCUDFUNALLOCATEDSPACEENTRY;
1856
1857
1858/**
1859 * UDF space bitmap descriptor (SBD) (@ecma167{4,14.12,114}, @udf260{2.3.8,65}).
1860 */
1861typedef struct UDFSPACEBITMAPDESC
1862{
1863 /** 0x00: The descriptor tag (UDF_TAG_ID_SPACE_BITMAP_DESC). */
1864 UDFTAG Tag;
1865 /** 0x10: Number of bits in the bitmap. */
1866 uint32_t cBits;
1867 /** 0x14: The bitmap size in bytes. */
1868 uint32_t cbBitmap;
1869 /** 0x18: The bitmap. */
1870 uint8_t abBitmap[RT_FLEXIBLE_ARRAY];
1871} UDFSPACEBITMAPDESC;
1872AssertCompileMemberOffset(UDFSPACEBITMAPDESC, abBitmap, 0x18);
1873/** Pointer to an UDF space bitmap descriptor. */
1874typedef UDFSPACEBITMAPDESC *PUDFSPACEBITMAPDESC;
1875/** Pointer to a const UDF space bitmap descriptor. */
1876typedef UDFSPACEBITMAPDESC const *PCUDFSPACEBITMAPDESC;
1877
1878
1879/**
1880 * UDF partition integrity descriptor (@ecma167{4,14.3,115}, @udf260{2.3.9,65}).
1881 *
1882 * @note Not needed by UDF.
1883 */
1884typedef struct UDFPARTITIONINTEGRITYDESC
1885{
1886 /** 0x000: The descriptor tag (UDF_TAG_ID_PARTITION_INTEGERITY_DESC). */
1887 UDFTAG Tag;
1888 /** 0x010: ICB Tag. */
1889 UDFICBTAG IcbTag;
1890 /** 0x024: Recording timestamp. */
1891 UDFTIMESTAMP RecordingTimestamp;
1892 /** 0x030: Interity type (UDF_PARTITION_INTEGRITY_TYPE_XXX). */
1893 uint8_t bType;
1894 /** 0x031: Reserved. */
1895 uint8_t abReserved[175];
1896 /** 0x0e0: Implementation identifier. */
1897 UDFENTITYID idImplementation;
1898 /** 0x100: Implementation use data. */
1899 uint8_t abImplementationUse[RT_FLEXIBLE_ARRAY];
1900} UDFPARTITIONINTEGRITYDESC;
1901AssertCompileMemberOffset(UDFPARTITIONINTEGRITYDESC, abImplementationUse, 0x100);
1902/** Pointer to an UDF partition integrity descriptor. */
1903typedef UDFPARTITIONINTEGRITYDESC *PUDFPARTITIONINTEGRITYDESC;
1904/** Pointer to a const UDF partition integrity descriptor. */
1905typedef UDFPARTITIONINTEGRITYDESC const *PCUDFPARTITIONINTEGRITYDESC;
1906
1907
1908/**
1909 * UDF extended file entry (EFE) (@ecma167{4,14.17,120}, @udf260{3.3.5,83}).
1910 *
1911 * @note Total length shall not exceed one logical block.
1912 */
1913typedef struct UDFEXFILEENTRY
1914{
1915 /** 0x00: The descriptor tag (UDF_TAG_ID_EXTENDED_FILE_ENTRY). */
1916 UDFTAG Tag;
1917 /** 0x10: ICB Tag. */
1918 UDFICBTAG IcbTag;
1919 /** 0x24: User ID (UNIX). */
1920 uint32_t uid;
1921 /** 0x28: Group ID (UNIX). */
1922 uint32_t gid;
1923 /** 0x2c: Permission (UDF_PERM_XXX). */
1924 uint32_t fPermissions;
1925 /** 0x30: Number hard links. */
1926 uint16_t cHardlinks;
1927 /** 0x32: Record format (UDF_REC_FMT_XXX). */
1928 uint8_t uRecordFormat;
1929 /** 0x33: Record format (UDF_REC_FMT_XXX). */
1930 uint8_t fRecordDisplayAttribs;
1931 /** 0x34: Record length (in bytes).
1932 * @note Must be zero according to the UDF specification. */
1933 uint32_t cbRecord;
1934 /** 0x38: Information length in bytes (file size). */
1935 uint64_t cbData;
1936 /** 0x40: The size of all streams. Same as cbData if no additional streams. */
1937 uint64_t cbObject;
1938 /** 0x48: Number of logical blocks allocated (for file data). */
1939 uint64_t cLogicalBlocks;
1940 /** 0x50: Time of last access (prior to recording the file entry). */
1941 UDFTIMESTAMP AccessTime;
1942 /** 0x5c: Time of last data modification. */
1943 UDFTIMESTAMP ModificationTime;
1944 /** 0x68: Birth (creation) time. */
1945 UDFTIMESTAMP BirthTime;
1946 /** 0x74: Time of last attribute/status modification. */
1947 UDFTIMESTAMP ChangeTime;
1948 /** 0x80: Checkpoint number (defaults to 1). */
1949 uint32_t uCheckpoint;
1950 /** 0x84: Reserved, MBZ. */
1951 uint32_t uReserved;
1952 /** 0x88: Extended attribute information control block location. */
1953 UDFLONGAD ExtAttribIcb;
1954 /** 0x98: Stream directory information control block location. */
1955 UDFLONGAD StreamDirIcb;
1956 /** 0xa8: Implementation identifier (UDF_ENTITY_ID_FE_IMPLEMENTATION). */
1957 UDFENTITYID idImplementation;
1958 /** 0xc8: Unique ID. */
1959 uint64_t INodeId;
1960 /** 0xd0: Length of extended attributes in bytes, multiple of four. */
1961 uint32_t cbExtAttribs;
1962 /** 0xd4: Length of allocation descriptors in bytes, multiple of four. */
1963 uint32_t cbAllocDescs;
1964 /** 0xd8: Two variable sized fields. First @a cbExtAttribs bytes of extended
1965 * attributes, then @a cbAllocDescs bytes of allocation descriptors. */
1966 uint8_t abExtAttribs[RT_FLEXIBLE_ARRAY];
1967} UDFEXFILEENTRY;
1968AssertCompileMemberOffset(UDFEXFILEENTRY, abExtAttribs, 0xd8);
1969/** Pointer to an UDF extended file entry. */
1970typedef UDFEXFILEENTRY *PUDFEXFILEENTRY;
1971/** Pointer to a const UDF extended file entry. */
1972typedef UDFEXFILEENTRY const *PCUDFEXFILEENTRY;
1973
1974
1975
1976/** @name UDF Volume Recognition Sequence (VRS)
1977 *
1978 * The recognition sequence usually follows the CD001 descriptor sequence at
1979 * sector 16 and is there to indicate that the medium (also) contains a UDF file
1980 * system and which standards are involved.
1981 *
1982 * See @ecma167{2,8,31}, @ecma167{2,9,32}, @udf260{2.1.7,25}.
1983 *
1984 * @{ */
1985
1986/** The type value used for all the extended UDF volume descriptors
1987 * (ISO9660VOLDESCHDR::bDescType). */
1988#define UDF_EXT_VOL_DESC_TYPE 0
1989/** The version value used for all the extended UDF volume descriptors
1990 * (ISO9660VOLDESCHDR::bDescVersion). */
1991#define UDF_EXT_VOL_DESC_VERSION 1
1992
1993/** Standard ID for UDFEXTVOLDESCBEGIN. */
1994#define UDF_EXT_VOL_DESC_STD_ID_BEGIN "BEA01"
1995/** Standard ID for UDFEXTVOLDESCTERM. */
1996#define UDF_EXT_VOL_DESC_STD_ID_TERM "TEA01"
1997/** Standard ID for UDFEXTVOLDESCNSR following ECMA-167 2nd edition. */
1998#define UDF_EXT_VOL_DESC_STD_ID_NSR_02 "NSR02"
1999/** Standard ID for UDFEXTVOLDESCNSR following ECMA-167 3rd edition. */
2000#define UDF_EXT_VOL_DESC_STD_ID_NSR_03 "NSR03"
2001/** Standard ID for UDFEXTVOLDESCBOOT. */
2002#define UDF_EXT_VOL_DESC_STD_ID_BOOT "BOOT2"
2003
2004
2005/**
2006 * Begin UDF extended volume descriptor area (@ecma167{2,9.2,33}).
2007 */
2008typedef struct UDFEXTVOLDESCBEGIN
2009{
2010 /** The volume descriptor header.
2011 * The standard identifier is UDF_EXT_VOL_DESC_STD_ID_BEGIN. */
2012 ISO9660VOLDESCHDR Hdr;
2013 /** Zero payload. */
2014 uint8_t abZero[2041];
2015} UDFEXTVOLDESCBEGIN;
2016AssertCompileSize(UDFEXTVOLDESCBEGIN, 2048);
2017/** Pointer to an UDF extended volume descriptor indicating the start of the
2018 * extended descriptor area. */
2019typedef UDFEXTVOLDESCBEGIN *PUDFEXTVOLDESCBEGIN;
2020/** Pointer to a const UDF extended volume descriptor indicating the start of
2021 * the extended descriptor area. */
2022typedef UDFEXTVOLDESCBEGIN const *PCUDFEXTVOLDESCBEGIN;
2023
2024
2025/**
2026 * Terminate UDF extended volume descriptor area (@ecma167{2,9.3,33}).
2027 */
2028typedef struct UDFEXTVOLDESCTERM
2029{
2030 /** The volume descriptor header.
2031 * The standard identifier is UDF_EXT_VOL_DESC_STD_ID_TERM. */
2032 ISO9660VOLDESCHDR Hdr;
2033 /** Zero payload. */
2034 uint8_t abZero[2041];
2035} UDFEXTVOLDESCTERM;
2036AssertCompileSize(UDFEXTVOLDESCTERM, 2048);
2037/** Pointer to an UDF extended volume descriptor indicating the end of the
2038 * extended descriptor area. */
2039typedef UDFEXTVOLDESCTERM *PUDFEXTVOLDESCTERM;
2040/** Pointer to a const UDF extended volume descriptor indicating the end of
2041 * the extended descriptor area. */
2042typedef UDFEXTVOLDESCTERM const *PCUDFEXTVOLDESCTERM;
2043
2044
2045/**
2046 * UDF NSR extended volume descriptor (@ecma167{3,9.1,50}).
2047 *
2048 * This gives the ECMA standard version.
2049 */
2050typedef struct UDFEXTVOLDESCNSR
2051{
2052 /** The volume descriptor header.
2053 * The standard identifier is UDF_EXT_VOL_DESC_STD_ID_NSR_02, or
2054 * UDF_EXT_VOL_DESC_STD_ID_NSR_03. */
2055 ISO9660VOLDESCHDR Hdr;
2056 /** Zero payload. */
2057 uint8_t abZero[2041];
2058} UDFEXTVOLDESCNSR;
2059AssertCompileSize(UDFEXTVOLDESCNSR, 2048);
2060/** Pointer to an extended volume descriptor giving the UDF standard version. */
2061typedef UDFEXTVOLDESCNSR *PUDFEXTVOLDESCNSR;
2062/** Pointer to a const extended volume descriptor giving the UDF standard version. */
2063typedef UDFEXTVOLDESCNSR const *PCUDFEXTVOLDESCNSR;
2064
2065
2066/**
2067 * UDF boot extended volume descriptor (@ecma167{2,9.4,34}).
2068 *
2069 * @note Probably entirely unused.
2070 */
2071typedef struct UDFEXTVOLDESCBOOT
2072{
2073 /** 0x00: The volume descriptor header.
2074 * The standard identifier is UDF_EXT_VOL_DESC_STD_ID_BOOT. */
2075 ISO9660VOLDESCHDR Hdr;
2076 /** 0x07: Reserved/alignment, MBZ. */
2077 uint8_t bReserved1;
2078 /** 0x08: The architecture type. */
2079 UDFENTITYID ArchType;
2080 /** 0x28: The boot identifier. */
2081 UDFENTITYID idBoot;
2082 /** 0x48: Logical sector number of load the boot loader from. */
2083 uint32_t offBootExtent;
2084 /** 0x4c: Number of bytes to load. */
2085 uint32_t cbBootExtent;
2086 /** 0x50: The load address (in memory). */
2087 uint64_t uLoadAddress;
2088 /** 0x58: The start address (in memory). */
2089 uint64_t uStartAddress;
2090 /** 0x60: The descriptor creation timestamp. */
2091 UDFTIMESTAMP CreationTimestamp;
2092 /** 0x6c: Flags. */
2093 uint16_t fFlags;
2094 /** 0x6e: Reserved, MBZ. */
2095 uint8_t abReserved2[32];
2096 /** 0x8e: Implementation use. */
2097 uint8_t abBootUse[1906];
2098} UDFEXTVOLDESCBOOT;
2099AssertCompileSize(UDFEXTVOLDESCBOOT, 2048);
2100/** Pointer to a boot extended volume descriptor. */
2101typedef UDFEXTVOLDESCBOOT *PUDFEXTVOLDESCBOOT;
2102/** Pointer to a const boot extended volume descriptor. */
2103typedef UDFEXTVOLDESCBOOT const *PCUDFEXTVOLDESCBOOT;
2104
2105/** @} */
2106
2107
2108/** @} */
2109
2110#endif
2111
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette