📄 loader_win32.cpp
字号:
* @param encrypted pointer to receive encrypted flag (true/false)
*
* @return WIN32LOADER_SUCCESS if successful, otherwise WIN32LOADER_FAILURE
*******************************************************************************/
int WIN32Loader::GetDVDDiscInfo ( DiscType* discType, bool* encrypted )
{
BOOL win32Result;
DWORD outputByteCount;
DVD_READ_STRUCTURE dvdReadStructure;
DVD_LAYER_DESCRIPTOR dvdLayerDescriptor;
DbgAssert ( data != NULL );
*discType = DISC_TYPE_NO_DISC;
*encrypted = FALSE;
if ( data->deviceHandle == INVALID_HANDLE_VALUE )
{
return ( WIN32LOADER_FAILURE );
}
memset(&dvdReadStructure, 0, sizeof(dvdReadStructure));
memset(&dvdLayerDescriptor, 0, sizeof(dvdLayerDescriptor));
dvdReadStructure.Format = DvdPhysicalDescriptor;
win32Result = DeviceIoControl( data->deviceHandle, // device handle
IOCTL_DVD_READ_STRUCTURE, // operation
&dvdReadStructure,
sizeof(dvdReadStructure),
&dvdLayerDescriptor,
sizeof(dvdLayerDescriptor),
&outputByteCount, // output byte count
NULL); // overlapped structure for async operations
if (win32Result == 0x00)
{
//DbgPrint(("WIN32Loader::GetDVDDiscInfo: ERROR %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
switch ( dvdLayerDescriptor.BookType )
{
case 0 : *discType = DISC_TYPE_DVD_ROM; break;
case 1 : *discType = DISC_TYPE_DVD_RAM; break;
case 2 : *discType = DISC_TYPE_DVD_R; break;
case 3 : *discType = DISC_TYPE_DVD_MINUS_RW; break;
case 9 : *discType = DISC_TYPE_DVD_PLUS_RW; break;
}
return ( IsDVDDiscEncrypted( encrypted ));
}
/**
*******************************************************************************
* WIN32Loader::IsDVDDiscEncrypted Determine if DVD media is encrypted
*
* @param encrypted pointer to receive encrypted flag (true/false)
*
* @return WIN32LOADER_SUCCESS if successful, otherwise WIN32LOADER_FAILURE
*******************************************************************************/
int WIN32Loader::IsDVDDiscEncrypted ( bool* encrypted )
{
BOOL win32Result;
DWORD outputByteCount;
BYTE copyProtectionDescriptorBuffer[sizeof(DVD_COPYRIGHT_DESCRIPTOR) + sizeof(DVD_DESCRIPTOR_HEADER)];
DVD_COPYRIGHT_DESCRIPTOR* pDvdCopyrightDescriptor = NULL;
DVD_READ_STRUCTURE dvdReadStructure;
DbgAssert ( data != NULL );
*encrypted = FALSE;
if ( data->deviceHandle == INVALID_HANDLE_VALUE )
{
return ( WIN32LOADER_FAILURE );
}
memset(&dvdReadStructure, 0, sizeof(dvdReadStructure));
dvdReadStructure.Format = DvdCopyrightDescriptor;
win32Result = DeviceIoControl( data->deviceHandle, // device handle
IOCTL_DVD_READ_STRUCTURE, // operation
&dvdReadStructure,
sizeof(dvdReadStructure),
©ProtectionDescriptorBuffer,
sizeof(copyProtectionDescriptorBuffer),
&outputByteCount, // output byte count
NULL); // overlapped structure for async operations
if (win32Result == 0x00)
{
DbgPrint(("WIN32Loader::IsDVDDiscEncrypted: ERROR %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
pDvdCopyrightDescriptor = (DVD_COPYRIGHT_DESCRIPTOR *) &(copyProtectionDescriptorBuffer[sizeof(DVD_DESCRIPTOR_HEADER)]);
*encrypted = ( pDvdCopyrightDescriptor->CopyrightProtectionType != 0);
return ( WIN32LOADER_SUCCESS );
}
/**
*******************************************************************************
* WIN32Loader::GetCDDiscInfo Determine type of CD media
*
* @param discType pointer to receive disc type
*
* @return WIN32LOADER_SUCCESS if successful, otherwise WIN32LOADER_FAILURE
*******************************************************************************/
int WIN32Loader::GetCDDiscInfo ( DiscType* discType )
{
BOOL win32Result;
DWORD outputByteCount;
CDROM_DISK_DATA cdromDiskData;
CDROM_TOC cdromTOC;
DbgAssert ( data != NULL );
*discType = DISC_TYPE_NO_DISC;
if ( data->deviceHandle == INVALID_HANDLE_VALUE )
{
return ( WIN32LOADER_FAILURE );
}
memset(&cdromDiskData, 0, sizeof(cdromDiskData));
memset(&cdromTOC, 0, sizeof(cdromTOC));
win32Result = DeviceIoControl( data->deviceHandle, // device handle
IOCTL_CDROM_DISK_TYPE, // operation
NULL,
NULL,
&cdromDiskData,
sizeof(cdromDiskData),
&outputByteCount, // output byte count
NULL); // overlapped structure for async operations
if (win32Result == 0x00)
{
// DbgPrint(("WIN32Loader::GetCDDiscInfo: ERROR %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
if ( cdromDiskData.DiskData == CDROM_DISK_AUDIO_TRACK )
{
*discType = DISC_TYPE_CDDA;
}
else
{
*discType = DISC_TYPE_CDROM_XA;
}
return ( WIN32LOADER_SUCCESS );
}
/**
*******************************************************************************
* WIN32Loader::ReadDVD Read DVD sectors
*
* @param pbData
* @param ulLBA
* @param ulNumBlocks
*
* @return WIN32LOADER_SUCCESS if successful, otherwise WIN32LOADER_FAILURE
*******************************************************************************/
int WIN32Loader::ReadDVD( unsigned char* pbData, unsigned long int ulLBA, unsigned long int ulNumBlocks )
{
DWORD dwFilePointerLowPart;
long lHighPart;
DWORD numberOfBytesRead;
BOOL win32Result;
DbgAssert ( data != NULL );
if ( data->deviceHandle == INVALID_HANDLE_VALUE )
{
return ( WIN32LOADER_FAILURE );
}
lHighPart = ulLBA >> 21;
dwFilePointerLowPart = ::SetFilePointer (data->deviceHandle, ulLBA << 11, &lHighPart, FILE_BEGIN);
if (( dwFilePointerLowPart == 0xFFFFFFFF ) && ( GetLastError() != NO_ERROR) )
{
DbgPrint(("WIN32Loader::ReadDVD: SetFilePointer failed %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
numberOfBytesRead = 0;
win32Result = ::ReadFile(data->deviceHandle, pbData, ulNumBlocks << 11, &numberOfBytesRead, NULL);
if (win32Result == 0x00)
{
DbgPrint(("WIN32Loader::ReadDVD: ReadFile failed %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
if ( numberOfBytesRead != (ulNumBlocks << 11))
{
DbgPrint(("WIN32Loader::ReadDVD: ReadFile incomplete read %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
return ( WIN32LOADER_SUCCESS );
}
/**
*******************************************************************************
* WIN32Loader::ReadCD Read CD sectors
*
* @param pbData
* @param bufferSize
* @param sectorType
* @param ulLBA
* @param ulNumBlocks
*
* @return WIN32LOADER_SUCCESS if successful, otherwise WIN32LOADER_FAILURE
*******************************************************************************/
int WIN32Loader::ReadCD( unsigned char* pbData, unsigned long int bufferSize, WIN32LOADER_CD_SECTOR_TYPE sectorType, unsigned long int ulLBA, unsigned long int ulNumBlocks )
{
BOOL win32Result;
DWORD outputByteCount;
DWORD dwFilePointerLowPart;
DWORD numberOfBytesRead;
long lHighPart;
DWORD index;
RAW_READ_INFO rawReadInfo;
DbgAssert ( data != NULL );
if ( data->deviceHandle == INVALID_HANDLE_VALUE )
{
return ( WIN32LOADER_FAILURE );
}
numberOfBytesRead = 0;
switch ( sectorType )
{
case WIN32LOADER_CD_SECTOR_CDDA:
memset(&rawReadInfo,0,sizeof(rawReadInfo));
for (index=0; index < ulNumBlocks; index++)
{
rawReadInfo.DiskOffset.QuadPart = (ulLBA + index)*2048;
rawReadInfo.SectorCount = 1;
rawReadInfo.TrackMode = CDDA;
win32Result = DeviceIoControl( data->deviceHandle,
IOCTL_CDROM_RAW_READ,
&rawReadInfo,
sizeof(rawReadInfo),
pbData + (index * CD_SECTOR_SIZE),
bufferSize-numberOfBytesRead,
&outputByteCount,
NULL);
if (win32Result == 0x00)
{
DbgPrint(("WIN32Loader::ReadCD: ERROR %d\n", GetLastError() ));
data->sessionId = 0;
return ( WIN32LOADER_FAILURE );
}
numberOfBytesRead += CD_SECTOR_SIZE;
}
break;
case WIN32LOADER_CD_SECTOR_MODE1:
case WIN32LOADER_CD_SECTOR_MODE2_FORM1:
lHighPart = ulLBA >> 21;
dwFilePointerLowPart = ::SetFilePointer (data->deviceHandle, ulLBA << 11, &lHighPart, FILE_BEGIN);
if (( dwFilePointerLowPart == 0xFFFFFFFF ) && ( GetLastError() != NO_ERROR) )
{
DbgPrint(("WIN32Loader::ReadDVD: SetFilePointer failed %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
win32Result = ::ReadFile(data->deviceHandle, pbData, ulNumBlocks << 11, &numberOfBytesRead, NULL);
if (win32Result == 0x00)
{
printf("WIN32Loader::ReadCD: ReadFile failed %d\n", GetLastError() );
return ( WIN32LOADER_FAILURE );
}
if ( numberOfBytesRead != (ulNumBlocks << 11))
{
DbgPrint(("WIN32Loader::ReadCD: ReadFile incomplete read %d\n", GetLastError() ));
return ( WIN32LOADER_FAILURE );
}
break;
case WIN32LOADER_CD_SECTOR_MODE2:
case WIN32LOADER_CD_SECTOR_MODE2_FORM2:
memset(&rawReadInfo,0,sizeof(rawReadInfo));
for (index=0; index < ulNumBlocks; index++)
{
rawReadInfo.DiskOffset.QuadPart = (ulLBA + index)*2048;
rawReadInfo.SectorCount = 1;
switch ( sectorType )
{
case WIN32LOADER_CD_SECTOR_MODE2 : rawReadInfo.TrackMode = YellowMode2; break;
case WIN32LOADER_CD_SECTOR_MODE2_FORM2 : rawReadInfo.TrackMode = XAForm2; break;
}
win32Result = DeviceIoControl( data->deviceHandle, // device handle
IOCTL_CDROM_RAW_READ, // operation
&rawReadInfo,
sizeof(rawReadInfo),
pbData + (index * (CD_SECTOR_SIZE-12)),
bufferSize-numberOfBytesRead,
&outputByteCount, // output byte count
NULL); // overlapped structure for async operations
if (win32Result == 0x00)
{
DbgPrint(("WIN32Loader::ReadCD: ERROR %d\n", GetLastError() ));
data->sessionId = 0;
return ( WIN32LOADER_FAILURE );
}
memmove( pbData + (index * (CD_SECTOR_SIZE-12)), pbData + (index * (CD_SECTOR_SIZE-12)) + 12, CD_SECTOR_SIZE-12 );
numberOfBytesRead += (CD_SECTOR_SIZE-12);
}
break;
}
if ( numberOfBytesRead > bufferSize )
{
DbgPrint(("WIN32Loader::ReadCD: ERROR Buffer Overrun\n" ));
DbgAssert( true == false );
}
return ( WIN32LOADER_SUCCESS );
}
/**
*******************************************************************************
* WIN32Loader::CDROMReadTOC Read CD Table Of Contents
*
* @return WIN32LOADER_SUCCESS if successful, otherwise WIN32LOADER_FAILURE
*******************************************************************************/
int WIN32Loader::CDROMReadTOC( WIN32LoaderTOCCommand format, int msf, unsigned char requestedSession, unsigned char* buffer, unsigned long int bufferSize )
{
BOOL win32Result;
DWORD outputByteCount = 0;
CDROM_READ_TOC_EX cdromReadTocEx;
BYTE tocData[1024];
CDROM_TOC_FULL_TOC_DATA* cdromTocFullTocData = (CDROM_TOC_FULL_TOC_DATA*)tocData;
CDROM_TOC_FULL_TOC_DATA_BLOCK* descriptors = cdromTocFullTocData->Descriptors;
DbgAssert ( data != NULL );
DbgAssert ( (msf == 0) || (msf == 1) );
if ( data->deviceHandle == INVALID_HANDLE_VALUE )
{
return ( WIN32LOADER_FAILURE );
}
memset(&cdromReadTocEx,0,sizeof(cdromReadTocEx));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -