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

📄 cdaudio.cpp

📁 这是运行在windows ce 4.2 版本下的关于硬盘加载的驱动程序
💻 CPP
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include "atamain.h"

DWORD CDisk::ControlAudio(PIOREQ pIOReq)
{
    ATAPI_COMMAND_PACKET     CmdPkt;
    DWORD dwError = ERROR_SUCCESS;
    SGX_BUF SgBuf;
    DWORD dwRet;
    
    DEBUGMSG(ZONE_IOCTL, (TEXT("ATAPI:PlayAudioMSF - Entered.\r\n")));

    memset( (void *)&CmdPkt, 0, sizeof( CmdPkt));

    switch(pIOReq->dwCode) {
        case IOCTL_CDROM_PLAY_AUDIO_MSF:
            {
                PCDROM_PLAY_AUDIO_MSF    pPlayMSF;
                pPlayMSF = (PCDROM_PLAY_AUDIO_MSF) pIOReq->pInBuf;
                if (!pPlayMSF || (sizeof(CDROM_PLAY_AUDIO_MSF) > pIOReq->dwInBufSize)) {
                    dwError = ERROR_BAD_ARGUMENTS;
                    break;
                }    
                CmdPkt.Opcode = ATAPI_PACKET_CMD_PLAY_MSF;
                CmdPkt.Byte_3 = pPlayMSF->StartingM;
                CmdPkt.Byte_4 = pPlayMSF->StartingS;
                CmdPkt.Byte_5 = pPlayMSF->StartingF;
                CmdPkt.Byte_6 = pPlayMSF->EndingM;
                CmdPkt.Byte_7 = pPlayMSF->EndingS;
                CmdPkt.Byte_8 = pPlayMSF->EndingF;
            }    
            break;
        case IOCTL_CDROM_SEEK_AUDIO_MSF:    
            {
                CDROM_SEEK_AUDIO_MSF *pSeekMSF = (CDROM_SEEK_AUDIO_MSF *) pIOReq->pInBuf;
                DWORD dwLBAAddr;
                if (!pSeekMSF || (sizeof(CDROM_SEEK_AUDIO_MSF) > pIOReq->dwInBufSize)) {
                    dwError = ERROR_BAD_ARGUMENTS;
                    break;
                }    
                dwLBAAddr = CDROM_MSFCOMP_TO_LBA( pSeekMSF->M, pSeekMSF->S, pSeekMSF->F);
                CmdPkt.Opcode = ATAPI_PACKET_CMD_SEEK;
                CmdPkt.Byte_2 = LBA_MSB(&dwLBAAddr);
                CmdPkt.Byte_3 = LBA_3rdLSB(&dwLBAAddr);
                CmdPkt.Byte_4 = LBA_2ndLSB(&dwLBAAddr);
                CmdPkt.Byte_5 = LBA_LSB(&dwLBAAddr);
            }
            break;    
        case IOCTL_CDROM_SCAN_AUDIO:
            {
                CDROM_SCAN_AUDIO *pScan = (CDROM_SCAN_AUDIO *) pIOReq->pInBuf;
                if (!pScan || (sizeof(CDROM_SCAN_AUDIO) > pIOReq->dwInBufSize)) {
                    dwError = ERROR_BAD_ARGUMENTS;
                    break;
                }    
                CmdPkt.Opcode = ATAPI_PACKET_CMD_SCAN_AUDIO;
                CmdPkt.Byte_1 = (pScan->Direction << 4) & 0x10;
                CmdPkt.Byte_2 = pScan->Address[0];
                CmdPkt.Byte_3 = pScan->Address[1];
                CmdPkt.Byte_4 = pScan->Address[2];
                CmdPkt.Byte_5 = pScan->Address[3];
                CmdPkt.Byte_9 = pScan->AddressType << 6;
            }
            break;
        case IOCTL_CDROM_STOP_AUDIO:
            CmdPkt.Opcode = ATAPI_PACKET_CMD_STOP_PLAY_SCAN;
            break;
        case IOCTL_CDROM_PAUSE_AUDIO:
            CmdPkt.Opcode = ATAPI_PACKET_CMD_PAUSE_RESUME;
            CmdPkt.Byte_8 = 0;
            break;
        case IOCTL_CDROM_RESUME_AUDIO:
            CmdPkt.Opcode = ATAPI_PACKET_CMD_PAUSE_RESUME;
            CmdPkt.Byte_8 = 1;
            break;
    }

    if (ERROR_SUCCESS == dwError) {
        SgBuf.sb_len = 0;
        SgBuf.sb_buf = NULL;

        if (AtapiSendCommand(&CmdPkt)) {
            if (!AtapiReceiveData(&SgBuf, 1, &dwRet)) {
                DEBUGMSG( ZONE_ERROR|ZONE_CDROM, (TEXT("ATAPI::PlayAudioMSF failed on receive\r\n")));
                dwError = ERROR_READ_FAULT;
            }
        } else {
            // TODO: AtaCheckError()
          return ERROR_GEN_FAILURE;
        }    
    }    
    
    return dwError;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -