summaryrefslogtreecommitdiff
path: root/filesys/cdfs/cd.h
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /filesys/cdfs/cd.h
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'filesys/cdfs/cd.h')
-rw-r--r--filesys/cdfs/cd.h534
1 files changed, 534 insertions, 0 deletions
diff --git a/filesys/cdfs/cd.h b/filesys/cdfs/cd.h
new file mode 100644
index 00000000..f830210a
--- /dev/null
+++ b/filesys/cdfs/cd.h
@@ -0,0 +1,534 @@
+/*++
+
+Copyright (c) 1989-2000 Microsoft Corporation
+
+Module Name:
+
+ Cd.h
+
+Abstract:
+
+ This module defines the on-disk structure of the Cdfs file system.
+
+
+--*/
+
+#ifndef _CDFS_
+#define _CDFS_
+
+//
+// Sector size on Cdrom disks is hard-coded to 2048
+//
+
+#ifndef SECTOR_SIZE
+#define SECTOR_SIZE (2048)
+#endif
+
+#define RAW_SECTOR_SIZE (2352)
+#define SECTOR_MASK (SECTOR_SIZE - 1)
+#define INVERSE_SECTOR_MASK ~(SECTOR_SIZE - 1)
+
+#ifndef SECTOR_SHIFT
+#define SECTOR_SHIFT (11)
+#endif
+
+#define XA_SECTOR_SIZE (2352)
+
+//
+// Cdfs file id is a large integer.
+//
+
+typedef LARGE_INTEGER FILE_ID;
+typedef FILE_ID *PFILE_ID;
+
+//
+// The following constants are values from the disk.
+//
+
+#define FIRST_VD_SECTOR (16)
+
+#define VOL_ID_LEN (5)
+#define ESC_SEQ_LEN (3)
+
+#define VERSION_1 (1)
+
+#define VD_TERMINATOR (255)
+#define VD_PRIMARY (1)
+#define VD_SECONDARY (2)
+
+#define VOLUME_ID_LENGTH (32)
+
+//
+// Leave the following so that CdfsBoot.c will compile
+//
+
+#define CD_SECTOR_SIZE (2048)
+
+#define ISO_VOL_ID "CD001"
+#define HSG_VOL_ID "CDROM"
+
+#define ISO_ATTR_MULTI 0x0080
+#define ISO_ATTR_DIRECTORY 0x0002
+
+#define MIN_DIR_REC_SIZE (sizeof( RAW_DIR_REC ) - MAX_FILE_ID_LENGTH)
+
+#define RVD_STD_ID( r, i ) (i ? r->StandardId : \
+ ((PRAW_HSG_VD) r)->StandardId )
+
+#define RVD_DESC_TYPE( r, i ) (i ? r->DescType : \
+ ((PRAW_HSG_VD) r)->DescType )
+
+#define RVD_VERSION( r, i ) (i ? r->Version : \
+ ((PRAW_HSG_VD) r)->Version )
+
+#define RVD_LB_SIZE( r, i ) (i ? r->LogicalBlkSzI : \
+ ((PRAW_HSG_VD) r)->LogicalBlkSzI )
+
+#define RVD_VOL_SIZE( r, i ) (i ? r->VolSpaceI : \
+ ((PRAW_HSG_VD) r)->VolSpaceI )
+
+#define RVD_ROOT_DE( r, i ) (i ? r->RootDe : \
+ ((PRAW_HSG_VD) r)->RootDe )
+
+#define DE_FILE_FLAGS( iso, de ) (iso ? de->FlagsISO : de->FlagsHSG)
+
+//
+// Data track flag for track entries in TOC
+//
+
+#define TOC_DATA_TRACK (0x04)
+#define TOC_LAST_TRACK (0xaa)
+
+
+//
+// There is considerable rearrangement of the volume descriptors for
+// ISO and HSG. However, within each standard the same structure can
+// be used for both the primary and secondary descriptors.
+//
+// Both of these structures are aligned correctly so that no
+// special macros will be needed to unpack them.
+//
+
+//
+// Declaration of length of root directory entry in volume descriptor
+//
+
+#define LEN_ROOT_DE (34)
+
+//
+// Maximum length of file ID on the disk. We allow file size beyond the ISO 9660
+// standard.
+//
+
+#define MAX_FILE_ID_LENGTH (255)
+
+
+typedef struct _RAW_ISO_VD {
+
+ UCHAR DescType; // volume type: 1 = standard, 2 = coded
+ UCHAR StandardId[5]; // volume structure standard id = CD001
+ UCHAR Version; // volume structure version number = 1
+ UCHAR VolumeFlags; // volume flags
+ UCHAR SystemId[32]; // system identifier
+ UCHAR VolumeId[32]; // volume identifier
+ UCHAR Reserved[8]; // reserved 8 = 0
+ ULONG VolSpaceI; // size of the volume in LBN's Intel
+ ULONG VolSpaceM; // size of the volume in LBN's Motorola
+ UCHAR CharSet[32]; // character set bytes 0 = ASCII
+ USHORT VolSetSizeI; // volume set size Intel
+ USHORT VolSetSizeM; // volume set size Motorola
+ USHORT VolSeqNumI; // volume set sequence number Intel
+ USHORT VolSeqNumM; // volume set sequence number Motorola
+ USHORT LogicalBlkSzI; // logical block size Intel
+ USHORT LogicalBlkSzM; // logical block size Motorola
+ ULONG PathTableSzI; // path table size in bytes Intel
+ ULONG PathTableSzM; // path table size in bytes Motorola
+ ULONG PathTabLocI[2]; // LBN of 2 path tables Intel
+ ULONG PathTabLocM[2]; // LBN of 2 path tables Motorola
+ UCHAR RootDe[LEN_ROOT_DE];// dir entry of the root directory
+ UCHAR VolSetId[128]; // volume set identifier
+ UCHAR PublId[128]; // publisher identifier
+ UCHAR PreparerId[128]; // data preparer identifier
+ UCHAR AppId[128]; // application identifier
+ UCHAR Copyright[37]; // file name of copyright notice
+ UCHAR Abstract[37]; // file name of abstract
+ UCHAR Bibliograph[37]; // file name of bibliography
+ UCHAR CreateDate[17]; // volume creation date and time
+ UCHAR ModDate[17]; // volume modification date and time
+ UCHAR ExpireDate[17]; // volume expiration date and time
+ UCHAR EffectDate[17]; // volume effective date and time
+ UCHAR FileStructVer; // file structure version number = 1
+ UCHAR Reserved3; // reserved
+ UCHAR ResApp[512]; // reserved for application
+ UCHAR Reserved4[653]; // remainder of 2048 bytes reserved
+
+} RAW_ISO_VD;
+typedef RAW_ISO_VD *PRAW_ISO_VD;
+
+
+typedef struct _RAW_HSG_VD {
+
+ ULONG BlkNumI; // logical block number Intel
+ ULONG BlkNumM; // logical block number Motorola
+ UCHAR DescType; // volume type: 1 = standard, 2 = coded
+ UCHAR StandardId[5]; // volume structure standard id = CDROM
+ UCHAR Version; // volume structure version number = 1
+ UCHAR VolumeFlags; // volume flags
+ UCHAR SystemId[32]; // system identifier
+ UCHAR VolumeId[32]; // volume identifier
+ UCHAR Reserved[8]; // reserved 8 = 0
+ ULONG VolSpaceI; // size of the volume in LBN's Intel
+ ULONG VolSpaceM; // size of the volume in LBN's Motorola
+ UCHAR CharSet[32]; // character set bytes 0 = ASCII
+ USHORT VolSetSizeI; // volume set size Intel
+ USHORT VolSetSizeM; // volume set size Motorola
+ USHORT VolSeqNumI; // volume set sequence number Intel
+ USHORT VolSeqNumM; // volume set sequence number Motorola
+ USHORT LogicalBlkSzI; // logical block size Intel
+ USHORT LogicalBlkSzM; // logical block size Motorola
+ ULONG PathTableSzI; // path table size in bytes Intel
+ ULONG PathTableSzM; // path table size in bytes Motorola
+ ULONG PathTabLocI[4]; // LBN of 4 path tables Intel
+ ULONG PathTabLocM[4]; // LBN of 4 path tables Motorola
+ UCHAR RootDe[LEN_ROOT_DE];// dir entry of the root directory
+ UCHAR VolSetId[128]; // volume set identifier
+ UCHAR PublId[128]; // publisher identifier
+ UCHAR PreparerId[128]; // data preparer identifier
+ UCHAR AppId[128]; // application identifier
+ UCHAR Copyright[32]; // file name of copyright notice
+ UCHAR Abstract[32]; // file name of abstract
+ UCHAR CreateDate[16]; // volume creation date and time
+ UCHAR ModDate[16]; // volume modification date and time
+ UCHAR ExpireDate[16]; // volume expiration date and time
+ UCHAR EffectDate[16]; // volume effective date and time
+ UCHAR FileStructVer; // file structure version number
+ UCHAR Reserved3; // reserved
+ UCHAR ResApp[512]; // reserved for application
+ UCHAR Reserved4[680]; // remainder of 2048 bytes reserved
+
+} RAW_HSG_VD;
+typedef RAW_HSG_VD *PRAW_HSG_VD;
+
+
+typedef struct _RAW_JOLIET_VD {
+
+ UCHAR DescType; // volume type: 2 = coded
+ UCHAR StandardId[5]; // volume structure standard id = CD001
+ UCHAR Version; // volume structure version number = 1
+ UCHAR VolumeFlags; // volume flags
+ UCHAR SystemId[32]; // system identifier
+ UCHAR VolumeId[32]; // volume identifier
+ UCHAR Reserved[8]; // reserved 8 = 0
+ ULONG VolSpaceI; // size of the volume in LBN's Intel
+ ULONG VolSpaceM; // size of the volume in LBN's Motorola
+ UCHAR CharSet[32]; // character set bytes 0 = ASCII, Joliett Seq here
+ USHORT VolSetSizeI; // volume set size Intel
+ USHORT VolSetSizeM; // volume set size Motorola
+ USHORT VolSeqNumI; // volume set sequence number Intel
+ USHORT VolSeqNumM; // volume set sequence number Motorola
+ USHORT LogicalBlkSzI; // logical block size Intel
+ USHORT LogicalBlkSzM; // logical block size Motorola
+ ULONG PathTableSzI; // path table size in bytes Intel
+ ULONG PathTableSzM; // path table size in bytes Motorola
+ ULONG PathTabLocI[2]; // LBN of 2 path tables Intel
+ ULONG PathTabLocM[2]; // LBN of 2 path tables Motorola
+ UCHAR RootDe[LEN_ROOT_DE];// dir entry of the root directory
+ UCHAR VolSetId[128]; // volume set identifier
+ UCHAR PublId[128]; // publisher identifier
+ UCHAR PreparerId[128]; // data preparer identifier
+ UCHAR AppId[128]; // application identifier
+ UCHAR Copyright[37]; // file name of copyright notice
+ UCHAR Abstract[37]; // file name of abstract
+ UCHAR Bibliograph[37]; // file name of bibliography
+ UCHAR CreateDate[17]; // volume creation date and time
+ UCHAR ModDate[17]; // volume modification date and time
+ UCHAR ExpireDate[17]; // volume expiration date and time
+ UCHAR EffectDate[17]; // volume effective date and time
+ UCHAR FileStructVer; // file structure version number = 1
+ UCHAR Reserved3; // reserved
+ UCHAR ResApp[512]; // reserved for application
+ UCHAR Reserved4[653]; // remainder of 2048 bytes reserved
+
+} RAW_JOLIET_VD;
+typedef RAW_JOLIET_VD *PRAW_JOLIET_VD;
+
+//
+// Macros to access the different volume descriptors.
+//
+
+#define CdRvdId(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->StandardId : \
+ ((PRAW_ISO_VD) (R))->StandardId \
+)
+
+#define CdRvdVersion(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->Version : \
+ ((PRAW_ISO_VD) (R))->Version \
+)
+
+#define CdRvdDescType(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->DescType : \
+ ((PRAW_ISO_VD) (R))->DescType \
+)
+
+#define CdRvdEsc(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->CharSet : \
+ ((PRAW_ISO_VD) (R))->CharSet \
+)
+
+#define CdRvdVolId(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->VolumeId : \
+ ((PRAW_ISO_VD) (R))->VolumeId \
+)
+
+#define CdRvdBlkSz(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->LogicalBlkSzI :\
+ ((PRAW_ISO_VD) (R))->LogicalBlkSzI \
+)
+
+#define CdRvdPtLoc(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->PathTabLocI[0]:\
+ ((PRAW_ISO_VD) (R))->PathTabLocI[0] \
+)
+
+#define CdRvdPtSz(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->PathTableSzI : \
+ ((PRAW_ISO_VD) (R))->PathTableSzI \
+)
+
+#define CdRvdDirent(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->RootDe : \
+ ((PRAW_ISO_VD) (R))->RootDe \
+)
+
+#define CdRvdVolSz(R,F) ( \
+ FlagOn( (F), VCB_STATE_HSG ) ? \
+ ((PRAW_HSG_VD) (R))->VolSpaceI : \
+ ((PRAW_ISO_VD) (R))->VolSpaceI \
+)
+
+
+//
+// This structure is used to overlay a region of a disk sector
+// to retrieve a single directory entry. There is a difference
+// in the file flags between the ISO and HSG version and a
+// additional byte in the ISO for the offset from Greenwich time.
+//
+// The disk structure is aligned on a word boundary, so any 32
+// bit fields will be represented as an array of 16 bit fields.
+//
+
+typedef struct _RAW_DIRENT {
+
+ UCHAR DirLen;
+ UCHAR XarLen;
+ UCHAR FileLoc[4];
+ UCHAR FileLocMot[4];
+ UCHAR DataLen[4];
+ UCHAR DataLenMot[4];
+ UCHAR RecordTime[6];
+ UCHAR FlagsHSG;
+ UCHAR FlagsISO;
+ UCHAR IntLeaveSize;
+ UCHAR IntLeaveSkip;
+ UCHAR Vssn[2];
+ UCHAR VssnMot[2];
+ UCHAR FileIdLen;
+ UCHAR FileId[MAX_FILE_ID_LENGTH];
+
+} RAW_DIRENT;
+typedef RAW_DIRENT RAW_DIR_REC;
+typedef RAW_DIRENT *PRAW_DIR_REC;
+typedef RAW_DIRENT *PRAW_DIRENT;
+
+#define CD_ATTRIBUTE_HIDDEN (0x01)
+#define CD_ATTRIBUTE_DIRECTORY (0x02)
+#define CD_ATTRIBUTE_ASSOC (0x04)
+#define CD_ATTRIBUTE_MULTI (0x80)
+
+#define CD_BASE_YEAR (1900)
+
+#define MIN_RAW_DIRENT_LEN (FIELD_OFFSET( RAW_DIRENT, FileId ) + 1)
+
+#define BYTE_COUNT_8_DOT_3 (24)
+
+#define SHORT_NAME_SHIFT (5)
+
+//
+// The following macro recovers the correct flag field.
+//
+
+#define CdRawDirentFlags(IC,RD) ( \
+ FlagOn( (IC)->Vcb->VcbState, VCB_STATE_HSG) ? \
+ (RD)->FlagsHSG : \
+ (RD)->FlagsISO \
+)
+
+//
+// The following macro converts from CD time to NT time. On ISO
+// 9660 media, we now pay attention to the GMT offset (integer
+// increments of 15 minutes offset from GMT). HSG does not record
+// this field.
+//
+// The restriction to the interval [-48, 52] comes from 9660 8.4.26.1
+//
+// VOID
+// CdConvertCdTimeToNtTime (
+// _In_ PIRP_CONTEXT IrpContext,
+// _In_ PCHAR CdTime,
+// _Out_ PLARGE_INTEGER NtTime
+// );
+//
+
+#define GMT_OFFSET_TO_NT ((LONGLONG) 15 * 60 * 1000 * 1000 * 10)
+
+#define CdConvertCdTimeToNtTime(IC,CD,NT) { \
+ TIME_FIELDS _TimeField; \
+ CHAR GmtOffset; \
+ _TimeField.Year = (CSHORT) *((PCHAR) CD) + CD_BASE_YEAR; \
+ _TimeField.Month = (CSHORT) *(Add2Ptr( CD, 1, PCHAR )); \
+ _TimeField .Day = (CSHORT) *(Add2Ptr( CD, 2, PCHAR )); \
+ _TimeField.Hour = (CSHORT) *(Add2Ptr( CD, 3, PCHAR )); \
+ _TimeField.Minute = (CSHORT) *(Add2Ptr( CD, 4, PCHAR )); \
+ _TimeField.Second = (CSHORT) *(Add2Ptr( CD, 5, PCHAR )); \
+ _TimeField.Milliseconds = (CSHORT) 0; \
+ RtlTimeFieldsToTime( &_TimeField, NT ); \
+ if (!FlagOn((IC)->Vcb->VcbState, VCB_STATE_HSG) && \
+ ((GmtOffset = *(Add2Ptr( CD, 6, PCHAR ))) != 0 ) && \
+ (GmtOffset >= -48 && GmtOffset <= 52)) { \
+ (NT)->QuadPart += -GmtOffset * GMT_OFFSET_TO_NT; \
+ } \
+}
+
+
+//
+// The on-disk representation of a Path Table entry differs between
+// the ISO version and the HSG version. The fields are the same
+// and the same size, but the positions are different.
+//
+
+typedef struct _RAW_PATH_ISO {
+
+ UCHAR DirIdLen;
+ UCHAR XarLen;
+ USHORT DirLoc[2];
+ USHORT ParentNum;
+ UCHAR DirId[MAX_FILE_ID_LENGTH];
+
+} RAW_PATH_ISO;
+typedef RAW_PATH_ISO *PRAW_PATH_ISO;
+typedef RAW_PATH_ISO RAW_PATH_ENTRY;
+typedef RAW_PATH_ISO *PRAW_PATH_ENTRY;
+
+typedef struct _RAW_PATH_HSG {
+
+ USHORT DirLoc[2];
+ UCHAR XarLen;
+ UCHAR DirIdLen;
+ USHORT ParentNum;
+ UCHAR DirId[MAX_FILE_ID_LENGTH];
+
+} RAW_PATH_HSG;
+typedef RAW_PATH_HSG *PRAW_PATH_HSG;
+
+#define MIN_RAW_PATH_ENTRY_LEN (FIELD_OFFSET( RAW_PATH_ENTRY, DirId ) + 1)
+
+//
+// The following macros are used to recover the different fields of the
+// Path Table entries. The macro to recover the disk location of the
+// directory must copy it into a different variable for alignment reasons.
+//
+// CdRawPathIdLen - Length of directory name in bytes
+// CdRawPathXar - Number of Xar blocks
+// CdRawPathLoc - Address of unaligned ulong for disk offset in blocks
+//
+
+#define CdRawPathIdLen(IC, RP) ( \
+ FlagOn( (IC)->Vcb->VcbState, VCB_STATE_HSG ) ? \
+ ((PRAW_PATH_HSG) (RP))->DirIdLen : \
+ (RP)->DirIdLen \
+)
+
+#define CdRawPathXar(IC, RP) ( \
+ FlagOn( (IC)->Vcb->VcbState, VCB_STATE_HSG ) ? \
+ ((PRAW_PATH_HSG) (RP))->XarLen : \
+ (RP)->XarLen \
+)
+
+#define CdRawPathLoc(IC, RP) ( \
+ FlagOn( (IC)->Vcb->VcbState, VCB_STATE_HSG ) ? \
+ ((PRAW_PATH_HSG) (RP))->DirLoc : \
+ (RP)->DirLoc \
+)
+
+
+//
+// System use are for XA data. The following is the system use area for
+// directory entries on XA data disks.
+//
+
+typedef struct _SYSTEM_USE_XA {
+
+ //
+ // Owner ID. Not used in this version.
+ //
+
+ UCHAR OwnerId[4];
+
+ //
+ // Extent attributes. Only interested if mode2 form2 or digital audio.
+ // This is stored big endian. We will define the attribute flags so
+ // we can ignore this fact.
+ //
+
+ USHORT Attributes;
+
+ //
+ // XA signature. This value must be 'XA'.
+ //
+
+ USHORT Signature;
+
+ //
+ // File Number.
+ //
+
+ UCHAR FileNumber;
+
+ //
+ // Not used in this version.
+ //
+
+ UCHAR Reserved[5];
+
+} SYSTEM_USE_XA;
+typedef SYSTEM_USE_XA *PSYSTEM_USE_XA;
+
+#define SYSTEM_USE_XA_FORM1 (0x0008)
+#define SYSTEM_USE_XA_FORM2 (0x0010)
+#define SYSTEM_USE_XA_DA (0x0040)
+
+#define SYSTEM_XA_SIGNATURE (0x4158)
+
+typedef enum _XA_EXTENT_TYPE {
+
+ Form1Data = 0,
+ Mode2Form2Data,
+ CDAudio
+
+} XA_EXTENT_TYPE;
+typedef XA_EXTENT_TYPE *PXA_EXTENT_TYPE;
+
+#endif // _CDFS_
+
+
+