- Main Page
- Namespaces
- Classes
- Files
- Directories

- File List
- File Members

# udf.h

    00001 #pragma once
    00002
    00003 /*************************************************************************
    00004   vStrip by [maven] (maven@maven.de)
    00005 *************************************************************************/
    00006
    00007 typedef unsigned __int64 QWORD;
    00008 #define fio_SECTOR_SIZE 2048
    00009
    00010 typedef char dstring; // last BYTE of string indicates encoding/length
    00011
    00012 #define udf_LengthMask 0x3fffffff
    00013
    00014 #define udf_TAG_PrimaryVolumeDescriptor 0x0001
    00015 #define udf_TAG_AnchorVolumeDescriptor 0x0002
    00016 #define udf_TAG_PartitionDescriptor 0x0005
    00017 #define udf_TAG_LogicalVolumeDescriptor 0x0006
    00018 #define udf_TAG_TerminatingDescriptor 0x0008
    00019 #define udf_TAG_FileSetDescriptor 0x0100
    00020 #define udf_TAG_FileIdentifierDescriptor 0x0101
    00021 #define udf_TAG_IndirectEntry 0x0103
    00022 #define udf_TAG_TerminalEntry 0x0104
    00023 #define udf_TAG_FileEntry 0x0105
    00024
    00025 #define udf_FT_IndirectEntry 0x03
    00026 #define udf_FT_Directory 0x04
    00027 #define udf_FT_File 0x05
    00028 #define udf_FT_TerminalEntry 0x0b
    00029
    00030 #define udf_icbf_Mask 0x0007
    00031 #define udf_icbf_ShortAd 0x0000
    00032 #define udf_icbf_LongAd 0x0001
    00033 #define udf_icbf_ExtAd 0x0002
    00034 #define udf_icbf_Direct 0x0003
    00035 #define udf_icbf_Contiguous 0x0100
    00036
    00037 #define udf_FID_Directory 0x02
    00038 #define udf_FID_Parent 0x08
    00039
    00040 #pragma pack(push, 1)
    00041
    00042 typedef struct
    00043 {
    00044         DWORD   Length; // 00, high 2 bits: 0 ^= recorded & used, 1 ^= not recorded & used, 2 ^= not recorded & not used, 3 ^= linked list
    00045         DWORD   Location; // 04
    00046 } t_udf_short_ad, *tp_udf_short_ad; // 08
    00047
    00048 typedef struct
    00049 {
    00050         DWORD   Length; // 00
    00051         DWORD   Location; // 04
    00052 } t_udf_extent_ad, *tp_udf_extent_ad; // 08
    00053
    00054 typedef struct
    00055 {
    00056         DWORD   Location; // 00, relative to volume
    00057         WORD    PartitionNumber; // 04
    00058 } t_udf_lb_addr; // 06
    00059
    00060 typedef struct
    00061 {
    00062         DWORD                   Length; // 00, high 2 bits: 0 ^= recorded & used, 1 ^= not recorded & used, 2 ^= not recorded & not used, 3 ^= linked list
    00063         t_udf_lb_addr   Location; // 04
    00064         BYTE                    ImplementationUse[6]; // 10
    00065 } t_udf_long_ad, *tp_udf_long_ad; // 16
    00066
    00067 typedef struct
    00068 {
    00069         DWORD                   Length; // 00, high 2 bits: 0 ^= recorded & used, 1 ^= not recorded & used, 2 ^= not recorded & not used, 3 ^= linked list
    00070         DWORD                   RecordedLength; // 04
    00071         DWORD                   InformationLength; // 08
    00072         t_udf_lb_addr   Location; // 12
    00073         BYTE                    ImplementationUse[2]; // 18
    00074 } t_udf_ext_ad, *tp_udf_ext_ad; // 20
    00075
    00076 typedef struct
    00077 {
    00078         BYTE    CharacterSetType; // 00
    00079         BYTE    CharacterSetInfo[63]; // 01
    00080 } t_udf_charspec; // 64
    00081
    00082 typedef struct
    00083 { /* ECMA 167 1/7.3 */
    00084         WORD    TypeAndTimezone; // 00
    00085         WORD    Year; // 02
    00086         BYTE    Month; // 04
    00087         BYTE    Day; // 05
    00088         BYTE    Hour; // 06
    00089         BYTE    Minute; // 07
    00090         BYTE    Second; // 08
    00091         BYTE    Centiseconds; // 09
    00092         BYTE    HundredsofMicroseconds; // 10
    00093         BYTE    Microseconds; // 11
    00094 } t_udf_timestamp; // 12
    00095
    00096 typedef struct
    00097 { /* ISO 13346 3/7.2 */
    00098         WORD    TagIdentifier; // 00
    00099         WORD    DescriptorVersion; // 02
    00100         BYTE    TagChecksum; // 04
    00101         BYTE    Reserved; // 05
    00102         WORD    TagSerialNumber; // 06
    00103         WORD    DescriptorCRC; // 08
    00104         WORD    DescriptorCRCLength; // 10
    00105         DWORD   TagLocation; // 12
    00106 } t_udf_tag, *tp_udf_tag; // 16
    00107
    00108 typedef struct
    00109 { /* ISO 13346 1/7.4 */
    00110         BYTE    Flags; // 00
    00111         char    Identifier[23]; // 01
    00112         char    IdentifierSuffix[8]; // 24
    00113 } t_udf_EntityID; // 32
    00114
    00115 typedef struct
    00116 { /* ISO 13346 3/10.2 */
    00117         t_udf_tag               DescriptorTag; // 00
    00118         t_udf_extent_ad MainVolumeDescriptorSequenceExtent; // 16
    00119         t_udf_extent_ad ReserveVolumeDescriptorSequenceExtent; // 24
    00120         BYTE                    Reserved[480]; // 32
    00121 } t_udf_AnchorVolumeDescriptorPointer, *tp_udf_AnchorVolumeDescriptorPointer; // 512
    00122
    00123 typedef struct
    00124 { /* ISO 13346 3/10.6 */
    00125         t_udf_tag               DescriptorTag; // 00
    00126         DWORD                   VolumeDescriptorSequenceNumber; // 16
    00127         t_udf_charspec  DescriptorCharacterSet; // 20
    00128         dstring                 LogicalVolumeIdentifier[128]; // 84
    00129         DWORD                   LogicalBlockSize; // 212
    00130         t_udf_EntityID  DomainIdentifier; // 244
    00131 //      BYTE                    LogicalVolumeContentsUse[16]; // 276
    00132         t_udf_long_ad   FileSetDescriptorSequence; // 276
    00133         DWORD                   MapTableLength; // 292
    00134         DWORD                   NumberofPartitionMaps; // 296
    00135         t_udf_EntityID  ImplementationIdentifier; // 300
    00136         BYTE                    ImplementationUse[128]; // 332
    00137         t_udf_extent_ad IntegritySequenceExtent; // 460
    00138         BYTE                    PartitionMaps[1]; // 468
    00139 } t_udf_LogicalVolumeDescriptor, *tp_udf_LogicalVolumeDescriptor;
    00140
    00141 typedef struct
    00142 {
    00143         t_udf_short_ad  UnallocatedSpaceTable; // 00
    00144         t_udf_short_ad  UnallocatedSpaceBitmap; // 08
    00145         t_udf_short_ad  PartitionIntegrityTable; // 16
    00146         t_udf_short_ad  FreedSpaceTable; // 24
    00147         t_udf_short_ad  FreedSpaceBitmap; // 32
    00148         BYTE                    Reserved[88]; // 40
    00149 } t_udf_PartitionHeaderDescriptor; // 128
    00150
    00151 typedef struct
    00152 { /* ECMA 167 3/10.5  */
    00153         t_udf_tag               DescriptorTag; // 00
    00154         DWORD                   VolumeDescriptorSequenceNumber; // 16
    00155         WORD                    PartitionFlags; // 20
    00156         WORD                    PartitionNumber; // 22
    00157         t_udf_EntityID  PartitionContents; // 24
    00158         t_udf_PartitionHeaderDescriptor PartitionHeaderDescriptor; // 56
    00159         DWORD                   AccessType; // 184, 0 unspecified, 1 read only, 2 write once, 3 rewriteable, 4 overwriteable
    00160         DWORD                   PartitionStartingLocation; // 188
    00161         DWORD                   PartitionLength; // 192
    00162         t_udf_EntityID  ImplementationIdentifier; // 196
    00163         BYTE                    ImplementationUse[128]; // 228
    00164         BYTE                    Reserved[156]; // 356
    00165 } t_udf_PartitionDescriptor, *tp_udf_PartitionDescriptor; // 512
    00166
    00167 typedef struct
    00168 { /* ECMA 167 4/14.1 */
    00169         t_udf_tag               DescriptorTag; // 00
    00170         t_udf_timestamp RecordingDateandTime; // 16
    00171         WORD                    InterchangeLevel; // 28
    00172         WORD                    MaximumInterchangeLevel; // 30
    00173         DWORD                   CharacterSetList; // 32
    00174         DWORD                   MaximumCharacterSetList; // 36
    00175         DWORD                   FileSetNumber; // 40
    00176         DWORD                   FileSetDescriptorNumber; // 44
    00177         t_udf_charspec  LogicalVolumeIdentifierCharacterSet; // 48
    00178         dstring                 LogicalVolumeIdentifier[128]; // 112
    00179         t_udf_charspec  FileSetCharacterSet; // 240
    00180         dstring                 FileSetIdentifer[32]; // 304
    00181         dstring                 CopyrightFileIdentifier[32]; // 336
    00182         dstring                 AbstractFileIdentifier[32]; // 368
    00183         t_udf_long_ad   RootDirectoryICB; // 400
    00184         t_udf_EntityID  DomainIdentifier; // 416
    00185         t_udf_long_ad   NextExtent; // 448
    00186         t_udf_long_ad   StreamDirectoryICB; // 464
    00187         BYTE                    Reserved[32]; // 480
    00188 } t_udf_FileSetDescriptor, *tp_udf_FileSetDescriptor; // 512
    00189
    00190 typedef struct
    00191 { /* ECMA 167 4/14.6 */
    00192         DWORD                   PriorRecordedNumberofDirectEntries; // 00
    00193         WORD                    StrategyType; // 04
    00194         BYTE                    StrategyParameter[2]; // 06
    00195         WORD                    NumberofEntries; // 08
    00196         BYTE                    Reserved; // 10
    00197         BYTE                    FileType; // 11
    00198         t_udf_lb_addr   ParentICBLocation; // 12
    00199         WORD                    Flags; // 18
    00200 } t_udf_icbtag; // 20
    00201
    00202 typedef struct
    00203 { /* ECMA 167 4/14.9 */
    00204         t_udf_tag               DescriptorTag; // 00
    00205         t_udf_icbtag    ICBTag; // 16
    00206         DWORD                   Uid; // 36
    00207         DWORD                   Gid; // 40
    00208         DWORD                   Permissions; // 44
    00209         WORD                    FileLinkCount; // 48
    00210         BYTE                    RecordFormat; // 50
    00211         BYTE                    RecordDisplayAttributes; // 51
    00212         DWORD                   RecordLength; // 52
    00213         QWORD                   InformationLength; // 56
    00214         QWORD                   LogicalBlocksRecorded; // 64
    00215         t_udf_timestamp AccessTime; // 72
    00216         t_udf_timestamp ModificationTime; // 84
    00217         t_udf_timestamp AttributeTime; // 96
    00218         DWORD                   Checkpoint; // 108
    00219         t_udf_long_ad   ExtendedAttributeICB; // 112
    00220         t_udf_EntityID  ImplementationIdentifier; // 128
    00221         QWORD                   UniqueID; // 160
    00222         DWORD                   LengthofExtendedAttributes; // 168
    00223         DWORD                   LengthofAllocationDescriptors; // 172
    00224         BYTE                    ExtendedAttributes[]; // 176
    00225 //      BYTE                    AllocationDescriptors[]; // 176
    00226 } t_udf_FileEntry, *tp_udf_FileEntry; // >= 176
    00227
    00228 typedef struct
    00229 { /* ECMA 167 4/14.4 */
    00230         t_udf_tag               DescriptorTag; // 00
    00231         WORD                    FileVersionNumber; // 16
    00232         BYTE                    FileCharacteristics; // 18
    00233         BYTE                    LengthofFileIdentifier; // 19
    00234         t_udf_long_ad   ICB; // 20
    00235         WORD                    LengthofImplementationUse; // 36
    00236         BYTE                    ImplementationUse[]; // 38
    00237 //      char                    FileIdentifier[]; // 38
    00238 //      BYTE                    Padding[]; // 38
    00239 } t_udf_FileIdentifierDescriptor, *tp_udf_FileIdentifierDescriptor; // >= 38
    00240
    00241 #define udf_MAX_NAMELEN 256
    00242 #define udf_MAX_PATHLEN 2048
    00243
    00244 typedef struct
    00245 {
    00246         // public
    00247         char            name[udf_MAX_NAMELEN];
    00248         bool            is_dir, is_parent;
    00249         // internal
    00250         BYTE            *sector;
    00251         tp_udf_FileIdentifierDescriptor fid;
    00252         DWORD           partition_lba;
    00253         DWORD           dir_lba, dir_end_lba;
    00254         DWORD           sec_size;
    00255         int                     dir_left;
    00256 } t_udf_file, *tp_udf_file;
    00257
    00258 #pragma pack(pop)
    00259
    00260 tp_udf_file udf_find_file(const HANDLE hDrive, const WORD partition, const char *name);
    00261 tp_udf_file udf_get_root(const HANDLE hDrive, const WORD partition_number);
    00262 tp_udf_file udf_get_next(const HANDLE hDrive, tp_udf_file f); // advances f
    00263 tp_udf_file udf_get_sub(const HANDLE hDrive, tp_udf_file f); // creates new f
    00264 bool udf_get_lba(const HANDLE hDrive, const tp_udf_file f, DWORD *start_lba, DWORD *end_lba);
    00265 void udf_free(tp_udf_file f);