summaryrefslogtreecommitdiffstats
path: root/private/ntos/udfs
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/udfs
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to '')
-rw-r--r--private/ntos/udfs/iso13346.h1101
-rw-r--r--private/ntos/udfs/nodetype.h107
2 files changed, 1208 insertions, 0 deletions
diff --git a/private/ntos/udfs/iso13346.h b/private/ntos/udfs/iso13346.h
new file mode 100644
index 000000000..1ec246a0b
--- /dev/null
+++ b/private/ntos/udfs/iso13346.h
@@ -0,0 +1,1101 @@
+
+/*** ISO13346.H - ISO 13346 File System Disk Format
+ *
+ * Microsoft Confidential
+ * Copyright (C) Microsoft Corporation 1996
+ * 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.
+ *
+ */
+
+/*** ISO 13346 Part 1: General
+ *
+ *
+ */
+
+/*** charspec - Character Set Specification (1/7.2.1)
+ *
+ */
+
+typedef struct CHARSPEC {
+ UCHAR charspec_Type; // Character Set Type (CHARSPEC_T_...)
+ UCHAR charspec_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
+
+// CHARSPEC_T_CS... - Values for charspec_Info, depending on charspec_Type
+
+#define CHARSPEC_T_CS0_OSTA "OSTA Compressed Unicode"
+
+
+/*** timestamp - Timestamp Structure (1/7.3)
+ *
+ */
+
+typedef struct TIMESTAMP {
+ short timestamp_Type:4; // Timestamp Type (TIMESTAMP_T_...)
+ short timestamp_Zone:12; // Time Zone (+-1440 minutes from CUT)
+ USHORT timestamp_Year; // Year (1..9999)
+ UCHAR timestamp_Month; // Month (1..12)
+ UCHAR timestamp_Day; // Day (1..31)
+ UCHAR timestamp_Hour; // Hour (0..23)
+ UCHAR timestamp_Minute; // Minute (0..59)
+ UCHAR timestamp_Second; // Second (0..59)
+ UCHAR timestamp_centiSecond; // Centiseconds (0..99)
+ UCHAR timestamp_usec100; // Hundreds of microseconds (0..99)
+ UCHAR timestamp_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 regid_Flags; // Flags (REGID_F_...)
+ UCHAR regid_Identifier[23]; // Identifier
+ UCHAR regid_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 extentad_Len; // Extent Length in Bytes
+ ULONG extentad_lsn; // Extent Logical Sector Number
+} EXTENTAD, *PEXTENTAD;
+
+// Mask for extent_Length field, aka the dumbest thing in ISO 13346.
+
+#define EXTENTAD_LEN_MASK (0x3fffffff)// Maximum extent length, in bytes
+
+#define EXTENTAD_ALLOC_SHFT 30 // Extent Recording Info Shift
+#define EXTENTAD_ALLOC_MASK (0xc0000000)// Extent Recording Info Mask
+#define EXTENTAD_ALLOC__R_A (0x00000000)// Extent Recorded and Allocated
+#define EXTENTAD_ALLOC_NR_A (0x40000000)// Extent Not Recorded but Allocated
+#define EXTENTAD_ALLOC_NRNA (0x80000000)// Extent Not Recorded, not Allocated
+#define EXTENTAD_ALLOC_NEXT (0xc0000000)// Extent is next extent of Alloc Descs
+
+
+/*** nsr_lba - Logical Block Address (4/7.1) (lb_addr)
+ *
+ */
+
+typedef struct NSRLBA {
+ ULONG nsr_lba_lbn; // Logical Block Number
+ USHORT nsr_lba_Partition; // Partition Reference Number
+} NSRLBA, *PNSRLBA;
+
+
+/*** Short Allocation Descriptor (4/14.14.1)
+ *
+ */
+
+typedef struct SHORTAD {
+ ULONG shortad_Length; // Extent Length
+ ULONG shortad_Start; // Extent Logical Block Number
+} SHORTAD, *PSHORTAD;
+
+
+/*** Long Allocation Descriptor (4/14.14.2)
+ *
+ */
+
+typedef struct LONGAD {
+ ULONG longad_Length; // Extent Length
+ NSRLBA longad_Start; // Extent Location
+ UCHAR longad_ImpUse[6]; // Implementation Use
+} LONGAD, *PLONGAD;
+
+
+/*** Extended Allocation Descriptor (4/14.14.3)
+ *
+ */
+
+typedef struct EXTAD {
+ ULONG extad_ExtentLen; // Extent Length
+ ULONG extad_RecordedLen; // Recorded Length
+ ULONG extad_InfoLen; // Information Length
+ NSRLBA extad_Start; // Extent Location
+ UCHAR extad_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 vsd_generic_Type; // Structure Type
+ UCHAR vsd_generic_Ident[5]; // Standard Identifier
+ UCHAR vsd_generic_Version; // Standard Version
+ UCHAR vsd_generic_Data[2041]; // Structure Data
+} VSD_GENERIC, *PVSD_GENERIC;
+
+// 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
+
+
+/*** vsd_bea01 - Begin Extended Area Descriptor (2/9.2)
+ *
+ */
+
+typedef struct VSD_BEA01 {
+ UCHAR vsd_bea01_Type; // Structure Type
+ UCHAR vsd_bea01_Ident[5]; // Standard Identifier ('BEA01')
+ UCHAR vsd_bea01_Version; // Standard Version
+ UCHAR vsd_bea01_Data[2041]; // Structure Data
+} VSD_BEA01, *PVSD_BEA01;
+
+
+/*** vsd_tea01 - Terminate Extended Area Descriptor (2/9.3)
+ *
+ */
+
+typedef struct VSD_TEA01 {
+ UCHAR vsd_tea01_Type; // Structure Type
+ UCHAR vsd_tea01_Ident[5]; // Standard Identifier ('TEA01')
+ UCHAR vsd_tea01_Version; // Standard Version
+ UCHAR vsd_tea01_Data[2041]; // Structure Data
+} VSD_TEA01, *PVSD_TEA01;
+
+
+/*** vsd_boot2 - Boot Descriptor (2/9.4)
+ *
+ */
+
+typedef struct VSD_BOOT2 {
+ UCHAR vsd_boot2_Type; // Structure Type
+ UCHAR vsd_boot2_Ident[5]; // Standard Identifier ('BOOT2')
+ UCHAR vsd_boot2_Version; // Standard Version
+ UCHAR vsd_boot2_Res8; // Reserved Zero
+ REGID vsd_boot2_Architecture; // Architecture Type
+ REGID vsd_boot2_BootIdent; // Boot Identifier
+ ULONG vsd_boot2_BootExt; // Boot Extent Start
+ ULONG vsd_boot2_BootExtLen; // Boot Extent Length
+ ULONG vsd_boot2_LoadAddr[2]; // Load Address
+ ULONG vsd_boot2_StartAddr[2]; // Start Address
+ TIMESTAMP vsd_boot2_timestamp; // Creation Time
+ USHORT vsd_boot2_Flags; // Flags (VSD_BOOT2_F_...)
+ UCHAR vsd_boot2_Res110[32]; // Reserved Zeros
+ UCHAR vsd_boot2_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
+
+
+/*** 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 destag_Ident; // Tag Identifier
+ USHORT destag_Version; // Descriptor Version
+ UCHAR destag_Checksum; // Tag Checksum
+ UCHAR destag_Res5; // Reserved
+ USHORT destag_Serial; // Tag Serial Number
+ USHORT destag_CRC; // Descriptor CRC
+ USHORT destag_CRCLen; // Descriptor CRC Length
+ ULONG destag_lsn; // Tag Location (Logical Sector 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
+
+// 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_XA 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
+
+// DESTAG_VER_... - Values for destag_Version (3/7.2.2)
+
+#define DESTAG_VER_CURRENT 2 // 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 Volume Structure Descriptor (3/9.1)
+ *
+ */
+
+typedef struct VSD_NSR02 {
+ UCHAR vsd_nsr02_Type; // Structure Type
+ UCHAR vsd_nsr02_Ident[5]; // Standard Identifier ('NSR02')
+ UCHAR vsd_nsr02_Version; // Standard Version
+ UCHAR vsd_nsr02_Res7; // Reserved 0 Byte
+ UCHAR vsd_nsr02_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_pvd - NSR Primary Volume Descriptor (3/10.1)
+ *
+ * nsr_pvd_destag.destag_Ident = DESTAG_ID_NSR_PVD
+ *
+ */
+
+typedef struct NSR_PVD {
+ DESTAG nsr_pvd_destag; // Descriptor Tag (NSR_PVD)
+ ULONG nsr_pvd_Sequence; // Volume Descriptor Sequence Number
+ ULONG nsr_pvd_Number; // Primary Volume Descriptor Number
+ UCHAR nsr_pvd_VolumeID[32]; // Volume Identifier
+ USHORT nsr_pvd_VolSetSeq; // Volume Set Sequence Number
+ USHORT nsr_pvd_VolSetSeqMax; // Maximum Volume Set Sequence Number
+ USHORT nsr_pvd_Level; // Interchange Level
+ USHORT nsr_pvd_LevelMax; // Maximum Interchange Level
+ ULONG nsr_pvd_CharSetList; // Character Set List (See 1/7.2.11)
+ ULONG nsr_pvd_CharSetListMax; // Maximum Character Set List
+ UCHAR nsr_pvd_VolSetID[128]; // Volume Set Identifier
+ CHARSPEC nsr_pvd_charsetDesc; // Descriptor Character Set
+ CHARSPEC nsr_pvd_charsetExplan; // Explanatory Character Set
+ EXTENTAD nsr_pvd_Abstract; // Volume Abstract Location
+ EXTENTAD nsr_pvd_Copyright; // Volume Copyright Notice Location
+ REGID nsr_pvd_Application; // Application Identifier
+ TIMESTAMP nsr_pvd_RecordTime; // Recording Time
+ REGID nsr_pvd_ImpUseID; // Implementation Identifier
+ UCHAR nsr_pvd_ImpUse[64]; // Implementation Use
+ ULONG nsr_pvd_Predecessor; // Predecessor Vol Desc Seq Location
+ USHORT nsr_pvd_Flags; // Flags
+ UCHAR nsr_pvd_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 nsr_anchor_destag; // Descriptor Tag (NSR_ANCHOR)
+ EXTENTAD nsr_anchor_Main; // Main Vol Desc Sequence Location
+ EXTENTAD nsr_anchor_Reserve; // Reserve Vol Desc Sequence Location
+ UCHAR nsr_anchor_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 nsr_vdp_destag; // Descriptor Tag (NSR_VDP)
+ ULONG nsr_vdp_VolDescSeqNum; // Vol Desc Sequence Number
+ EXTENTAD nsr_vdp_Next; // Next Vol Desc Sequence Location
+ UCHAR nsr_vdp_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 nsr_impuse_destag; // Descriptor Tag (NSR_IMPUSE)
+ ULONG nsr_impuse_VolDescSeqNum; // Vol Desc Sequence Number
+ REGID nsr_impuse_ImpUseID; // Implementation Identifier
+ UCHAR nsr_impuse_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 nsr_part_destag; // Descriptor Tag (NSR_PART)
+ ULONG nsr_part_VolDescSeqNum; // Vol Desc Sequence Number
+ USHORT nsr_part_Flags; // Partition Flags (NSR_PART_F_...)
+ USHORT nsr_part_Number; // Partition Number
+ REGID nsr_part_ContentsID; // Partition Contents ID
+ UCHAR nsr_part_ContentsUse[128]; // Partition Contents Use
+ ULONG nsr_part_AccessType; // Access Type
+ ULONG nsr_part_Start; // Partition Starting Location
+ ULONG nsr_part_Length; // Partition Length (sector count)
+ REGID nsr_part_ImpUseID; // Implementation Identifier
+ UCHAR nsr_part_ImpUse[128]; // Implementation Use
+ UCHAR nsr_part_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
+
+// 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 true length of nsr_lvol_MapTable[] is (nsr_lvol_MapTableLength).
+ *
+ * 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 nsr_lvol_destag; // Descriptor Tag (NSR_LVOL)
+ ULONG nsr_lvol_VolDescSeqNum; // Vol Desc Sequence Number
+ CHARSPEC nsr_lvol_charspec; // Descriptor Character Set
+ UCHAR nsr_lvol_VolumeID[128]; // Logical Volume ID
+ ULONG nsr_lvol_BlockSize; // Logical Block Size (in bytes)
+ REGID nsr_lvol_DomainID; // Domain Identifier
+ LONGAD nsr_lvol_FSD; // Logical Volume Contents Use
+ ULONG nsr_lvol_MapTableLength; // Map Table Length (bytes)
+ ULONG nsr_lvol_MapTableCount; // Map Table Partition Maps Count
+ REGID nsr_lvol_ImpUseID; // Implementaion Identifier
+ UCHAR nsr_lvol_ImpUse[128]; // Implementation Use
+ EXTENTAD nsr_lvol_Integrity; // Integrity Sequence Extent
+ UCHAR nsr_lvol_MapTable[0]; // Partition Map Table (variant!)
+
+// The true length of this structure may vary!
+// The true length of nsr_lvol_MapTable is (nsr_lvol_MapTableLength).
+
+} NSR_LVOL, *PNSR_LVOL;
+
+
+/*** partmap_g - Generic Partition Map (3/10.7.1)
+ *
+ * The true length of partmap_g_Map[] is (partmap_g_Length - 2).
+ */
+
+typedef struct PARTMAPG {
+ UCHAR partmap_g_Type; // Partition Map Type
+ UCHAR partmap_g_Length; // Partition Map Length
+ UCHAR partmap_g_Map[0]; // Partion Mapping (variant!)
+
+// The true length of this structure may vary!
+// The true length of partmap_g_Map[] is (partmap_g_Length - 2).
+
+} PARTMAPG, *PPARTMAPG;
+
+// Values for partmap_g_Type
+
+#define PARTMAP_TYPE_NOTSPEC 0 // Partition Map Format Not Specified
+#define PARTMAP_TYPE_NORMAL 1 // Partition Map in Volume Set (Type 1)
+#define PARTMAP_TYPE_PROXY 2 // Partition Map by identifier (Type 2)
+
+
+/*** partmap - 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 {
+ UCHAR partmap_Type; // Partition Map Type = 1
+ UCHAR partmap_Length; // Partition Map Length = 6
+ USHORT partmap_VolSetSeq; // Partition Volume Set Sequence Number
+ USHORT partmap_Partition; // Partition Number
+} PARTMAP, *PPARTMAP;
+
+
+/*** partmap_p - Proxy (Type 2) Partition Map (3/10.7.3)
+ *
+ * A Proxy Partition Map is commonly not interchangeable.
+ *
+ */
+
+typedef struct PARTMAPP {
+ UCHAR partmap_p_Type; // Partition Map Type = 1
+ UCHAR partmap_p_Length; // Partition Map Length = 64
+ UCHAR partmap_p_PartID[62]; // Partition Identifier (Proxy)
+} PARTMAPP, *PPARTMAPP;
+
+
+/*** 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 nsr_uasd_destag; // Descriptor Tag (NSR_UASD)
+ ULONG nsr_uasd_VolDescSeqNum; // Vol Desc Sequence Number
+ ULONG nsr_uasd_ExtentCount; // Number of Allocation Descriptors
+ EXTENTAD nsr_uasd_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 nsr_term_destag; // Descriptor Tag (NSR_TERM)
+ UCHAR nsr_term_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 nsr_lvhd_UniqueID[2]; // Unique ID
+ UCHAR nsr_lvhd_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 nsr_integ_destag; // Descriptor Tag (NSR_LVINTEG)
+ TIMESTAMP nsr_integ_Time; // Recording Date
+ ULONG nsr_integ_Type; // Integrity Type (INTEG_T_...)
+ EXTENTAD nsr_integ_Next; // Next Integrity Extent
+ NSR_LVHD nsr_integ_LVHD; // Logical Volume Contents Use
+ ULONG nsr_integ_PartitionCount; // Number of Partitions
+ ULONG nsr_integ_ImpUseLength; // Length of Implementation Use
+ ULONG nsr_integ_Free[1]; // Free Space Table
+
+// nsr_integ_Free has a variant length = (4*nsr_integ_PartitionCount)
+
+ ULONG nsr_integ_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 nsr_integ_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 nsr_fsd_destag; // Descriptor Tag (NSR_LVOL)
+ TIMESTAMP nsr_fsd_Time; // Recording Time
+ USHORT nsr_fsd_Level; // Interchange Level
+ USHORT nsr_fsd_LevelMax; // Maximum Interchange Level
+ ULONG nsr_fsd_CharSetList; // Character Set List (See 1/7.2.11)
+ ULONG nsr_fsd_CharSetListMax; // Maximum Character Set List
+ ULONG nsr_fsd_FileSet; // File Set Number
+ ULONG nsr_fsd_FileSetDesc; // File Set Descriptor Number
+ CHARSPEC nsr_fsd_charspecVolID; // Volume ID Character Set
+ UCHAR nsr_fsd_VolID[128]; // Volume ID
+ CHARSPEC nsr_fsd_charspecFileSet;// File Set Character Set
+ UCHAR nsr_fsd_FileSetID[32]; // File Set ID
+ UCHAR nsr_fsd_Copyright[32]; // Copyright File Name
+ UCHAR nsr_fsd_Abstract[32]; // Abstract File Name
+ LONGAD nsr_fsd_icbRoot; // Root Directory ICB Address
+ REGID nsr_fsd_DomainID; // Domain Identifier
+ LONGAD nsr_fsd_NextExtent; // Next FSD Extent
+ UCHAR nsr_fsd_Res464[48]; // 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 nsr_part_h_UASTable; // Unallocated Space Table
+ SHORTAD nsr_part_h_UASBitmap; // Unallocated Space Bitmap
+ SHORTAD nsr_part_h_IntegTable; // Integrity Table
+ SHORTAD nsr_part_h_FreedTable; // Freed Space Table
+ SHORTAD nsr_part_h_FreedBitmap; // Freed Space Bitmap
+ UCHAR nsr_part_h_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 nsr_fid_destag; // Descriptor Tag (NSR_FID)
+ USHORT nsr_fid_Version; // File Version Number
+ UCHAR nsr_fid_Flags; // File Flags (NSR_FID_F_...)
+ UCHAR nsr_fid_FileIDLen; // File ID Length
+ LONGAD nsr_fid_icb; // ICB (long) Address
+ USHORT nsr_fid_ImpUseLen; // Implementation Use Length
+
+ UCHAR nsr_fid_ImpUse[1]; // Implementation Use Area
+
+// nsr_fid_ImpUse has a variant length = nsr_fid_ImpUseLen
+
+ UCHAR nsr_fid_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 nsr_fid_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;
+
+
+// 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_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 nsr_alloc_destag; // Descriptor Tag (NSR_ALLOC)
+ ULONG nsr_alloc_Prev; // Previous Allocation Descriptor
+ ULONG nsr_alloc_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 icbtag_PriorDirectCount;// Prior Direct Entry Count
+ USHORT icbtag_StratType; // Strategy Type (ICBTAG_STRAT_...)
+ USHORT icbtag_StratParm; // Strategy Parameter (2 bytes)
+ USHORT icbtag_MaxEntries; // Maximum Number of Entries in ICB
+ UCHAR icbtag_Res10; // Reserved Zero
+ UCHAR icbtag_FileType; // File Type (ICBTAG_FILE_T_...)
+ NSRLBA icbtag_icbParent; // Parent ICB Location
+ USHORT icbtag_Flags; // ICB Flags
+} ICBTAG, *PICBTAG;
+
+
+// ICBTAG_STRAT_T_... - ICB Strategy Types
+// BUGBUG: rickdew 7/31/95. Weird strategies! I'm guessing on names here.
+
+#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 ICBTAG_F_SORTED (0x0004)// 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 icbind_destag; // Descriptor Tag (ID_NSR_ICBIND)
+ ICBTAG icbind_icbtag; // ICB Tag (ICBTAG_FILE_T_INDIRECT)
+ LONGAD icbind_icb; // ICB Address
+} ICBIND, *PICBIND;
+
+
+/*** icbtrm - Terminal ICB Entry (4/14.8)
+ *
+ */
+
+typedef struct ICBTRM {
+ DESTAG icbtrm_destag; // Descriptor Tag (ID_NSR_ICBTRM)
+ ICBTAG icbtrm_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 icbfile_destag; // Descriptor Tag (ID_NSR_FILE)
+ ICBTAG icbfile_icbtag; // ICB Tag (ICBTAG_FILE_T_FILE)
+ ULONG icbfile_UID; // User ID of file's owner
+ ULONG icbfile_GID; // Group ID of file's owner
+ ULONG icbfile_Permissions; // File Permissions
+ USHORT icbfile_LinkCount; // File hard-link count
+ UCHAR icbfile_RecordFormat; // Record Format
+ UCHAR icbfile_RecordDisplay; // Record Display Attributes
+ ULONG icbfile_RecordLength; // Record Length
+ ULONG icbfile_InfoLength[2]; // Information Length (file size)
+ ULONG icbfile_BlocksRecorded[2]; // Logical Blocks Recorded
+ TIMESTAMP icbfile_AccessTime; // Last-Accessed Time
+ TIMESTAMP icbfile_ModifyTime; // Last-Modification Time
+ TIMESTAMP icbfile_AttributeTime; // Last-Attribute-Change Time
+ ULONG icbfile_Checkpoint; // File Checkpoint
+ LONGAD icbfile_icbXA; // Extended Attribute ICB
+ REGID icbfile_ImpUseID; // Implementation Use Identifier
+ ULONG icbfile_UniqueID[2]; // Unique ID
+ ULONG icbfile_XALength; // Length of Extended Attributes
+ ULONG icbfile_AllocLen; // Length of Allocation Descriptors
+ UCHAR icbfile_XAs[1]; // Extended Attributes
+
+// icbfile_XAs has a variant length = icbfile_XALength
+
+ UCHAR icbfile_Allocs[0]; // Allocation Descriptors.
+
+// icbfile_Allocs has a variant starting offset due to icbfile_XAs.
+// icbfile_Allocs has a variant length = icbfile_AllocLen.
+
+} ICBFILE, *PICBFILE;
+
+
+// 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_xah - Extended Attributes Header Descriptor (4/14.10.1)
+ *
+ */
+
+typedef struct NSR_XAH {
+ DESTAG nsr_xah_destag; // Descriptor Tag (ID_NSR_XA)
+ ULONG nsr_xah_XAImp; // Implementation Attributes Location
+ ULONG nsr_xah_XAApp; // Application Attributes Location
+} NSR_XAH, *PNSR_XAH;
+
+
+/*** nsr_xa_g - Generic Extended Attributes Format (4/14.10.2)
+ *
+ */
+
+typedef struct NSR_XA_G {
+ ULONG nsr_xa_g_XAType; // Extended Attribute Type
+ UCHAR nsr_xa_g_XASubType; // Extended Attribute Sub Type
+ UCHAR nsr_xa_g_Res5[3]; // Reserved Zeros
+ ULONG nsr_xa_g_XALength; // Extended Attribute Length
+ UCHAR nsr_xa_g_XAData[0]; // Extended Attribute Data (variant!)
+
+// The true length of this structure may vary!
+// nsr_xa_g_XAData has a variant length = nsr_xa_g_XALength - 12
+
+} NSR_XA_G, *PNSR_XA_G;
+
+
+// (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_XA_FILETIMES {
+ ULONG nsr_xa_filetimes_XAType; // Extended Attribute Type
+ UCHAR nsr_xa_filetimes_XASubType; // Extended Attribute Sub Type
+ UCHAR nsr_xa_filetimes_Res5[3]; // Reserved Zeros
+ ULONG nsr_xa_filetimes_XALength; // Extended Attribute Length
+ ULONG nsr_xa_filetimes_DataLength; // XAData Length
+ ULONG nsr_xa_filetimes_Existence; // Specifies which times are recorded
+ UCHAR nsr_xa_filetimes_XAData[0]; // Extended Attribute Data (variant!)
+
+// The true length of this structure may vary!
+// nsr_xa_g_XAData has a variant length = DataLength
+
+} NSR_XA_FILETIMES, *PNSR_XA_FILETIMES;
+
+
+// Definitions for nsr_xa_filetimes_Existence (4/14.10.5.6)
+
+#define XA_FILETIMES_E_CREATION (0x00000001)
+#define XA_FILETIMES_E_DELETION (0x00000004)
+#define XA_FILETIMES_E_EFFECTIVE (0x00000008)
+#define XA_FILETIMES_E_LASTBACKUP (0x00000020)
+
+
+// (4/14.10.6) Information Times Extended Attribute Format
+// Skipped
+
+// (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 icbuase_destag; // Descriptor Tag (ID_NSR_ICBUASE)
+ ICBTAG icbuase_icbtag; // ICB Tag (ICBTAG_FILE_T_UASE)
+ ULONG icbuase_AllocLen; // Allocation Descriptors Length
+ UCHAR icbuase_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 nsr_sbd_destag; // Descriptor Tag (DESTAG_ID_NSR_SBD)
+ ULONG nsr_sbd_BitCount; // Number of bits in Space Bitmap
+ ULONG nsr_sbd_ByteCount; // Number of bytes in Space Bitmap
+ UCHAR nsr_sbd_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 icbpinteg_destag; // Descriptor Tag (ID_NSR_PINTEG)
+ ICBTAG icbpinteg_icbtag; // ICB Tag (ICBTAG_FILE_T_PINTEG)
+ TIMESTAMP icbpinteg_Recording; // Recording Time
+ UCHAR icbpinteg_IntegType; // Integrity Type (ICBPINTEG_T_...)
+ UCHAR icbpinteg_Res49[175]; // Reserved Zeros
+ REGID icbpinteg_ImpUseID; // Implemetation Use Identifier
+ UCHAR icbpinteg_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 nsr_path_Type; // Path Component Type (NSR_PATH_T_...)
+ UCHAR nsr_path_CompLen; // Path Component Length
+ UCHAR nsr_path_CompVer; // Path Component Version
+ UCHAR nsr_path_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
+ *
+ */
+
diff --git a/private/ntos/udfs/nodetype.h b/private/ntos/udfs/nodetype.h
new file mode 100644
index 000000000..1bb849825
--- /dev/null
+++ b/private/ntos/udfs/nodetype.h
@@ -0,0 +1,107 @@
+/*++
+
+Copyright (c) 1996 Microsoft Corporation
+
+Module Name:
+
+ NodeType.h
+
+Abstract:
+
+ This module defines all of the node type codes used in this development
+ shell. Every major data structure in the file system is assigned a node
+ type code that is. This code is the first CSHORT in the structure and is
+ followed by a CSHORT containing the size, in bytes, of the structure.
+
+Author:
+
+ Dan Lovinger [DanLo] 20-May-1996
+
+Revision History:
+
+--*/
+
+#ifndef _NODETYPE_
+#define _NODETYPE_
+
+typedef CSHORT NODE_TYPE_CODE;
+typedef NODE_TYPE_CODE *PNODE_TYPE_CODE;
+
+#define NTC_UNDEFINED ((NODE_TYPE_CODE)0x0000)
+
+#define UDFS_NTC_DATA_HEADER ((NODE_TYPE_CODE)0x0801)
+#define UDFS_NTC_VCB ((NODE_TYPE_CODE)0x0802)
+#define UDFS_NTC_FCB_INDEX ((NODE_TYPE_CODE)0x0803)
+#define UDFS_NTC_FCB_DATA ((NODE_TYPE_CODE)0x0804)
+#define UDFS_NTC_FCB_NONPAGED ((NODE_TYPE_CODE)0x0805)
+#define UDFS_NTC_CCB ((NODE_TYPE_CODE)0x0806)
+#define UDFS_NTC_IRP_CONTEXT ((NODE_TYPE_CODE)0x0807)
+#define UDFS_NTC_IRP_CONTEXT_LITE ((NODE_TYPE_CODE)0x0808)
+
+typedef CSHORT NODE_BYTE_SIZE;
+
+//
+// So all records start with
+//
+// typedef struct _RECORD_NAME {
+// NODE_TYPE_CODE NodeTypeCode;
+// NODE_BYTE_SIZE NodeByteSize;
+// :
+// } RECORD_NAME;
+// typedef RECORD_NAME *PRECORD_NAME;
+//
+
+#define NodeType(P) ((P) != NULL ? (*((PNODE_TYPE_CODE)(P))) : NTC_UNDEFINED)
+#define SafeNodeType(Ptr) (*((PNODE_TYPE_CODE)(Ptr)))
+
+
+//
+// The following definitions are used to generate meaningful blue bugcheck
+// screens. On a bugcheck the file system can output 4 ulongs of useful
+// information. The first ulong will have encoded in it a source file id
+// (in the high word) and the line number of the bugcheck (in the low word).
+// The other values can be whatever the caller of the bugcheck routine deems
+// necessary.
+//
+// Each individual file that calls bugcheck needs to have defined at the
+// start of the file a constant called BugCheckFileId with one of the
+// UDFS_BUG_CHECK_ values defined below and then use UdfBugCheck to bugcheck
+// the system.
+//
+
+//
+// Not all of these are actually used in UDFS. Perhaps this list will be
+// optimized when UDFS is functionally complete.
+//
+
+#define UDFS_BUG_CHECK_ACCHKSUP (0x00010000)
+#define UDFS_BUG_CHECK_ALLOCSUP (0x00020000)
+#define UDFS_BUG_CHECK_CACHESUP (0x00030000)
+#define UDFS_BUG_CHECK_CDDATA (0x00040000)
+#define UDFS_BUG_CHECK_CDINIT (0x00050000)
+#define UDFS_BUG_CHECK_CLEANUP (0x00060000)
+#define UDFS_BUG_CHECK_CLOSE (0x00070000)
+#define UDFS_BUG_CHECK_CREATE (0x00080000)
+#define UDFS_BUG_CHECK_DEVCTRL (0x00090000)
+#define UDFS_BUG_CHECK_DEVIOSUP (0x000a0000)
+#define UDFS_BUG_CHECK_DIRCTRL (0x000b0000)
+#define UDFS_BUG_CHECK_DIRSUP (0x000c0000)
+#define UDFS_BUG_CHECK_FILEINFO (0x000d0000)
+#define UDFS_BUG_CHECK_FILOBSUP (0x000e0000)
+#define UDFS_BUG_CHECK_FSCTRL (0x000f0000)
+#define UDFS_BUG_CHECK_FSPDISP (0x00100000)
+#define UDFS_BUG_CHECK_LOCKCTRL (0x00110000)
+#define UDFS_BUG_CHECK_NAMESUP (0x00120000)
+#define UDFS_BUG_CHECK_PATHSUP (0x00130000)
+#define UDFS_BUG_CHECK_PREFXSUP (0x00140000)
+#define UDFS_BUG_CHECK_READ (0x00150000)
+#define UDFS_BUG_CHECK_RESRCSUP (0x00160000)
+#define UDFS_BUG_CHECK_STRUCSUP (0x00170000)
+#define UDFS_BUG_CHECK_TIMESUP (0x00180000)
+#define UDFS_BUG_CHECK_VERFYSUP (0x00190000)
+#define UDFS_BUG_CHECK_VOLINFO (0x001a0000)
+#define UDFS_BUG_CHECK_WORKQUE (0x001b0000)
+
+#define UdfBugCheck(A,B,C) { KeBugCheckEx(UDFS_FILE_SYSTEM, BugCheckFileId | __LINE__, A, B, C ); }
+
+#endif // _NODETYPE_