⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 loader_app.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:

    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 + -