亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cd.c

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? C
字號:
//
// 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.
//
/*++

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

Module Name:

    cd.c

Abstract:

    bInterfaceSubClass 0x02, SFF8020i/ATAPI CD-ROM

Notes:

    CDDA not supported

--*/

#include <ntcompat.h>
#include <pkfuncs.h>
#include "usbmsc.h"
#include "scsi2.h"

DWORD
ScsiCDRead(
    PSCSI_DEVICE pDevice,
    PCDROM_READ  pReadInfo,
    PULONG       pdwBytesTransferred
    )
{
    DWORD   dwErr, i;
    DWORD   dwBytesTransferred = 0;
    UCHAR   RequestBuffer[sizeof(SG_REQ) + (sizeof(SG_BUF)*(MAX_SG_BUF-1))] = {0};
    PSG_REQ pSgReq = (PSG_REQ)RequestBuffer;

    DEBUGMSG(ZONE_CDROM,(TEXT("USBMSC>ScsiCDRead\r\n")));

    if ( !pReadInfo || !pdwBytesTransferred ||
         !pReadInfo->TransferLength ||
         !pReadInfo->sgcount || pReadInfo->sgcount > MAX_SG_BUF)
    {
        return ERROR_INVALID_PARAMETER;
    }

    // TrackMode is TBD
    if ( CDDA == pReadInfo->TrackMode ||
         pReadInfo->StartAddr.Mode != CDROM_ADDR_LBA ||
         pReadInfo->bRawMode )
    {
        return ERROR_NOT_SUPPORTED;
    }

    // Convert CDROM_READ to SG_REQ
    pSgReq->sr_start    = pReadInfo->StartAddr.Address.lba;
    pSgReq->sr_num_sec  = pReadInfo->TransferLength;
    pSgReq->sr_num_sg   = pReadInfo->sgcount;
    for (i = 0; i < pSgReq->sr_num_sg; i++) {
        pSgReq->sr_sglist[i].sb_buf = pReadInfo->sglist[i].sb_buf;
        pSgReq->sr_sglist[i].sb_len = pReadInfo->sglist[i].sb_len;
    }

    *pdwBytesTransferred = ScsiRWSG(pDevice, pSgReq, pDevice->Lun, TRUE);
    dwErr = pSgReq->sr_status;
    DEBUGMSG(ZONE_CDROM,(TEXT("USBMSC<ScsiCDRead:%d\r\n"),dwErr));
    return dwErr;
}

DWORD 
ScsiCDAudio(
    PSCSI_DEVICE pDevice,
    DWORD        Ioctl,
    PUCHAR       pInBuf,
    DWORD        InBufLen,
    PUCHAR       pOutBuf,
    DWORD        OutBufLen,
    PDWORD       pdwBytesTransferred
    )
{
    TRANSPORT_COMMAND tCommand = {0};
    TRANSPORT_DATA    tData = {0};
    UCHAR             bCDB[MAX_CDB];
    DWORD dwErr;

    DEBUGMSG(ZONE_CDROM,(TEXT("USBDISK6>ScsiCDAudio\r\n")));
    dwErr = AcquireRemoveLock(&pDevice->RemoveLock, NULL);
    if (ERROR_SUCCESS != dwErr) {
        return dwErr;
    }
    tCommand.Flags = DATA_OUT;
    tCommand.Timeout = pDevice->Timeouts.ScsiCommandTimeout;
    tCommand.Length = USBMSC_SUBCLASS_SCSI == pDevice->DiskSubClass ?
                      SCSI_CDB_6 : UFI_CDB;
    tCommand.CommandBlock = bCDB;
    tCommand.dwLun=pDevice->Lun;

    memset( bCDB, 0, sizeof(bCDB));
    ASSERT(pDevice->Lun <= 0x7);
    bCDB[1] = ((pDevice->Lun & 0x7) << 5);

    switch(Ioctl) {
        case IOCTL_CDROM_READ_TOC:
        {
            DEBUGMSG(ZONE_CDROM, (TEXT("IOCTL_CDROM_READ_TOC\r\n")));
            if ( !pOutBuf || OutBufLen < sizeof(CDROM_TOC) ) {
                dwErr = ERROR_INVALID_PARAMETER;
            }
            else {
                tCommand.Flags = DATA_IN;
                tData.TransferLength = 0;
                tData.RequestLength = OutBufLen;
                tData.DataBlock = pOutBuf;
                bCDB[0] = SCSI_CD_READ_TOC;
                bCDB[1] |= 0x2; // use MSF format
                // bCDB[6] = 0; // starting track
                bCDB[7] = (BYTE)((sizeof(CDROM_TOC)>> 8) &0x0FF);
                bCDB[8] = (BYTE)(sizeof(CDROM_TOC) &0x0FF); // 24
            }
        }
        break;
        case IOCTL_CDROM_PLAY_AUDIO:
            {
                PCDROM_READ pCdRead;
                DEBUGMSG(ZONE_CDROM, (TEXT("IOCTL_CDROM_PLAY_AUDIO\r\n")));
                if (!pInBuf || InBufLen < sizeof(CDROM_READ)) {
                    dwErr = ERROR_INVALID_PARAMETER;
                }
                else {
                    pCdRead = (PCDROM_READ)pInBuf;
                    bCDB[0] = SCSI_CD_PLAY10;
                    ASSERT(pCdRead->StartAddr.Mode == CDROM_ADDR_LBA);
                    // Logical Block Address
                    SetDWORD(&bCDB[2], pCdRead->StartAddr.Address.lba);
                    // TransferLength (in sectors)
                    SetWORD(&bCDB[7], (WORD)pCdRead->TransferLength);
                }
            }
            break;
        case IOCTL_CDROM_PLAY_AUDIO_MSF:
            {
                PCDROM_PLAY_AUDIO_MSF pPlayMSF;
                DEBUGMSG(ZONE_CDROM, (TEXT("IOCTL_CDROM_PLAY_AUDIO_MSF\r\n")));
                if (!pInBuf || InBufLen < sizeof(CDROM_PLAY_AUDIO_MSF)) {
                    dwErr = ERROR_INVALID_PARAMETER;
                }
                else {
                    pPlayMSF = (PCDROM_PLAY_AUDIO_MSF)pInBuf;
                    bCDB[0] = SCSI_CD_PLAY_MSF;
                    bCDB[3] = pPlayMSF->StartingM;
                    bCDB[4] = pPlayMSF->StartingS;
                    bCDB[5] = pPlayMSF->StartingF;
                    bCDB[6] = pPlayMSF->EndingM;
                    bCDB[7] = pPlayMSF->EndingS;
                    bCDB[8] = pPlayMSF->EndingF;
                }
            }
            break;
        case IOCTL_CDROM_SEEK_AUDIO_MSF:
            DEBUGMSG(ZONE_ERR,(TEXT("IOCTL_CDROM_SEEK_AUDIO_MSF\r\n")));
            dwErr = ERROR_NOT_SUPPORTED;
            break;
        case IOCTL_CDROM_STOP_AUDIO:
            DEBUGMSG(ZONE_CDROM,(TEXT("IOCTL_CDROM_STOP_AUDIO\r\n")));
            bCDB[0] = SCSI_CD_STOP;
            break;
        case IOCTL_CDROM_PAUSE_AUDIO:
            DEBUGMSG(ZONE_CDROM,(TEXT("IOCTL_CDROM_PAUSE_AUDIO\r\n")));
            bCDB[0] = SCSI_CD_PAUSE_RESUME;
            bCDB[8] = 0;
            break;
        case IOCTL_CDROM_RESUME_AUDIO:
            DEBUGMSG(ZONE_CDROM,(TEXT("IOCTL_CDROM_RESUME_AUDIO\r\n")));
            bCDB[0] = SCSI_CD_PAUSE_RESUME;
            bCDB[8] = 1;
            break;
        default:
            DEBUGMSG(ZONE_ERR,(TEXT("Unsupported CDDA command(0x%x)\r\n"), Ioctl));
            dwErr = ERROR_NOT_SUPPORTED;
            break;
    }
    if (ERROR_SUCCESS == dwErr) {
        dwErr = UsbsDataTransfer(pDevice->hUsbTransport,
                                 &tCommand,
                                 &tData);
        if ( dwErr != ERROR_SUCCESS ) {
            dwErr = ScsiGetSenseData( pDevice, pDevice->Lun );
            if (ERROR_SUCCESS == dwErr) {
                dwErr = ERROR_GEN_FAILURE;
            }
            DEBUGMSG(ZONE_ERR,(TEXT("USBDISK6!ScsiCDAudio: CD-ROM command failed (%d)\r\n"), dwErr));
            SetLastError(dwErr);
        }
        if (tData.RequestLength != tData.TransferLength) {
            DEBUGMSG(ZONE_ERR,(TEXT("USBDISK6!ScsiCDAudio: Transfer length (%d) request length (%d) mismatch\r\n"), tData.TransferLength, tData.RequestLength));
            dwErr = ERROR_GEN_FAILURE;
        }
        if (pdwBytesTransferred) {
            *pdwBytesTransferred = tData.TransferLength;
        }
    }

    ReleaseRemoveLock(&pDevice->RemoveLock, NULL);
    DEBUGMSG(ZONE_CDROM,(TEXT("USBDISK6<ScsiCDAudio:%d\r\n"), dwErr));
    return dwErr;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
综合av第一页| 欧美成人艳星乳罩| 波多野结衣中文字幕一区 | 日韩欧美国产高清| 欧美日韩久久一区| 51精品秘密在线观看| 欧美精品一二三四| 日韩欧美在线1卡| 欧美一二三区在线| 国产午夜亚洲精品午夜鲁丝片| 精品福利一区二区三区免费视频| 久久看人人爽人人| 国产精品午夜久久| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲精品国产无套在线观| 亚洲一区二区在线观看视频| 亚洲欧美日韩一区二区三区在线观看| 亚洲欧洲综合另类在线| 亚洲一二三区不卡| 麻豆专区一区二区三区四区五区| 国产精品主播直播| 91一区在线观看| 欧美丰满一区二区免费视频| 国产午夜亚洲精品午夜鲁丝片| 日韩美女视频19| 天堂va蜜桃一区二区三区 | 一区二区三区四区中文字幕| 亚洲超丰满肉感bbw| 狠狠色伊人亚洲综合成人| 不卡av在线免费观看| 欧美日本在线观看| 国产午夜精品一区二区| 午夜一区二区三区视频| 国产一区91精品张津瑜| 欧美在线视频你懂得| 538prom精品视频线放| 国产精品色呦呦| 日产国产欧美视频一区精品| 国产精品系列在线观看| 欧美性生活久久| 欧美国产禁国产网站cc| 亚洲成av人在线观看| 成人高清免费在线播放| 日韩欧美激情四射| 亚洲最大色网站| 成人美女视频在线观看18| 日韩欧美国产综合一区| 一区二区三区在线免费播放 | 亚洲黄色av一区| 国产一区二区三区av电影| 欧洲生活片亚洲生活在线观看| 久久在线观看免费| 美腿丝袜亚洲综合| 欧美性色综合网| 亚洲黄色在线视频| 成人av电影在线播放| 2014亚洲片线观看视频免费| 日韩二区三区四区| 91色在线porny| 国产精品黄色在线观看| 久久成人免费网| 555夜色666亚洲国产免| 亚洲一二三级电影| 欧洲中文字幕精品| 亚洲一区影音先锋| 91国偷自产一区二区开放时间| 欧美激情综合网| 国产福利一区二区三区视频 | 色婷婷综合在线| 国产精品乱码久久久久久| 国产在线视频一区二区三区| 欧美一区二区三区日韩视频| 一区二区三区不卡视频在线观看| 99精品桃花视频在线观看| 中文字幕国产一区| 99久精品国产| 亚洲精品视频观看| 色综合网色综合| 一区二区三区.www| 欧美久久久久久蜜桃| 日韩一区精品视频| 精品区一区二区| 久久综合综合久久综合| 日韩精品一区二区三区中文不卡 | 国产一区二区三区av电影| 2023国产精华国产精品| 国产成人av福利| 中文无字幕一区二区三区| av午夜一区麻豆| 夜夜嗨av一区二区三区四季av| 欧美日韩一区二区三区四区| 三级久久三级久久| 26uuu精品一区二区| 国产精品99久久不卡二区| 国产精品美日韩| 欧美伊人精品成人久久综合97| 日韩和欧美一区二区| 精品免费国产一区二区三区四区| 激情五月播播久久久精品| 欧美国产日本韩| 欧美吞精做爰啪啪高潮| 国内精品伊人久久久久av影院| 欧美激情一区二区三区| 色婷婷国产精品久久包臀| 肉肉av福利一精品导航| 欧美国产精品中文字幕| 色久综合一二码| 久久国产日韩欧美精品| 亚洲欧美激情在线| 精品久久久久久无| 色一情一伦一子一伦一区| 另类小说视频一区二区| 国产精品二三区| 在线播放中文字幕一区| 国产v综合v亚洲欧| 日本女人一区二区三区| 亚洲图片你懂的| 精品99久久久久久| 欧美日韩夫妻久久| 99国内精品久久| 国产乱码字幕精品高清av | 欧美精品一区男女天堂| 色综合色综合色综合色综合色综合| 美女诱惑一区二区| 亚洲综合一区二区三区| 国产日韩欧美高清| 日韩欧美在线1卡| 欧美日韩亚洲综合在线| 成人免费毛片a| 国产在线精品国自产拍免费| 午夜视频久久久久久| 亚洲人成伊人成综合网小说| 久久亚洲捆绑美女| 欧美一区二区私人影院日本| 欧美亚洲动漫另类| 91理论电影在线观看| 国产91清纯白嫩初高中在线观看| 奇米影视一区二区三区小说| 亚洲国产成人av网| 亚洲视频一二三| 中文字幕在线观看不卡| 久久婷婷久久一区二区三区| 欧美一级二级在线观看| 欧美精品丝袜中出| 欧美日韩国产精品成人| 在线免费不卡电影| 一本色道久久综合亚洲91| 99re8在线精品视频免费播放| 成人中文字幕电影| 成人性生交大合| 成人动漫一区二区三区| kk眼镜猥琐国模调教系列一区二区| 国产精品一区二区在线观看不卡 | 日本国产一区二区| 色视频欧美一区二区三区| 91蜜桃免费观看视频| 色综合中文字幕| 精品视频123区在线观看| 欧美亚洲综合一区| 911国产精品| 精品久久久久久久人人人人传媒 | 欧美在线不卡一区| 欧美日韩视频在线观看一区二区三区| 欧美主播一区二区三区美女| 欧美色爱综合网| 欧美肥妇free| 久久女同性恋中文字幕| 国产精品青草久久| 一区二区不卡在线视频 午夜欧美不卡在| 一区二区视频在线| 丝袜脚交一区二区| 国产福利一区在线| 91丝袜美腿高跟国产极品老师| 欧美专区日韩专区| 精品捆绑美女sm三区| 国产精品三级视频| 天天综合色天天综合色h| 国产综合久久久久久鬼色| 不卡高清视频专区| 欧美日韩精品一二三区| 亚洲精品在线观| 亚洲免费观看视频| 狠狠色综合日日| 色哟哟一区二区| 久久亚洲一区二区三区明星换脸| 国产精品国产三级国产a| 午夜精品影院在线观看| 国产乱淫av一区二区三区| 97se亚洲国产综合自在线观| 欧美一区二区三区四区高清 | 91麻豆精品国产91久久久更新时间| 欧美精品一区二区三区在线播放| 欧美国产成人在线| 日韩综合在线视频| av成人免费在线观看| 欧美一区二区观看视频| 亚洲黄色录像片| 国产成人8x视频一区二区| 欧美日韩色一区| 中文字幕一区免费在线观看|