reactos/drivers/filesystems/cdfs/cd.h
Joachim Henze 19f220bf51 [0.4.9][CDFS_NEW] -> [CDFS]
port back:
0.4.10-dev-615-g 45fd48bd0f [CDFS_NEW] -> [CDFS] No old driver, thus no new driver
0.4.10-dev-614-g 5795254933 [CDFS] Delete the old CDFS driver.

The new MS PL licensed one worked for several years fine for us now
even in the older releases.
So no need to keep our old unfinished one any longer within
the release-branches. They are no mausoleum.
This does *not* change, which driver is actually in use.
We do continue to use 1:1 the state of current releases/0.4.10
2023-03-23 22:09:06 +01:00

535 lines
18 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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_