📄 .#loader_win32.cpp.1.40
字号:
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
if ( pLoaderData->trayStatus == LOADER_TRAY_CLOSED )
{
return ( LOADER_SUCCESS );
}
pLoaderData->trayStatus = LOADER_TRAY_UNKNOWN;
// we should not have a device handle yet as tray is open
LOADER_ASSERT_ERROR( (pLoaderData->deviceHandle!=INVALID_HANDLE_VALUE), LOADER_FAILURE );
// attempt to open the volume
SetErrorMode( SEM_FAILCRITICALERRORS );
pLoaderData->sessionId = 0;
pLoaderData->deviceHandle = CreateFile(pLoaderData->driveName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,
NULL);
// if we could open the volume the tray is closed and ready
if ( pLoaderData->deviceHandle != INVALID_HANDLE_VALUE )
{
pLoaderData->trayStatus = LOADER_TRAY_CLOSED;
return ( LOADER_SUCCESS );
}
// Obtain a drive handle regardless if can read media
SetErrorMode( SEM_FAILCRITICALERRORS );
pLoaderData->deviceHandle = CreateFile(pLoaderData->driveName,
0,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
0,
NULL);
LOADER_ASSERT_ERROR( (pLoaderData->deviceHandle==INVALID_HANDLE_VALUE), LOADER_FAILURE );
win32Result = DeviceIoControl( pLoaderData->deviceHandle, // device handle
IOCTL_STORAGE_LOAD_MEDIA2, // operation
NULL, // must be NULL
0, // must be 0
NULL, // must be NULL
0, // must be 0
&outputByteCount, // output byte count
NULL); // overlapped structure for async operations
// close generic handle
CloseHandle ( pLoaderData->deviceHandle );
pLoaderData->deviceHandle = INVALID_HANDLE_VALUE;
if ( win32Result == 0x00 )
{
MessageBox(NULL,"Please close optical drive tray","Error: unable to close optical drive tray", MB_OK | MB_ICONERROR);
}
// assume tray is closed
pLoaderData->trayStatus = LOADER_TRAY_CLOSED;
return ( LOADER_SUCCESS );
}
/**
*******************************************************************************
* LoaderChangeLayer
*
* @brief Select the specified disc layer.
*
* @param loaderHandle Loader handle.
* @param layer New layer.
*
* @return Loader error
*******************************************************************************/
LOADER_ERR LoaderChangeLayer(LOADER_HANDLE loaderHandle, BYTE layer)
{
LoaderData* pLoaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderChangeLayer\n"));
LOADER_ASSERT_ERROR( (layer<0), LOADER_INVALID_PARAMETER );
LOADER_ASSERT_ERROR( (layer>=LOADER_MAX_LAYERS), LOADER_INVALID_PARAMETER );
LOADER_RAISE_ERROR( LoaderValidateHandle( loaderHandle ));
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
return (LOADER_SUCCESS);
}
/**
*******************************************************************************
* LoaderGetStatus
*
* @brief Retrieves the current status of the media storage device.
*
* @param loaderHandle Loader handle.
* @param pStatus Status will be returned through this pointer.
*
* @return Loader error
*******************************************************************************/
LOADER_ERR LoaderGetStatus(LOADER_HANDLE loaderHandle, LOADER_STATUS* pStatus)
{
LoaderData* pLoaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetStatus\n"));
LOADER_ASSERT_ERROR( (pStatus==NULL), LOADER_INVALID_PARAMETER );
LOADER_RAISE_ERROR( LoaderValidateHandle( loaderHandle ));
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
pStatus->ulTrayStatus = pLoaderData->trayStatus;
pStatus->ulLoaderBusy = 0;
return ( LOADER_SUCCESS );
}
/**
*******************************************************************************
* LoaderStart
*
* @brief Detection of the disc type
*
* @param loaderHandle Loader handle.
*
* @return Loader error
*******************************************************************************/
LOADER_ERR LoaderStart(LOADER_HANDLE loaderHandle)
{
LoaderData* pLoaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderStart\n"));
LOADER_RAISE_ERROR( LoaderValidateHandle( loaderHandle ));
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
return ( LOADER_SUCCESS );
}
/**
*******************************************************************************
* LoaderStop
*
* @brief Stops the disc, and cleans up any parameters which may have become obsolete by the stopping of the disc.
*
* @param loaderHandle Loader handle.
*
* @return Loader error
*******************************************************************************/
LOADER_ERR LoaderStop(LOADER_HANDLE loaderHandle)
{
LoaderData* pLoaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderStop\n"));
LOADER_RAISE_ERROR( LoaderValidateHandle( loaderHandle ));
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
return ( LOADER_SUCCESS );
}
/**
*******************************************************************************
* LoaderTestUnitReady
*
* @brief Checks if the unit is ready.
*
* @param loaderHandle Loader handle.
* @param pfReady Ready status will be returned through this pointer.
*
* @return Loader error
*
* @note If the unit is not ready, pfReady is set to false and the function returns.
* @note If the unit is ready, pfReady is set to true and the loader startup is completed.
*******************************************************************************/
LOADER_ERR LoaderTestUnitReady(LOADER_HANDLE loaderHandle, BOOLEAN* pfReady)
{
LoaderData* pLoaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderTestUnitReady\n"));
LOADER_ASSERT_ERROR( (pfReady==NULL), LOADER_INVALID_PARAMETER );
LOADER_RAISE_ERROR( LoaderValidateHandle( loaderHandle ));
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
*pfReady = TRUE;
return ( LOADER_SUCCESS );
}
/**
*******************************************************************************
* LoaderGetMediaData
*
* @brief Determines media type for all layers
*
* @param loaderHandle Loader handle.
* @param pMediaData Media data will be returned through this pointer.
*
* @return Loader error
*******************************************************************************/
LOADER_ERR LoaderGetMediaData(LOADER_HANDLE loaderHandle, LOADER_MEDIA_DATA* pMediaData)
{
LoaderData* pLoaderData;
BOOL win32Result;
DWORD outputByteCount;
DVD_READ_STRUCTURE dvdReadStructure;
DVD_LAYER_DESCRIPTOR dvdLayerDescriptor;
CDROM_DISK_DATA cdromDiskData;
CDROM_TOC cdromTOC;
unsigned int index;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetMediaData\n"));
LOADER_ASSERT_ERROR( (pMediaData==NULL), LOADER_INVALID_PARAMETER );
LOADER_RAISE_ERROR( LoaderValidateHandle( loaderHandle ));
pLoaderData = (LoaderData*) loaderHandle;
AutoMutex(&pLoaderData->mutex);
// Initialize structure
pMediaData->eMediaType = LOADER_MEDIA_TYPE_UNKNOWN;
pMediaData->ulMaxReadSpeed = 0;
pMediaData->bNumLayers = 0;
for ( index = 0; index < LOADER_MAX_LAYERS; index++ )
{
pMediaData->eLayerMediaType[index] = LOADER_MEDIA_TYPE_UNKNOWN;
}
// If we couldn't mount the volume there is no disc
if (pLoaderData->deviceHandle == INVALID_HANDLE_VALUE )
{
pMediaData->eMediaType = LOADER_MEDIA_TYPE_NODISK;
return ( LOADER_SUCCESS );
}
// Attempt to read DVD structure first
memset(&dvdReadStructure, 0, sizeof(dvdReadStructure));
memset(&dvdLayerDescriptor, 0, sizeof(dvdLayerDescriptor));
dvdReadStructure.Format = DvdPhysicalDescriptor;
win32Result = DeviceIoControl( pLoaderData->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 )
{
switch ( dvdLayerDescriptor.BookType )
{
case 0 : pMediaData->eMediaType = LOADER_MEDIA_TYPE_DVD_ROM; break;
case 1 : pMediaData->eMediaType = LOADER_MEDIA_TYPE_DVD_RAM; break;
case 2 : pMediaData->eMediaType = LOADER_MEDIA_TYPE_DVD_R; break;
case 3 : pMediaData->eMediaType = LOADER_MEDIA_TYPE_DVD_RW; break;
case 9 : pMediaData->eMediaType = LOADER_MEDIA_TYPE_DVD_PLUS_RW; break;
}
pMediaData->bNumLayers = dvdLayerDescriptor.NumberOfLayers + 1;
pLoaderData->trayStatus = LOADER_TRAY_CLOSED;
return ( LOADER_SUCCESS );
}
// Attempt to read CD structure
memset(&cdromDiskData, 0, sizeof(cdromDiskData));
memset(&cdromTOC, 0, sizeof(cdromTOC));
win32Result = DeviceIoControl( pLoaderData->deviceHandle, // device handle
IOCTL_CDROM_DISK_TYPE, // operation
NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -