Source code of Windows XP (NT5)
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.0 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;
}