/*** ISO13346.H - ISO 13346 File System Disk Format * * Microsoft Confidential * Copyright (c) 1996-2000 Microsoft Corporation * All Rights Reserved * * This file defines the ISO 13346 Data Structures. * * The UDF file system uses these data structures to interpret the * media's contents. * */ // // All 13346 structures are aligned on natural boundaries even though it will // not be obvious to the compiler. Disable compiler smarts for the duration // of the ISO definitions. // // As an example, the LONGAD definition is {ULONG {ULONG USHORT} UCHAR[6]} and // normal packing will pad out the internal NSRLBA, nevermind that the UCHAR // reserved field is doing exactly that. // #pragma pack(1) /*** ISO 13346 Part 1: General * * */ /*** charspec - Character Set Specification (1/7.2.1) * */ typedef struct CHARSPEC { UCHAR Type; // Character Set Type (CHARSPEC_T_...) UCHAR Info[63]; // Character Set Information } CHARSPEC, *PCHARSPEC; // CHARSPEC_T_... - Values for charspec_Type Character Set Types (1/7.2.1.1) #define CHARSPEC_T_CS0 0 // By Agreement #define CHARSPEC_T_CS1 1 // Unicode (according to ISO 2022) #define CHARSPEC_T_CS2 2 // 38 Glyphs #define CHARSPEC_T_CS3 3 // 65 Glyphs #define CHARSPEC_T_CS4 4 // 95 Glyphs #define CHARSPEC_T_CS5 5 // 191 Glyphs #define CHARSPEC_T_CS6 6 // Unicode or ISO 2022 #define CHARSPEC_T_CS7 7 // Unicode or ISO 2022 #define CHARSPEC_T_CS8 8 // 53 Glyphs /*** timestamp - Timestamp Structure (1/7.3) * */ typedef struct TIMESTAMP { SHORT Zone:12; // Time Zone (+-1440 minutes from CUT) USHORT Type:4; // Timestamp Type (TIMESTAMP_T_...) USHORT Year; // Year (1..9999) UCHAR Month; // Month (1..12) UCHAR Day; // Day (1..31) UCHAR Hour; // Hour (0..23) UCHAR Minute; // Minute (0..59) UCHAR Second; // Second (0..59) UCHAR CentiSecond; // Centiseconds (0..99) UCHAR Usec100; // Hundreds of microseconds (0..99) UCHAR Usec; // microseconds (0..99) } TIMESTAMP, *PTIMESTAMP; // TIMESTAMP_T_... - Values for timestamp_Type (1/7.3.1) #define TIMESTAMP_T_CUT 0 // Coordinated Universal Time #define TIMESTAMP_T_LOCAL 1 // Local Time #define TIMESTAMP_T_AGREEMENT 2 // Time format by agreement // TIMESTAMP_Z_... Values for timestamp_Zone #define TIMESTAMP_Z_MIN (-1440) // Minimum timezone offset (minutes) #define TIMESTAMP_Z_MAX ( 1440) // Maximum timezone offset (minutes) #define TIMESTAMP_Z_NONE (-2047) // No timezone in timestamp_Zone /**** regid - Entity Identifier (1/7.4) * */ typedef struct REGID { UCHAR Flags; // Flags (REGID_F_...) UCHAR Identifier[23]; // Identifier UCHAR Suffix[8]; // Identifier Suffix } REGID, *PREGID; // REGID_F_... - Definitions for regid_Flags bits #define REGID_F_DIRTY (0x01) // Information Modified #define REGID_F_PROTECTED (0x02) // Changes Locked Out // REGID_LENGTH_... - regid field lengths #define REGID_LENGTH_IDENT 23 // Length of regid_Identifier (bytes) #define REGID_LENGTH_SUFFIX 8 // Length of regid_Suffix (bytes) // REGID_ID_... - Values for regid_Identifier[0] #define REGID_ID_ISO13346 (0x2B) // regid_Identifier within ISO 13346 #define REGID_ID_NOTREGISTERED (0x2D) // regid_Identifier is not registered /*** Various Structures from Parts 3 and 4 moved here for compilation. * */ /*** extentad - Extent Address Descriptor (3/7.1) * */ typedef struct EXTENTAD { ULONG Len; // Extent Length in Bytes ULONG Lsn; // Extent Logical Sector Number } EXTENTAD, *PEXTENTAD; /*** nsr_lba - Logical Block Address (4/7.1) (lb_addr) * */ typedef struct NSRLBA { ULONG Lbn; // Logical Block Number USHORT Partition; // Partition Reference Number } NSRLBA, *PNSRLBA; /*** nsr_length - Format of a NSR allocation descriptor length field (4/14.14.1.1) * * */ typedef struct NSRLENGTH { ULONG Length:30; ULONG Type:2; } NSRLENGTH, *PNSRLENGTH; #define NSRLENGTH_TYPE_RECORDED 0 #define NSRLENGTH_TYPE_UNRECORDED 1 #define NSRLENGTH_TYPE_UNALLOCATED 2 #define NSRLENGTH_TYPE_CONTINUATION 3 /*** Short Allocation Descriptor (4/14.14.1) * * Note that a SHORTAD precisely overlaps a LONGAD. Use this by defining * a generic allocation descriptor structure. */ typedef struct SHORTAD { NSRLENGTH Length; // Extent Length ULONG Start; // Extent Logical Block Number } SHORTAD, *PSHORTAD; typedef SHORTAD AD_GENERIC, *PAD_GENERIC; /*** Long Allocation Descriptor (4/14.14.2) * */ typedef struct LONGAD { NSRLENGTH Length; // Extent Length NSRLBA Start; // Extent Location UCHAR ImpUse[6]; // Implementation Use } LONGAD, *PLONGAD; /*** Extended Allocation Descriptor (4/14.14.3) * */ typedef struct EXTAD { NSRLENGTH ExtentLen; // Extent Length NSRLENGTH RecordedLen; // Recorded Length ULONG InfoLen; // Information Length NSRLBA Start; // Extent Location UCHAR ImpUse[2]; // Implementation Use } EXTAD, *PEXTAD; /*** ISO 13346 Part 2: Volume and Boot Block Recognition * * */ /*** vsd_generic - Generic Volume Structure Descriptor (2/9.1) * */ typedef struct VSD_GENERIC { UCHAR Type; // Structure Type UCHAR Ident[5]; // Standard Identifier UCHAR Version; // Standard Version UCHAR Data[2041]; // Structure Data } VSD_GENERIC, *PVSD_GENERIC; // VSD_LENGTH_... - vsd field lengths #define VSD_LENGTH_IDENT 5 // Length of regid_Identifier (bytes) // VSD_IDENT_... - Values for vsd_generic_Ident #define VSD_IDENT_BEA01 "BEA01" // Begin Extended Area #define VSD_IDENT_TEA01 "TEA01" // Terminate Extended Area #define VSD_IDENT_CDROM "CDROM" // High Sierra Group (pre-ISO 9660) #define VSD_IDENT_CD001 "CD001" // ISO 9660 #define VSD_IDENT_CDW01 "CDW01" // ECMA 168 #define VSD_IDENT_CDW02 "CDW02" // ISO 13490 #define VSD_IDENT_NSR01 "NSR01" // ECMA 167 #define VSD_IDENT_NSR02 "NSR02" // ISO 13346 #define VSD_IDENT_BOOT2 "BOOT2" // Boot Descriptor #define VSD_IDENT_NSR03 "NSR03" // ECMA 167 3rd Edition typedef enum _VSD_IDENT { VsdIdentBad = 0, VsdIdentBEA01, VsdIdentTEA01, VsdIdentCDROM, VsdIdentCD001, VsdIdentCDW01, VsdIdentCDW02, VsdIdentNSR01, VsdIdentNSR02, VsdIdentBOOT2, VsdIdentNSR03 } VSD_IDENT, *PVSD_IDENT; /*** vsd_bea01 - Begin Extended Area Descriptor (2/9.2) * */ typedef struct VSD_BEA01 { UCHAR Type; // Structure Type UCHAR Ident[5]; // Standard Identifier ('BEA01') UCHAR Version; // Standard Version UCHAR Data[2041]; // Structure Data } VSD_BEA01, *PVSD_BEA01; /*** vsd_tea01 - Terminate Extended Area Descriptor (2/9.3) * */ typedef struct VSD_TEA01 { UCHAR Type; // Structure Type UCHAR Ident[5]; // Standard Identifier ('TEA01') UCHAR Version; // Standard Version UCHAR Data[2041]; // Structure Data } VSD_TEA01, *PVSD_TEA01; /*** vsd_boot2 - Boot Descriptor (2/9.4) * */ typedef struct VSD_BOOT2 { UCHAR Type; // Structure Type UCHAR Ident[5]; // Standard Identifier ('BOOT2') UCHAR Version; // Standard Version UCHAR Res8; // Reserved Zero REGID Architecture; // Architecture Type REGID BootIdent; // Boot Identifier ULONG BootExt; // Boot Extent Start ULONG BootExtLen; // Boot Extent Length ULONG LoadAddr[2]; // Load Address ULONG StartAddr[2]; // Start Address TIMESTAMP Timestamp; // Creation Time USHORT Flags; // Flags (VSD_BOOT2_F_...) UCHAR Res110[32]; // Reserved Zeros UCHAR BootUse[1906]; // Boot Use } VSD_BOOT2, *PVSD_BOOT2; // VSD_BOOT2_F_... - Definitions for vsd_boot2_Flags bits #define VSD_BOOT2_F_ERASE (0x0001) // Ignore previous similar BOOT2 vsds // // Aligning this byte offset to a sector boundary by rounding up will // yield the starting offset of the Volume Recognition Area (2/8.3) // #define VRA_BOUNDARY_LOCATION (32767 + 1) /*** ISO 13346 Part 3: Volume Structure * * */ /*** destag - Descriptor Tag (3/7.1 and 4/7.2) * * destag_Checksum = Byte sum of bytes 0-3 and 5-15 of destag. * * destag_CRC = CRC (X**16 + X**12 + X**5 + 1) * */ typedef struct DESTAG { USHORT Ident; // Tag Identifier USHORT Version; // Descriptor Version UCHAR Checksum; // Tag Checksum UCHAR Res5; // Reserved USHORT Serial; // Tag Serial Number USHORT CRC; // Descriptor CRC USHORT CRCLen; // Descriptor CRC Length ULONG Lbn; // Tag Location (Logical Block Number) } DESTAG, *PDESTAG; // DESTAG_ID_... - Values for destag_Ident // Descriptor Tag Values from NSR Part 3 (3/7.2.1) #define DESTAG_ID_NOTSPEC 0 // Format Not Specified #define DESTAG_ID_NSR_PVD 1 // (3/10.1) Primary Volume Descriptor #define DESTAG_ID_NSR_ANCHOR 2 // (3/10.2) Anchor Volume Desc Pointer #define DESTAG_ID_NSR_VDP 3 // (3/10.3) Volume Descriptor Pointer #define DESTAG_ID_NSR_IMPUSE 4 // (3/10.4) Implementation Use Vol Desc #define DESTAG_ID_NSR_PART 5 // (3/10.5) Partition Descriptor #define DESTAG_ID_NSR_LVOL 6 // (3/10.6) Logical Volume Descriptor #define DESTAG_ID_NSR_UASD 7 // (3/10.8) Unallocated Space Desc #define DESTAG_ID_NSR_TERM 8 // (3/10.9) Terminating Descriptor #define DESTAG_ID_NSR_LVINTEG 9 // (3/10.10) Logical Vol Integrity Desc #define DESTAG_ID_MINIMUM_PART3 1 // The lowest legal DESTAG in Part 3 #define DESTAG_ID_MAXIMUM_PART3 9 // The highest legal DESTAG in Part 3 // DESTAG_ID_... - Values for destag_Ident, continued... // Descriptor Tag Values from NSR Part 4 (4/7.2.1) #define DESTAG_ID_NSR_FSD 256 // (4/14.1) File Set Descriptor #define DESTAG_ID_NSR_FID 257 // (4/14.4) File Identifier Descriptor #define DESTAG_ID_NSR_ALLOC 258 // (4/14.5) Allocation Extent Desc #define DESTAG_ID_NSR_ICBIND 259 // (4/14.7) ICB Indirect Entry #define DESTAG_ID_NSR_ICBTRM 260 // (4/14.8) ICB Terminal Entry #define DESTAG_ID_NSR_FILE 261 // (4/14.9) File Entry #define DESTAG_ID_NSR_EA 262 // (4/14.10) Extended Attribute Header #define DESTAG_ID_NSR_UASE 263 // (4/14.11) Unallocated Space Entry #define DESTAG_ID_NSR_SBP 264 // (4/14.12) Space Bitmap Descriptor #define DESTAG_ID_NSR_PINTEG 265 // (4/14.13) Partition Integrity #define DESTAG_ID_NSR_EXT_FILE 266 // (4/14.17) Extended File Entry (ECMA167r3+) #define DESTAG_ID_MINIMUM_PART4 256 // The lowest legal DESTAG in Part 4 #define DESTAG_ID_MAXIMUM_PART4 265 // The highest legal DESTAG in Part 4 (NSR02) #define DESTAG_ID_MAXIMUM_PART4_NSR03 266 // The highest legal DESTAG in Part 4 (NSR03) // DESTAG_VER_... - Values for destag_Version (3/7.2.2) #define DESTAG_VER_NSR02 2 // Current Descriptor Tag Version #define DESTAG_VER_NSR03 3 // Current Descriptor Tag Version // DESTAG_SERIAL_... - Values for destag_Serial (3/7.2.5) #define DESTAG_SERIAL_NONE 0 // No Serial Number specified /*** Anchor Points (3/8.4.2.1) * */ #define ANCHOR_SECTOR 256 /*** vsd_nsr02 - NSR02/3 Volume Structure Descriptor (3/9.1) * */ typedef struct VSD_NSR02 { UCHAR Type; // Structure Type UCHAR Ident[5]; // Standard Identifier ('NSR02' or 'NSR03') UCHAR Version; // Standard Version UCHAR Res7; // Reserved 0 Byte UCHAR Data[2040]; // Structure Data } VSD_NSR02, *PVSD_NSR02; // Values for vsd_nsr02_Type #define VSD_NSR02_TYPE_0 0 // Reserved 0 // Values for vsd_nsr02_Version #define VSD_NSR02_VER 1 // Standard Version 1 /*** nsr_vd_generic - Generic Volume Descriptor of 512 bytes * */ typedef struct NSR_VD_GENERIC { DESTAG Destag; // Descriptor Tag ULONG Sequence; // Volume Descriptor Sequence Number UCHAR Data20[492]; // Descriptor Data } NSR_VD_GENERIC, *PNSR_VD_GENERIC; /*** nsr_pvd - NSR Primary Volume Descriptor (3/10.1) * * nsr_pvd_destag.destag_Ident = DESTAG_ID_NSR_PVD * */ typedef struct NSR_PVD { DESTAG Destag; // Descriptor Tag (NSR_PVD) ULONG VolDescSeqNum; // Volume Descriptor Sequence Number ULONG Number; // Primary Volume Descriptor Number UCHAR VolumeID[32]; // Volume Identifier USHORT VolSetSeq; // Volume Set Sequence Number USHORT VolSetSeqMax; // Maximum Volume Set Sequence Number USHORT Level; // Interchange Level USHORT LevelMax; // Maximum Interchange Level ULONG CharSetList; // Character Set List (See 1/7.2.11) ULONG CharSetListMax; // Maximum Character Set List UCHAR VolSetID[128]; // Volume Set Identifier CHARSPEC CharsetDesc; // Descriptor Character Set CHARSPEC CharsetExplan; // Explanatory Character Set EXTENTAD Abstract; // Volume Abstract Location EXTENTAD Copyright; // Volume Copyright Notice Location REGID Application; // Application Identifier TIMESTAMP RecordTime; // Recording Time REGID ImpUseID; // Implementation Identifier UCHAR ImpUse[64]; // Implementation Use ULONG Predecessor; // Predecessor Vol Desc Seq Location USHORT Flags; // Flags UCHAR Res490[22]; // Reserved Zeros } NSR_PVD, *PNSR_PVD; // NSRPVD_F_... - Definitions for nsr_pvd_Flags #define NSRPVD_F_COMMON_VOLID (0x0001)// Volume ID is common across Vol Set /*** nsr_anchor - Anchor Volume Descriptor Pointer (3/10.2) * * nsr_anchor_destag.destag_Ident = DESTAG_ID_NSR_ANCHOR * */ typedef struct NSR_ANCHOR { DESTAG Destag; // Descriptor Tag (NSR_ANCHOR) EXTENTAD Main; // Main Vol Desc Sequence Location EXTENTAD Reserve; // Reserve Vol Desc Sequence Location UCHAR Res32[480]; // Reserved Zeros } NSR_ANCHOR, *PNSR_ANCHOR; /*** nsr_vdp - Volume Descriptor Pointer (3/10.3) * * nsr_vdp_destag.destag_Ident = DESTAG_ID_NSR_VDP * */ typedef struct NSR_VDP { DESTAG Destag; // Descriptor Tag (NSR_VDP) ULONG VolDescSeqNum; // Vol Desc Sequence Number EXTENTAD Next; // Next Vol Desc Sequence Location UCHAR Res28[484]; // Reserved Zeros } NSR_VDP, *PNSR_VDP; /*** nsr_impuse - Implementation Use Volume Descriptor (3/10.4) * * nsr_impuse_destag.destag_Ident = DESTAG_ID_NSR_IMPUSE * */ typedef struct NSR_IMPUSE { DESTAG Destag; // Descriptor Tag (NSR_IMPUSE) ULONG VolDescSeqNum; // Vol Desc Sequence Number REGID ImpUseID; // Implementation Identifier UCHAR ImpUse[460]; // Implementation Use } NSR_IMPUSE, *PNSR_IMPUSE; /*** nsr_part - Partition Descriptor (3/10.5) * * nsr_part_destag.destag_Ident = DESTAG_ID_NSR_PART * */ typedef struct NSR_PART { DESTAG Destag; // Descriptor Tag (NSR_PART) ULONG VolDescSeqNum; // Vol Desc Sequence Number USHORT Flags; // Partition Flags (NSR_PART_F_...) USHORT Number; // Partition Number REGID ContentsID; // Partition Contents ID UCHAR ContentsUse[128]; // Partition Contents Use ULONG AccessType; // Access Type ULONG Start; // Partition Starting Location ULONG Length; // Partition Length (sector count) REGID ImpUseID; // Implementation Identifier UCHAR ImpUse[128]; // Implementation Use UCHAR Res356[156]; // Reserved Zeros } NSR_PART, *PNSR_PART; // NSR_PART_F_... - Definitions for nsr_part_Flags #define NSR_PART_F_ALLOCATION (0x0001) // Volume Space Allocated // Values for nsr_part_ContentsID.regid_Identifier #define NSR_PART_CONTID_FDC01 "+FDC01" // ISO 9293-1987 #define NSR_PART_CONTID_CD001 "+CD001" // ISO 9660 #define NSR_PART_CONTID_CDW01 "+CDW01" // ECMA 168 #define NSR_PART_CONTID_CDW02 "+CDW02" // ISO 13490 #define NSR_PART_CONTID_NSR01 "+NSR01" // ECMA 167 #define NSR_PART_CONTID_NSR02 "+NSR02" // ISO 13346 #define NSR_PART_CONTID_NSR03 "+NSR03" // ECMA 167 r3 typedef enum NSR_PART_CONTID { NsrPartContIdBad = 0, NsrPartContIdFDC01, NsrPartContIdCD001, NsrPartContIdCDW01, NsrPartContIdCDW02, NsrPartContIdNSR01, NsrPartContIdNSR02, NsrPartContIdNSR03 } NSR_PART_CONTID, *PNSR_PART_CONTID; // Values for nsr_part_AccessType #define NSR_PART_ACCESS_NOSPEC 0 // Partition Access Unspecified #define NSR_PART_ACCESS_RO 1 // Read Only Access #define NSR_PART_ACCESS_WO 2 // Write-Once Access #define NSR_PART_ACCESS_RW_PRE 3 // Read/Write with preparation #define NSR_PART_ACCESS_RW_OVER 4 // Read/Write, fully overwritable /*** nsr_lvol - Logical Volume Descriptor (3/10.6) * * nsr_lvol_destag.destag_Ident = DESTAG_ID_NSR_LVOL * * The Logical Volume Contents Use field is specified here as a * File Set Descriptor Sequence (FSD) address. See (4/3.1). * */ typedef struct NSR_LVOL { DESTAG Destag; // Descriptor Tag (NSR_LVOL) ULONG VolDescSeqNum; // Vol Desc Sequence Number CHARSPEC Charset; // Descriptor Character Set UCHAR VolumeID[128]; // Logical Volume ID ULONG BlockSize; // Logical Block Size (in bytes) REGID DomainID; // Domain Identifier LONGAD FSD; // Logical Volume Contents Use ULONG MapTableLength; // Map Table Length (bytes) ULONG MapTableCount; // Map Table Partition Maps Count REGID ImpUseID; // Implementaion Identifier UCHAR ImpUse[128]; // Implementation Use EXTENTAD Integrity; // Integrity Sequence Extent UCHAR MapTable[0]; // Partition Map Table (variant!) // The true length of this structure may vary! } NSR_LVOL, *PNSR_LVOL; #define ISONsrLvolConstantSize (FIELD_OFFSET( NSR_LVOL, MapTable )) #define ISONsrLvolSize( L ) (QuadAlign( ISONsrLvolConstantSize + (L)->MapTableLength )) /*** partmap_generic - Generic Partition Map (3/10.7.1) * */ typedef struct PARTMAP_GENERIC { UCHAR Type; // Partition Map Type UCHAR Length; // Partition Map Length UCHAR Map[0]; // Partion Mapping (variant!) // The true length of this structure may vary! } PARTMAP_GENERIC, *PPARTMAP_GENERIC; // Values for partmap_g_Type #define PARTMAP_TYPE_NOTSPEC 0 // Partition Map Format Not Specified #define PARTMAP_TYPE_PHYSICAL 1 // Partition Map in Volume Set (Type 1) #define PARTMAP_TYPE_PROXY 2 // Partition Map by identifier (Type 2) /*** partmap_physical - Normal (Type 1) Partition Map (3/10.7.2) * * A Normal Partion Map specifies a partition number on a volume * within the same volume set. * */ typedef struct PARTMAP_PHYSICAL { UCHAR Type; // Partition Map Type = 1 UCHAR Length; // Partition Map Length = 6 USHORT VolSetSeq; // Partition Volume Set Sequence Number USHORT Partition; // Partition Number } PARTMAP_PHYSICAL, *PPARTMAP_PHYSICAL; /*** partmap_proxy - Proxy (Type 2) Partition Map (3/10.7.3) * * A Proxy Partition Map is commonly not interchangeable. * */ typedef struct PARTMAP_PROXY { UCHAR Type; // Partition Map Type = 2 UCHAR Length; // Partition Map Length = 64 UCHAR PartID[62]; // Partition Identifier (Proxy) } PARTMAP_PROXY, *PPARTMAP_PROXY; /*** nsr_uasd - Unallocated Space Descriptor (3/10.8) * * nsr_uasd_destag.destag_Ident = DESTAG_ID_NSR_UASD * * The true length of nsr_uasd_Extents is (nsr_uasd_ExtentCount * 8), and * the last logical sector of nsr_uasd_Extents is zero padded. * */ typedef struct NSR_UASD { DESTAG Destag; // Descriptor Tag (NSR_UASD) ULONG VolDescSeqNum; // Vol Desc Sequence Number ULONG ExtentCount; // Number of Allocation Descriptors EXTENTAD Extents[0]; // Allocation Descriptors (variant!) // The true length of this structure may vary! // The true length of nsr_uasd_Extents is (nsr_uasd_ExtentCount * 8) bytes. // The last logical sector of nsr_uasd_Extents is zero padded. } NSR_UASD, *PNSR_UASD; /*** nsr_term - Terminating Descriptor (3/10.9 and 4/14.2) * * nsr_term_destag.destag_Ident = DESTAG_ID_NSR_TERM * */ typedef struct NSR_TERM { DESTAG Destag; // Descriptor Tag (NSR_TERM) UCHAR Res16[496]; // Reserved Zeros } NSR_TERM, *PNSR_TERM; /*** nsr_lvhd - Logical Volume Header Descriptor (4/14.15) * * This descriptor is found in the Logical Volume Content Use * field of a Logical Volume Integrity Descriptor. * * This definition is moved to here to avoid forward reference. */ typedef struct NSR_LVHD { ULONG UniqueID[2]; // Unique ID UCHAR Res8[24]; // Reserved Zeros } NSR_LVHD, *PNSR_LVHD; /*** nsr_integ - Logical Volume Integrity Descriptor (3/10.10) * * nsr_integ_destag.destag_Ident = DESTAG_ID_NSR_LVINTEG * * WARNING: WARNING: WARNING: nsr_integ is a multi-variant structure! * * The starting address of nsr_integ_Size is not acurrate. * Compensate for this nsr_integ_Size problem by adding the value of * (nsr_integ_PartitionCount-1) to the ULONG ARRAY INDEX. * * The starting address of nsr_integ_ImpUse[0] is not accurate. * Compensate for this nsr_integ_ImpUse problem by adding the value of * ((nsr_integ_PartitionCount-1)<<3) to the UCHAR ARRAY INDEX. * * This descriptor is padded with zero bytes to the end of the last * logical sector it occupies. * * The Logical Volume Contents Use field is specified here as a * Logical Volume Header Descriptor. See (4/3.1) second last point. */ typedef struct NSR_INTEG { DESTAG Destag; // Descriptor Tag (NSR_LVINTEG) TIMESTAMP Time; // Recording Date ULONG Type; // Integrity Type (INTEG_T_...) EXTENTAD Next; // Next Integrity Extent NSR_LVHD LVHD; // Logical Volume Contents Use ULONG PartitionCount; // Number of Partitions ULONG ImpUseLength; // Length of Implementation Use ULONG Free[1]; // Free Space Table // nsr_integ_Free has a variant length = (4*nsr_integ_PartitionCount) ULONG Size[1]; // Size Table // nsr_integ_Size has a variant starting offset due to nsr_integ_Free // nsr_integ_Size has a variant length = (4*nsr_integ_PartitionCount) UCHAR ImpUse[0]; // Implementation Use // nsr_integ_ImpUse has a variant starting offset due to nsr_integ_Free and // nsr_integ_Size. // nsr_integ_ImpUse has a variant length = (nsr_integ_ImpUseLength) } NSR_INTEG, *PNSR_INTEG; // Values for nsr_integ_Type #define NSR_INTEG_T_OPEN 0 // Open Integrity Descriptor #define NSR_INTEG_T_CLOSE 1 // Close Integrity Descriptor /*** ISO 13346 Part 4: File Structure * * See DESTAG structure in Part 3 for definitions found in (4/7.2). * */ /*** nsr_fsd - File Set Descriptor (4/14.1) * * nsr_fsd_destag.destag_Ident = DESTAG_ID_NSR_FSD */ typedef struct NSR_FSD { DESTAG Destag; // Descriptor Tag (NSR_LVOL) TIMESTAMP Time; // Recording Time USHORT Level; // Interchange Level USHORT LevelMax; // Maximum Interchange Level ULONG CharSetList; // Character Set List (See 1/7.2.11) ULONG CharSetListMax; // Maximum Character Set List ULONG FileSet; // File Set Number ULONG FileSetDesc; // File Set Descriptor Number CHARSPEC CharspecVolID; // Volume ID Character Set UCHAR VolID[128]; // Volume ID CHARSPEC CharspecFileSet; // File Set Character Set UCHAR FileSetID[32]; // File Set ID UCHAR Copyright[32]; // Copyright File Name UCHAR Abstract[32]; // Abstract File Name LONGAD IcbRoot; // Root Directory ICB Address REGID DomainID; // Domain Identifier LONGAD NextExtent; // Next FSD Extent LONGAD StreamDirectoryICB; // >= UDF 2.00 only. System stream dir. // These bytes must be zero on discs // comforming to earlier revisions. UCHAR Res464[32]; // Reserved Zeros } NSR_FSD, *PNSR_FSD; /*** nsr_part_h - Partition Header Descriptor (4/14.3) * * No Descriptor Tag. * * This descriptor is found in the nsr_part_ContentsUse field of * an NSR02 Partition Descriptor. See NSR_PART_CONTID_NSR02. * */ typedef struct NSR_PART_H { SHORTAD UASTable; // Unallocated Space Table SHORTAD UASBitmap; // Unallocated Space Bitmap SHORTAD IntegTable; // Integrity Table SHORTAD FreedTable; // Freed Space Table SHORTAD FreedBitmap; // Freed Space Bitmap UCHAR Res40[88]; // Reserved Zeros } NSR_PART_H, *PNSR_PART_H; /*** nsr_fid - File Identifier Descriptor (4/14.4) * * nsr_fid_destag.destag_Ident = DESTAG_ID_NSR_FID * * WARNING: WARNING: WARNING: nsr_fid is a multi-variant structure! * * The starting address of nsr_fid_FileID is not acurrate. * Compensate for this nsr_fid_FileID problem by adding the value of * (nsr_fid_ImpUseLen-1) to the UCHAR ARRAY INDEX. * * The starting address of nsr_fid_Padding is not acurrate. * Compensate for this nsr_fid_Padding problem by adding the value of * (nsr_fid_ImpUseLen+nsr_fid_FileIDLen-2) to the UCHAR ARRAY INDEX. * * The true total size of nsr_fid_s is * ((38 + nsr_fid_FileIDLen + nsr_fid_ImpUseLen) + 3) & ~3) * */ typedef struct NSR_FID { DESTAG Destag; // Descriptor Tag (NSR_FID) USHORT Version; // File Version Number UCHAR Flags; // File Flags (NSR_FID_F_...) UCHAR FileIDLen; // File ID Length LONGAD Icb; // ICB (long) Address USHORT ImpUseLen; // Implementation Use Length UCHAR ImpUse[1]; // Implementation Use Area // nsr_fid_ImpUse has a variant length = nsr_fid_ImpUseLen UCHAR FileID[1]; // File Identifier // nsr_fid_FileID has a variant starting offset due to nsr_fid_ImpUse // nsr_fid_FileID has a variant length = nsr_fid_FileIDLen UCHAR Padding[1]; // Padding // nsr_fid_Paddinghas a variant starting offset due to nsr_fid_ImpUse and // nsr_fid_FileID // nsr_fid_Padding has a variant length. Round up to the next ULONG boundary. } NSR_FID, *PNSR_FID; #define ISONsrFidConstantSize (ULONG)(FIELD_OFFSET( NSR_FID, ImpUse )) #define ISONsrFidSize( F ) (LongAlign( ISONsrFidConstantSize + (F)->FileIDLen + (F)->ImpUseLen )) // NSR_FID_F_... - Definitions for nsr_fid_Flags (Characteristics, 4/14.4.3) #define NSR_FID_F_HIDDEN (0x01) // Hidden Bit #define NSR_FID_F_DIRECTORY (0x02) // Directory Bit #define NSR_FID_F_DELETED (0x04) // Deleted Bit #define NSR_FID_F_PARENT (0x08) // Parent Directory Bit #define NSR_FID_F_META (0x10) // (ECMAr3) Indicates impl. use // metadata stream. #define NSR_FID_OFFSET_FILEID 38 // Field Offset of nsr_fid_FileID[]; /*** nsr_alloc - Allocation Extent Descriptor (4/14.5) * * nsr_alloc_destag.destag_Ident = DESTAG_ID_NSR_ALLOC * * This descriptor is immediately followed by AllocLen bytes * of allocation descriptors, which is not part of this * descriptor (so CRC calculation doesn't include it). * */ typedef struct NSR_ALLOC { DESTAG Destag; // Descriptor Tag (NSR_ALLOC) ULONG Prev; // Previous Allocation Descriptor ULONG AllocLen; // Length of Allocation Descriptors } NSR_ALLOC, *PNSR_ALLOC; /*** icbtag - Information Control Block Tag (4/14.6) * * An ICBTAG is commonly preceeded by a Descriptor Tag (DESTAG). * */ typedef struct ICBTAG { ULONG PriorDirectCount;// Prior Direct Entry Count USHORT StratType; // Strategy Type (ICBTAG_STRAT_...) USHORT StratParm; // Strategy Parameter (2 bytes) USHORT MaxEntries; // Maximum Number of Entries in ICB UCHAR Res10; // Reserved Zero UCHAR FileType; // File Type (ICBTAG_FILE_T_...) NSRLBA IcbParent; // Parent ICB Location USHORT Flags; // ICB Flags (ICBTAG_F_...) } ICBTAG, *PICBTAG; // ICBTAG_STRAT_T_... - ICB Strategy Types #define ICBTAG_STRAT_NOTSPEC 0 // ICB Strategy Not Specified #define ICBTAG_STRAT_TREE 1 // Strategy 1 (4/A.2) (Plain Tree) #define ICBTAG_STRAT_MASTER 2 // Strategy 2 (4/A.3) (Master ICB) #define ICBTAG_STRAT_BAL_TREE 3 // Strategy 3 (4/A.4) (Balanced Tree) #define ICBTAG_STRAT_DIRECT 4 // Strategy 4 (4/A.5) (One Direct) // ICBTAG_FILE_T_... - Values for icbtag_FileType #define ICBTAG_FILE_T_NOTSPEC 0 // Not Specified #define ICBTAG_FILE_T_UASE 1 // Unallocated Space Entry #define ICBTAG_FILE_T_PINTEG 2 // Partition Integrity Entry #define ICBTAG_FILE_T_INDIRECT 3 // Indirect Entry #define ICBTAG_FILE_T_DIRECTORY 4 // Directory #define ICBTAG_FILE_T_FILE 5 // Ordinary File #define ICBTAG_FILE_T_BLOCK_DEV 6 // Block Special Device #define ICBTAG_FILE_T_CHAR_DEV 7 // Character Special Device #define ICBTAG_FILE_T_XA 8 // Extended Attributes #define ICBTAG_FILE_T_FIFO 9 // FIFO file #define ICBTAG_FILE_T_C_ISSOCK 10 // Socket #define ICBTAG_FILE_T_TERMINAL 11 // Terminal Entry #define ICBTAG_FILE_T_PATHLINK 12 // Symbolic Link with a pathname // ICBTAG_F_... - Values for icbtag_Flags #define ICBTAG_F_ALLOC_MASK (0x0007)// Mask for Allocation Descriptor Info #define ICBTAG_F_ALLOC_SHORT 0 // Short Allocation Descriptors Used #define ICBTAG_F_ALLOC_LONG 1 // Long Allocation Descriptors Used #define ICBTAG_F_ALLOC_EXTENDED 2 // Extended Allocation Descriptors Used #define ICBTAG_F_ALLOC_IMMEDIATE 3 // File Data Recorded Immediately #define ISOAllocationDescriptorSize(T) ( (T) == ICBTAG_F_ALLOC_SHORT ? sizeof(SHORTAD) : \ (T) == ICBTAG_F_ALLOC_LONG ? sizeof(LONGAD) : \ sizeof(EXTAD) ) #define ICBTAG_F_SORTED (0x0008)// Directory is Sorted (4/8.6.1) #define ICBTAG_F_NO_RELOCATE (0x0010)// Data is not relocateable #define ICBTAG_F_ARCHIVE (0x0020)// Archive Bit #define ICBTAG_F_SETUID (0x0040)// S_ISUID Bit #define ICBTAG_F_SETGID (0x0080)// S_ISGID Bit #define ICBTAG_F_STICKY (0x0100)// C_ISVTX Bit #define ICBTAG_F_CONTIGUOUS (0x0200)// File Data is Contiguous #define ICBTAG_F_SYSTEM (0x0400)// System Bit #define ICBTAG_F_TRANSFORMED (0x0800)// Data Transformed #define ICBTAG_F_MULTIVERSIONS (0x1000)// Multi-version Files in Directory /*** icbind - Indirect ICB Entry (4/14.7) * */ typedef struct ICBIND { DESTAG Destag; // Descriptor Tag (ID_NSR_ICBIND) ICBTAG Icbtag; // ICB Tag (ICBTAG_FILE_T_INDIRECT) LONGAD Icb; // ICB Address } ICBIND, *PICBIND; /*** icbtrm - Terminal ICB Entry (4/14.8) * */ typedef struct ICBTRM { DESTAG Destag; // Descriptor Tag (ID_NSR_ICBTRM) ICBTAG Icbtag; // ICB Tag (ICBTAG_FILE_T_TERMINAL) } ICBTRM, *PICBTRM; /*** icbfile - File ICB Entry (4/14.9) * * WARNING: WARNING: WARNING: icbfile is a multi-variant structure! * * The starting address of icbfile_Allocs is not acurrate. * Compensate for this icbfile_Allocs problem by adding the value of * (icbfile_XALength-1) to the UCHAR ARRAY INDEX. * * icbfile_XALength is a multiple of 4. * */ typedef struct ICBFILE { DESTAG Destag; // Descriptor Tag (ID_NSR_FILE) ICBTAG Icbtag; // ICB Tag (ICBTAG_FILE_T_FILE) ULONG UID; // User ID of file's owner ULONG GID; // Group ID of file's owner ULONG Permissions; // File Permissions USHORT LinkCount; // File hard-link count UCHAR RecordFormat; // Record Format UCHAR RecordDisplay; // Record Display Attributes ULONG RecordLength; // Record Length ULONGLONG InfoLength; // Information Length (file size) ULONGLONG BlocksRecorded; // Logical Blocks Recorded TIMESTAMP AccessTime; // Last-Accessed Time TIMESTAMP ModifyTime; // Last-Modification Time TIMESTAMP AttributeTime; // Last-Attribute-Change Time ULONG Checkpoint; // File Checkpoint LONGAD IcbEA; // Extended Attribute ICB REGID ImpUseID; // Implementation Use Identifier ULONGLONG UniqueID; // Unique ID ULONG EALength; // Length of Extended Attributes ULONG AllocLength; // Length of Allocation Descriptors UCHAR EAs[1]; // Extended Attributes // icbfile_EAs has a variant length = icbfile_EALength UCHAR Allocs[0]; // Allocation Descriptors. // icbfile_Allocs has a variant starting offset due to icbfile_EAs. // icbfile_Allocs has a variant length = icbfile_AllocLen. } ICBFILE, *PICBFILE; /*** icbextfile - Extended File ICB Entry (4/14.17 ECMA167r3 and later) * * WARNING: WARNING: WARNING: icbextfile is a multi-variant structure! * * The starting address of icbfile_Allocs is not acurrate. * Compensate for this icbfile_Allocs problem by adding the value of * (icbfile_XALength-1) to the UCHAR ARRAY INDEX. * * icbfile_XALength is a multiple of 4. * */ typedef struct ICBEXTFILE { DESTAG Destag; // Descriptor Tag (DESTAG_ID_NSR_EXT_FILE) ICBTAG Icbtag; // ICB Tag (ICBTAG_FILE_T_FILE) ULONG UID; // User ID of file's owner ULONG GID; // Group ID of file's owner ULONG Permissions; // File Permissions USHORT LinkCount; // File hard-link count UCHAR RecordFormat; // Record Format UCHAR RecordDisplay; // Record Display Attributes ULONG RecordLength; // Record Length ULONGLONG InfoLength; // Information Length (file size) ULONGLONG ObjectSize; // Object Size (Sum of InfoLengths for all streams) // THE ABOVE FIELD IS NEW IN THE EXT FE vs BASIC // FE. FIELDS AFTER THIS POINT ARE DISPLACED AND SHOULD // BE ACCESSED USING THE MACROS BELOW WHEN // MANIPULATING RAW, MAPPED, FEs ULONGLONG BlocksRecorded; // Logical Blocks Recorded TIMESTAMP AccessTime; // Last-Accessed Time TIMESTAMP ModifyTime; // Last-Modification Time TIMESTAMP CreationTime; // Creation Time TIMESTAMP AttributeTime; // Last-Attribute-Change Time ULONG Checkpoint; // File Checkpoint ULONG Reserved; LONGAD IcbEA; // Extended Attribute ICB LONGAD IcbStream; // Stream Directory ICB REGID ImpUseID; // Implementation Use Identifier ULONGLONG UniqueID; // Unique ID ULONG EALength; // Length of Extended Attributes ULONG AllocLength; // Length of Allocation Descriptors UCHAR EAs[1]; // Extended Attributes // icbfile_EAs has a variant length = icbfile_EALength UCHAR Allocs[0]; // Allocation Descriptors. // icbfile_Allocs has a variant starting offset due to icbfile_EAs. // icbfile_Allocs has a variant length = icbfile_AllocLen. } ICBEXTFILE, *PICBEXTFILE; // // Macros for accessing FEs and EXT FEs transparently. Note that we // only need these for fields after the first new (in ext fe) field (which is // ObjectSize) and only for fields that we actually access. // // All of the following macros expect a parameter of type PICBFILE // #define FeBlocksRecorded( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ (F)->BlocksRecorded : ((PICBEXTFILE)(F))->BlocksRecorded) #define PFeAccessTime( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ &(F)->AccessTime : &((PICBEXTFILE)(F))->AccessTime) #define PFeModifyTime( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ &(F)->ModifyTime : &((PICBEXTFILE)(F))->ModifyTime) #define PFeCreationTime( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ &(F)->ModifyTime : &((PICBEXTFILE)(F))->CreationTime) #define FeEALength( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ (F)->EALength : ((PICBEXTFILE)(F))->EALength) #define FeAllocLength( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ (F)->AllocLength : ((PICBEXTFILE)(F))->AllocLength) #define FeEAs( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ (F)->EAs : ((PICBEXTFILE)(F))->EAs) #define FeEAsFieldOffset( F) (((F)->Destag.Ident == DESTAG_ID_NSR_FILE) ? \ FIELD_OFFSET( ICBFILE, EAs ) : FIELD_OFFSET( ICBEXTFILE, EAs )) #define UdfFEIsExtended( F) ((F)->Destag.Ident == DESTAG_ID_NSR_EXT_FILE) // Definitions for icbfile_Permissions (4/14.9.6) #define ICBFILE_PERM_OTH_X (0x00000001) // Other: Execute OK #define ICBFILE_PERM_OTH_W (0x00000002) // Other: Write OK #define ICBFILE_PERM_OTH_R (0x00000004) // Other: Read OK #define ICBFILE_PERM_OTH_A (0x00000008) // Other: Set Attributes OK #define ICBFILE_PERM_OTH_D (0x00000010) // Other: Delete OK #define ICBFILE_PERM_GRP_X (0x00000020) // Group: Execute OK #define ICBFILE_PERM_GRP_W (0x00000040) // Group: Write OK #define ICBFILE_PERM_GRP_R (0x00000080) // Group: Read OK #define ICBFILE_PERM_GRP_A (0x00000100) // Group: Set Attributes OK #define ICBFILE_PERM_GRP_D (0x00000200) // Group: Delete OK #define ICBFILE_PERM_OWN_X (0x00000400) // Owner: Execute OK #define ICBFILE_PERM_OWN_W (0x00000800) // Owner: Write OK #define ICBFILE_PERM_OWN_R (0x00001000) // Owner: Read OK #define ICBFILE_PERM_OWN_A (0x00002000) // Owner: Set Attributes OK #define ICBFILE_PERM_OWN_D (0x00004000) // Owner: Delete OK // (4/14.9.7) Record Format // Skipped // (4/14.9.8) Record Display Attributes // Skipped /*** nsr_eah - Extended Attributes Header Descriptor (4/14.10.1) * */ typedef struct NSR_EAH { DESTAG Destag; // Descriptor Tag (ID_NSR_XA) ULONG EAImp; // Implementation Attributes Location ULONG EAApp; // Application Attributes Location } NSR_EAH, *PNSR_EAH; /*** nsr_ea_g - Generic Extended Attributes Format (4/14.10.2) * */ typedef struct NSR_EA_GENERIC { ULONG EAType; // Extended Attribute Type UCHAR EASubType; // Extended Attribute Sub Type UCHAR Res5[3]; // Reserved Zeros ULONG EALength; // Extended Attribute Length UCHAR EAData[0]; // Extended Attribute Data (variant!) } NSR_EA_GENERIC, *PNSR_EA_GENERIC; // // Extended Attribute Types (14.4.10) // #define EA_TYPE_CHARSET 1 #define EA_TYPE_ALTPERM 3 #define EA_TYPE_FILETIMES 5 #define EA_TYPE_INFOTIMES 6 #define EA_TYPE_DEVICESPEC 12 #define EA_TYPE_IMPUSE 2048 #define EA_TYPE_APPUSE 65536 #define EA_SUBTYPE_BASE 1 // (4/14.10.3) Character Set Information Extended Attribute Format // Skipped // (4/14.10.4) Alternate Permissions Extended Attribute Format // Skipped // (4/14.10.5) File Times Extended Attribute Format typedef struct NSR_EA_FILETIMES { ULONG EAType; // Extended Attribute Type UCHAR EASubType; // Extended Attribute Sub Type UCHAR Res5[3]; // Reserved Zeros ULONG EALength; // Extended Attribute Length ULONG DataLength; // EAData Length ULONG Existence; // Specifies which times are recorded TIMESTAMP Stamps[0]; // Timestamps (variant!) } NSR_EA_FILETIMES, *PNSR_EA_FILETIMES; // Definitions for nsr_ea_filetimes_Existence (4/14.10.5.6) #define EA_FILETIMES_E_CREATION (0x00000001) #define EA_FILETIMES_E_DELETION (0x00000004) #define EA_FILETIMES_E_EFFECTIVE (0x00000008) #define EA_FILETIMES_E_LASTBACKUP (0x00000020) // (4/14.10.6) Information Times Extended Attribute Format // // Exactly the same as an NSR_EA_FILETIMES // Definitions for nsr_ea_infotimes_Existence (4/14.10.6.6) #define EA_INFOTIMES_E_CREATION (0x00000001) #define EA_INFOTIMES_E_MODIFICATION (0x00000002) #define EA_INFOTIMES_E_EXPIRATION (0x00000004) #define EA_INFOTIMES_E_EFFECTIVE (0x00000008) // (4/14.10.7) Device Specification Extended Attribute Format // Skipped // (4/14.10.8) Implementation Use Extended Attribute Format // Skipped // (4/14.10.9) Application Use Extended Attribute Format // Skipped /*** icbuase - Unallocated Space Entry (4/14.11) * * icbuase_destag.destag_Ident = DESTAG_ID_NSR_UASE * icbuase_icbtag.icbtag_FileType = ICBTAG_FILE_T_UASE * */ typedef struct ICBUASE { DESTAG Destag; // Descriptor Tag (ID_NSR_ICBUASE) ICBTAG Icbtag; // ICB Tag (ICBTAG_FILE_T_UASE) ULONG AllocLen; // Allocation Descriptors Length UCHAR Allocs[0]; // Allocation Descriptors (variant!) // The true length of this structure may vary! // icbuase_Allocs has a variant length = icbuase_AllocLen; } ICBUASE, *PICBUASE; /*** nsr_sbd - Space Bitmap Descriptor (4/14.12) * * nsr_sbd_destag.destag_Ident = DESTAG_ID_NSR_SBD * */ typedef struct NSR_SBD { DESTAG Destag; // Descriptor Tag (DESTAG_ID_NSR_SBD) ULONG BitCount; // Number of bits in Space Bitmap ULONG ByteCount; // Number of bytes in Space Bitmap UCHAR Bits[0]; // Space Bitmap (variant!) // The true length of this structure may vary! // nsr_sbd_Bits has a variant length = nsr_sbd_ByteCount; } NSR_SBD, *PNSR_SBD; /*** icbpinteg - Partition Integrity ICB Entry (4/14.13) * */ typedef struct ICBPINTEG { DESTAG Destag; // Descriptor Tag (ID_NSR_PINTEG) ICBTAG Icbtag; // ICB Tag (ICBTAG_FILE_T_PINTEG) TIMESTAMP Recording; // Recording Time UCHAR IntegType; // Integrity Type (ICBPINTEG_T_...) UCHAR Res49[175]; // Reserved Zeros REGID ImpUseID; // Implemetation Use Identifier UCHAR ImpUse[256]; // Implemetation Use Area } ICBPINTEG, *PICBPINTEG; // ICBPINTEG_T_... - Values for icbpinteg_IntegType #define ICBPINTEG_T_OPEN 0 // Open Partition Integrity Entry #define ICBPINTEG_T_CLOSE 1 // Close Partition Integrity Entry #define ICBPINTEG_T_STABLE 2 // Stable Partition Integrity Entry /*** (4/14.14.1) Short Allocation Descriptor *** (4/14.14.2) Long Allocation Descriptor *** (4/14.14.3) Extended Allocation Descriptor * * See SHORTAD, LONGAD, EXTAD, already defined above. * */ /*** nsr_lvhd - Logical Volume Header Descriptor (4/14.15) * * The definition is moved to before Logical Volume Integrity * Descriptor. * */ /*** nsr_path - Path Component (4/14.16) * */ typedef struct NSR_PATH { UCHAR Type; // Path Component Type (NSR_PATH_T_...) UCHAR CompLen; // Path Component Length UCHAR CompVer; // Path Component Version UCHAR Comp[0]; // Path Component Identifier (variant!) // nsr_path_Comp has a variant length = nsr_path_CompLen } NSR_PATH, *PNSR_PATH; // NSR_PATH_T_... - Values for nsr_path_Type #define NSR_PATH_T_RESERVED 0 // Reserved Value #define NSR_PATH_T_OTHER_ROOT 1 // Another root directory, by agreement #define NSR_PATH_T_ROOTDIR 2 // Root Directory ('\') #define NSR_PATH_T_PARENTDIR 3 // Parent Directory ('..') #define NSR_PATH_T_CURDIR 4 // Current Directory ('.') #define NSR_PATH_T_FILE 5 // File /*** ISO 13346 Part 5: Record Structure * * Skipped * */ // // Restore the standard structure packing. // #pragma pack()