udf.h

00001 #pragma once
00002 
00003 /*************************************************************************
00004   vStrip by [maven] ([email protected])
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);

Generated on Tue Dec 13 14:47:06 2005 for guliverkli by  doxygen 1.4.5