186 lines
5.2 KiB
C
186 lines
5.2 KiB
C
/*++
|
||
|
||
Copyright (c) 1995 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
read.c
|
||
|
||
Abstract:
|
||
|
||
dump cd tracks/sectors to wav files
|
||
|
||
Environment:
|
||
|
||
User mode only
|
||
|
||
Revision History:
|
||
|
||
05-26-98 : Created
|
||
|
||
--*/
|
||
|
||
#include "common.h"
|
||
|
||
#define LARGEST_SECTORS_PER_READ 27 // about 64k of data
|
||
|
||
|
||
|
||
ULONG32
|
||
CddumpDumpLba(
|
||
HANDLE CdromHandle,
|
||
HANDLE OutHandle,
|
||
ULONG StartAddress,
|
||
ULONG EndAddress
|
||
)
|
||
{
|
||
RAW_READ_INFO info; // fill in for the read request
|
||
PUCHAR sample;
|
||
ULONG bytesReturned;
|
||
ULONG currentLba;
|
||
ULONG temp;
|
||
ULONG sectorsPerRead;
|
||
|
||
sample = NULL;
|
||
currentLba = StartAddress;
|
||
sectorsPerRead = LARGEST_SECTORS_PER_READ;
|
||
|
||
TRY {
|
||
|
||
sample = malloc(RAW_SECTOR_SIZE*LARGEST_SECTORS_PER_READ);
|
||
if (sample == NULL) {
|
||
printf("DumpLba => No memory for sample\n");
|
||
LEAVE;
|
||
}
|
||
|
||
DebugPrint((3, "DumpLba => Largest Sectors Per Read: %d\n",
|
||
LARGEST_SECTORS_PER_READ));
|
||
|
||
while (sectorsPerRead != 0) {
|
||
|
||
while (currentLba + sectorsPerRead <= EndAddress) {
|
||
|
||
//
|
||
// do a read of sectorsPerRead sectors
|
||
//
|
||
|
||
info.DiskOffset.QuadPart = (ULONGLONG)(currentLba*(ULONGLONG)2048);
|
||
info.SectorCount = sectorsPerRead;
|
||
info.TrackMode = CDDA;
|
||
|
||
DebugPrint((3, "DumpLba => (%d) read from %8d to %8d:",
|
||
sectorsPerRead, currentLba,
|
||
currentLba + sectorsPerRead - 1));
|
||
|
||
if(!DeviceIoControl(CdromHandle,
|
||
IOCTL_CDROM_RAW_READ,
|
||
&info, // pointer to inputbuffer
|
||
sizeof(RAW_READ_INFO), // sizeof inputbuffer
|
||
sample, // pointer to outputbuffer
|
||
RAW_SECTOR_SIZE * sectorsPerRead, // sizeof outputbuffer
|
||
&bytesReturned, // pointer to number of bytes returned
|
||
FALSE // ???
|
||
)
|
||
) {
|
||
DWORD error = GetLastError();
|
||
|
||
if (error == ERROR_INVALID_PARAMETER) {
|
||
printf("ERROR_INVALID_PARAMTER for read size %x, "
|
||
"trying smaller transfer\n", sectorsPerRead);
|
||
break; // out of inner while() loop
|
||
} else {
|
||
printf("Error %d sending IOCTL_CDROM_RAW_READ for sector %d\n",
|
||
GetLastError(), currentLba);
|
||
LEAVE;
|
||
}
|
||
}
|
||
|
||
if (bytesReturned != RAW_SECTOR_SIZE * sectorsPerRead) {
|
||
|
||
printf("Only returned %d of %d bytes for read %d\n",
|
||
bytesReturned,
|
||
RAW_SECTOR_SIZE * sectorsPerRead,
|
||
currentLba
|
||
);
|
||
LEAVE;
|
||
}
|
||
|
||
//
|
||
// write that buffer out
|
||
//
|
||
DebugPrint((3, "DumpLba => (%d) write from %8d to %8d:",
|
||
sectorsPerRead, currentLba,
|
||
currentLba + sectorsPerRead - 1));
|
||
|
||
if (!WriteFile(OutHandle,
|
||
sample,
|
||
RAW_SECTOR_SIZE * sectorsPerRead,
|
||
&temp,
|
||
NULL)) {
|
||
|
||
printf("Unable to write data for read %d\n", currentLba);
|
||
LEAVE;
|
||
}
|
||
|
||
//
|
||
// increment currentLba
|
||
//
|
||
|
||
currentLba += sectorsPerRead;
|
||
|
||
} // currentLba + sectorsPerRead <= EndAddress
|
||
|
||
sectorsPerRead /= 2;
|
||
|
||
} // sectorsPerRead != 0
|
||
|
||
} FINALLY {
|
||
|
||
if (sample) {
|
||
free(sample);
|
||
}
|
||
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
PCDROM_TOC
|
||
CddumpGetToc(
|
||
HANDLE device
|
||
)
|
||
{
|
||
PCDROM_TOC toc;
|
||
ULONG bytesReturned;
|
||
ULONG errorValue;
|
||
|
||
toc = (PCDROM_TOC)malloc( sizeof(CDROM_TOC) );
|
||
if ( toc == NULL ) {
|
||
printf( "Insufficient memory\n" );
|
||
return NULL;
|
||
}
|
||
|
||
if( !DeviceIoControl( device,
|
||
IOCTL_CDROM_READ_TOC,
|
||
NULL, // pointer to inputbuffer
|
||
0, // sizeof inputbuffer
|
||
toc, // pointer to outputbuffer
|
||
sizeof(CDROM_TOC), // sizeof outputbuffer
|
||
&bytesReturned, // pointer to number of bytes returned
|
||
FALSE //
|
||
)
|
||
) {
|
||
errorValue = GetLastError();
|
||
printf( "Error %d sending IOCTL_CDROM_READ_TOC\n", errorValue );
|
||
free( toc );
|
||
return NULL;
|
||
}
|
||
return toc;
|
||
}
|
||
|
||
|
||
|
||
|
||
|