|
|
/*++
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; }
|