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

📄 loader_win32.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
 *  @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),             
                                    &copyProtectionDescriptorBuffer,                       
                                    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 + -