diff options
| author | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
|---|---|---|
| committer | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
| commit | 97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch) | |
| tree | 46f3701832d70b420eb0fc0eb93261f9da45db3f /filesys/cdfs/cd.h | |
| parent | ef1905bf1e8825bb31120dfb27e0daf3154d859a (diff) | |
Initial publish
Diffstat (limited to 'filesys/cdfs/cd.h')
| -rw-r--r-- | filesys/cdfs/cd.h | 534 |
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_ + + + |
