You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.2 KiB
185 lines
5.2 KiB
/*++
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
|