#define MAXIMUM_NUMBER_TRACKS 100
#define MAXIMUM_CDROM_SIZE 804
+#define TOC_DATA_TRACK 0x04 /* TRACK_DATA.Control */
+#define TOC_LAST_TRACK 0xAA /* TRACK_DATA.TrackNumber */
+
typedef struct _TRACK_DATA {
UCHAR Reserved;
- UCHAR Control : 4;
- UCHAR Adr : 4;
- UCHAR TrackNumber;
+ UCHAR Control : 4; /* bitfield; 0 || TOC_DATA_TRACK */
+ UCHAR Adr : 4; /* Q-subchannel info */
+ UCHAR TrackNumber; /* CDROM_TOC.FirstTrack or TOC_LAST_TRACK on last+1 track CDROM_TOC.TrackData[CDROM_TOC.LastTrack-1] */
UCHAR Reserved1;
- UCHAR Address[4];
+ UCHAR Address[4]; /* big-endian LBA address for TOC_DATA_TRACK; MSF (sometimes BCD-MSF) for audio */
} TRACK_DATA, *PTRACK_DATA;
typedef struct _CDROM_TOC {
- UCHAR Length[2];
- UCHAR FirstTrack;
- UCHAR LastTrack;
+ UCHAR Length[2]; /* <='sizeof(CDROM_TOC)-2' or less; it does not count 'Length' itself; little-endian */
+ UCHAR FirstTrack; /* based anywhere */
+ UCHAR LastTrack; /* last TrackData has TOC_LAST_TRACK; 'LastTrack-FirstTrack+1' is the count */
TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
} CDROM_TOC, *PCDROM_TOC;