📄 iso13346.h
字号:
/*** 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.
*
*/
//
// 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)
*
* This is hands-down one of the most stupid things in 13346
*/
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
typedef enum _VSD_IDENT {
VsdIdentBad = 0,
VsdIdentBEA01,
VsdIdentTEA01,
VsdIdentCDROM,
VsdIdentCD001,
VsdIdentCDW01,
VsdIdentCDW02,
VsdIdentNSR01,
VsdIdentNSR02,
VsdIdentBOOT2
} 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_MINIMUM_PART4 256 // The lowest legal DESTAG in Part 4
#define DESTAG_ID_MAXIMUM_PART4 265 // The highest legal DESTAG in Part 4
// 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 Type; // Structure Type
UCHAR Ident[5]; // Standard Identifier ('NSR02')
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)
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -