/* ======================================================================= */ PCDTRACK GetCDROMTracks(PWINDOWHANDLES H, HANDLE CDHandle, LPDWORD DT, LPDWORD TrackCount) { PCDTRACK CDTrackData = NULL; PCDROM_TOC Table = NULL; for(;;) { SendMessage(H->PO, PBM_SETRANGE32, 0, 1); SendMessage(H->PO, PBM_SETPOS, 0, 0); Table = GetCDROMTrackData(H, CDHandle); if(Table == NULL) return NULL; *TrackCount = Table->LastTrack - (Table->FirstTrack - 1); if(*TrackCount > 0) { CDTrackData = new CDTRACK[*TrackCount]; *DT = 0; DWORD Track; for(Track=0; Track<*TrackCount; ++Track) { CDTrackData[Track].Address = AddressToSectors(Table->TrackData[Track].Address); CDTrackData[Track].Length = AddressToSectors(Table->TrackData[Track+1].Address) - CDTrackData[Track].Address; *DT += CDTrackData[Track].Length/SECTORS_AT_READ; } Log(LOG_WRITE, "Found %u (%u to %u) audio tracks on CD-ROM media", *TrackCount, Table->FirstTrack, Table->LastTrack); SetLabel(H->WT, "Found %u CD digital audio tracks!", *TrackCount); break; } SetLabel(H->WT, "Scanning for tracks failed!\nNo CD digital audio tracks detected!"); Log(LOG_WRITE, "There are no tracks on this CD media"); if(MessageBoxF(H->WH, WindowName, MB_ICONEXCLAMATION | MB_RETRYCANCEL, "This CD-ROM does not contain any tracks!\nPlease insert a CD-ROM with audio tracks.\n\nPress RETRY to try again.\nPress CANCEL to terminate.") == IDCANCEL) break; delete Table; } delete Table; SendMessage(H->PO, PBM_SETRANGE32, 0, 1); SendMessage(H->PO, PBM_SETPOS, 1, 0); SendMessage(H->PA, PBM_SETPOS, 4, 0); return CDTrackData; }
int mb_disc_read_unportable_nt(mb_disc_private *disc, const char *device) { HANDLE hDevice; DWORD dwReturned; BOOL bResult; CDROM_TOC toc; CDROM_TOC_SESSION_DATA session; char filename[128], *colon; int i, len; strcpy(filename, "\\\\.\\"); len = strlen(device); if (colon = strchr(device, ':')) { len = colon - device + 1; } strncat(filename, device, len > 120 ? 120 : len); printf("%s\n", device); printf("%s\n", filename); hDevice = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice == INVALID_HANDLE_VALUE) { snprintf(disc->error_msg, MB_ERROR_MSG_LENGTH, "couldn't open the CD audio device"); return 0; } bResult = DeviceIoControl(hDevice, IOCTL_CDROM_GET_LAST_SESSION, NULL, 0, &session, sizeof(session), &dwReturned, NULL); if (bResult == FALSE) { snprintf(disc->error_msg, MB_ERROR_MSG_LENGTH, "error while reading the CD TOC"); CloseHandle(hDevice); return 0; } bResult = DeviceIoControl(hDevice, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &dwReturned, NULL); if (bResult == FALSE) { snprintf(disc->error_msg, MB_ERROR_MSG_LENGTH, "error while reading the CD TOC"); CloseHandle(hDevice); return 0; } CloseHandle(hDevice); disc->first_track_num = toc.FirstTrack; disc->last_track_num = toc.LastTrack; /* multi-session disc */ if (session.FirstCompleteSession != session.LastCompleteSession) { disc->last_track_num = session.TrackData[0].TrackNumber - 1; disc->track_offsets[0] = AddressToSectors(toc.TrackData[disc->last_track_num].Address) - XA_INTERVAL; } else { disc->track_offsets[0] = AddressToSectors(toc.TrackData[disc->last_track_num].Address); } for (i = disc->first_track_num; i <= disc->last_track_num; i++) { disc->track_offsets[i] = AddressToSectors(toc.TrackData[i - 1].Address); } return 1; }