📄 loader_app.cpp
字号:
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetASF\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
*pbASF = 0;
OS_SemGive(loaderData->loaderMutex);
return ( LOADER_SUCCESS );
}
/**
* Retrieves the region code mask.
*
* @param tLoader The loader handle.
* @param pbRegionMask region code mask will be returned through this pointer.
*/
LOADER_ERR LoaderGetRPC(LOADER_HANDLE tLoader, BYTE* pbRegionMask)
{
int win32LoaderResult;
LoaderData* loaderData;
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
assert ( pbRegionMask != NULL );
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetRPC\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
if ( loaderData->regionMask == 0 )
{
win32LoaderResult = loaderData->win32Loader->GetRegionCode(&loaderData->regionMask);
assert ( win32LoaderResult == WIN32LOADER_SUCCESS );
}
*pbRegionMask = loaderData->regionMask;
OS_SemGive(loaderData->loaderMutex);
return ( LOADER_SUCCESS );
}
/**
* Invalidate the authentication grant id.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
*/
LOADER_ERR LoaderInvalidateAgid(LOADER_HANDLE tLoader, BYTE bAgid)
{
LOADER_ERR loader_error;
LoaderData* loaderData;
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderInvalidateAgid\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->InvalidateAgid() != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Read CSS challenge data from the loader.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
* @param pbChallenge Challenge data returned through this pointer
*/
LOADER_ERR LoaderGetChallenge(LOADER_HANDLE tLoader, BYTE bAgid, BYTE pbChallenge[10])
{
LOADER_ERR loader_error;
LoaderData* loaderData;
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetChallenge\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->GetChallenge(pbChallenge) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Write CSS challenge data to the loader.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
* @param pbChallenge Challenge data.
*/
LOADER_ERR LoaderSendChallenge(LOADER_HANDLE tLoader, BYTE bAgid, BYTE pbChallenge[10])
{
LOADER_ERR loader_error;
LoaderData* loaderData;
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderSendChallenge\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->SendChallenge(pbChallenge) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Read CSS key from the loader.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
* @param pbKey Key data.
*/
LOADER_ERR LoaderGetKey1(LOADER_HANDLE tLoader, BYTE bAgid, BYTE pbKey[5])
{
LOADER_ERR loader_error;
LoaderData* loaderData;
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetKey1\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->GetBusKey(pbKey) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Write CSS key from the loader.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
* @param pbKey Key data.
*/
LOADER_ERR LoaderSendKey2(LOADER_HANDLE tLoader, BYTE bAgid, BYTE pbKey[5])
{
LOADER_ERR loader_error;
LoaderData* loaderData;
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderSendKey2\n"));
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->SendBusKey(pbKey) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Read CSS disc key from the loader.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
* @param pbRawKey The key data returned through this pointer.
*/
LOADER_ERR LoaderReadDiscKey(LOADER_HANDLE tLoader, BYTE bAgid, BYTE pbRawKey[2052])
{
LOADER_ERR loader_error;
LoaderData* loaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderReadDiscKey\n"));
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->GetDiskKey(pbRawKey) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Read CSS title key from the loader.
*
* @param tLoader The loader handle.
* @param bAgid The authentication grant id.
* @param ulLBA block.
* @param pbTitleKey The title key data returned through this pointer.
*/
LOADER_ERR LoaderReadTitleKey(LOADER_HANDLE tLoader, BYTE bAgid, ULONG ulLBA, BYTE pbTitleKey[5])
{
LOADER_ERR loader_error;
LoaderData* loaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderReadTitleKey\n"));
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
assert ( loaderData->loaderType == LOADER_TYPE_DVD );
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->GetTitleKey(pbTitleKey, ulLBA) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Read CD sector data from loader.
*
* @param tLoader The loader handle.
* @param ulLBA block number.
* @param ulNumBlocks Number of blocks to read.
* @param sectorType Type of sector to read.
* @param dataSelect Not used in this implementation
* @param pbData The sector data is returned through this pointer.
* @param ulBufSize The size of the buffer.
*/
LOADER_ERR LoaderCDRead(LOADER_HANDLE tLoader, ULONG ulLBA, ULONG ulNumBlocks, LOADER_CD_SECTOR_TYPE sectorType, LOADER_CD_DATA_SELECT dataSelect, BYTE *pbData, ULONG ulBufSize)
{
LOADER_ERR loader_error;
LoaderData* loaderData;
WIN32LOADER_CD_SECTOR_TYPE win32CDSectorType;
UNUSED_PARAM(dataSelect);
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderCDRead\n"));
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
switch ( sectorType )
{
case LOADER_CD_SECTOR_CDDA: win32CDSectorType = WIN32LOADER_CD_SECTOR_CDDA; break;
case LOADER_CD_SECTOR_MODE1: win32CDSectorType = WIN32LOADER_CD_SECTOR_MODE1; break;
case LOADER_CD_SECTOR_MODE2: win32CDSectorType = WIN32LOADER_CD_SECTOR_MODE2; break;
case LOADER_CD_SECTOR_MODE2_FORM1: win32CDSectorType = WIN32LOADER_CD_SECTOR_MODE2_FORM1; break;
case LOADER_CD_SECTOR_MODE2_FORM2: win32CDSectorType = WIN32LOADER_CD_SECTOR_MODE2_FORM2; break;
default:
return ( LOADER_FAILURE );
break;
}
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->ReadCD(pbData, ulBufSize, win32CDSectorType, ulLBA,ulNumBlocks) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Read CD TOC data from loader.
*
* @param tLoader The loader handle.
* @param format Type of TOC data to read.
* @param sessionNumber CD disc session number.
* @param readType Read type (LBN or MSF).
* @param pData The TOC data is returned through this pointer.
* @param size The size of the buffer.
*/
LOADER_ERR LoaderGetTOC(LOADER_HANDLE tLoader, LOADER_TOC_CMD format, BYTE sessionNumber, LOADER_TOC_ADDR_MODE readType, BYTE *pData, ULONG size)
{
LOADER_ERR loader_error;
LoaderData* loaderData;
WIN32LoaderTOCCommand win32LoaderTOCCommand;
int msf;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderGetTOC\n"));
switch ( format )
{
case WIN32LOADER_TOC_CMD_TOC: win32LoaderTOCCommand = WIN32LOADER_TOC_CMD_TOC; break;
case WIN32LOADER_TOC_CMD_SESSION_INFO: win32LoaderTOCCommand = WIN32LOADER_TOC_CMD_SESSION_INFO; break;
case WIN32LOADER_TOC_CMD_FULL_TOC: win32LoaderTOCCommand = WIN32LOADER_TOC_CMD_FULL_TOC; break;
case WIN32LOADER_TOC_CMD_CDTEXT: win32LoaderTOCCommand = WIN32LOADER_TOC_CMD_CDTEXT; break;
default:
return ( LOADER_FAILURE );
break;
}
switch ( readType )
{
case LOADER_TOC_LBN: msf = 0; break;
case LOADER_TOC_MSF: msf = 1; break;
default:
return ( LOADER_FAILURE );
break;
}
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->CDROMReadTOC(win32LoaderTOCCommand, msf, sessionNumber, pData, size) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
/**
* Retrieves the SubChannel information as detailed in Mt.Fuji section 17.26
*
* @param tLoader - The loader handle.
* @param fMSF - Requests format to be in MSF.
* @param fSubQ - Requests the Q-channel data
* @param bFormat - Format (0x01 retrieves current position)
* @param bTrack - Track number (use 0 if format is not track specific)
* @param pData - buffer for return
* @param ulSize - size of pData buffer
*/
LOADER_ERR LoaderReadSubChannel(LOADER_HANDLE tLoader, BOOLEAN fMSF, BOOLEAN fSubQ, BYTE bFormat, BYTE bTrack, BYTE *pData, ULONG size)
{
LOADER_ERR loader_error;
LoaderData* loaderData;
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderReadSubChannel\n"));
loaderData = (LoaderData*) tLoader;
assert ( tLoader != NULL );
OS_SemTake(loaderData->loaderMutex, OS_WAIT_FOREVER);
loader_error = LOADER_SUCCESS;
if ( loaderData->win32Loader->ReadSubChannel( fMSF, fSubQ, bFormat, bTrack, pData, size) != WIN32LOADER_SUCCESS )
{
loader_error = LOADER_FAILURE;
}
OS_SemGive(loaderData->loaderMutex);
return ( loader_error );
}
#define LINUX_MOUNT_PREFIX "/mnt/cdrom"
/**
* Remove the linux mount prefix from provided path.
*
* @param path[in] The path to search for the linux mount prefix.
* @return Pointer to the start of the path after the linux mount prefix.
*/
static const char* LoaderStripMountPrefix( const char* path )
{
DBGPRINT(DEBUG_ON(DEBUG_TRACE), ("LoaderStripMountPrefix\n"));
if ( strnicmp( path, LINUX_MOUNT_PREFIX, strlen(LINUX_MOUNT_PREFIX) ) == 0 )
{
return ( &path[strlen(LINUX_MOUNT_PREFIX)] );
}
return ( path );
}
/**
* Determine accessibility of a file or directory path on a disc.
* Only file accessibility is supported at this time.
*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -