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

📄 .#loader_win32.cpp.1.40

📁 这是DVD中伺服部分的核心代码
💻 40
📖 第 1 页 / 共 3 页
字号:
    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 + -