UCHAR Reserved;
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 TrackNumber; /* CDROM_TOC.FirstTrack or TOC_LAST_TRACK behind last track CDROM_TOC.TrackData[CDROM_TOC.LastTrack] */
UCHAR Reserved1;
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]; /* <='sizeof(CDROM_TOC)-2' or less; it does not count 'Length' itself; little-endian */
+ /* >='sizeof(CDROM_TOC with (LastTrack-FirstTrack+1)+1{TOC_LAST_TRACK track} tracks)-2'
+ * <='sizeof(CDROM_TOC)-2';
+ * It does not count 'Length' field itself (==minus 2 bytes).
+ * Little-endian format.
+ */
+ UCHAR Length[2];
UCHAR FirstTrack; /* based anywhere */
- UCHAR LastTrack; /* last TrackData has TOC_LAST_TRACK; 'LastTrack-FirstTrack+1' is the count */
+ UCHAR LastTrack; /* 'LastTrack-FirstTrack+1' is the real-tracks count; TOC_LAST_TRACK is one track behind */
TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
} CDROM_TOC, *PCDROM_TOC;