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

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

?? diskmain.cpp

?? 三星2410,WinCE5.0下的硬盤IDE驅動.
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
        psdi->dwDeviceFlags |= STORAGE_DEVICE_FLAG_READWRITE;

        if (!hKey || !AtaGetRegistryString(hKey, REG_VALUE_HDPROFILE, &szProfile, sizeof(psdi->szProfile))) {
            wcscpy(psdi->szProfile, REG_VALUE_HDPROFILE);
        }

    }

    return ERROR_SUCCESS;
}

// ----------------------------------------------------------------------------
// Function: GetDiskName
//     Implement IOCTL_DISK_GETNAME
//
// Parameters:
//     pIOReq -
// ----------------------------------------------------------------------------

DWORD
CDisk::GetDiskName(
    PIOREQ pIOReq
    )
{
    static PTCHAR szDefaultDiscDrive = (_T("External Volume"));
    PTCHAR szDiskName = NULL;
    DWORD dwSize;

    DEBUGMSG(ZONE_IOCTL, (_T("Atapi!GeDisktName\r\n")));

    if ((pIOReq->pBytesReturned == NULL) || (pIOReq->dwOutBufSize == 0) || (pIOReq->pOutBuf == NULL)) {
        return ERROR_INVALID_PARAMETER;
    }

    *(pIOReq->pBytesReturned) = 0;

    if (m_szDiskName) {
        if (wcslen(m_szDiskName)) {
            szDiskName = m_szDiskName;
        }
        else {
            return ERROR_NOT_SUPPORTED;
        }
    }
    else {
        szDiskName = szDefaultDiscDrive;
    }

    dwSize = (wcslen(szDiskName) + 1) * sizeof(TCHAR);

    if (pIOReq->dwOutBufSize < dwSize) {
        return ERROR_INSUFFICIENT_BUFFER;
    }

    wcscpy((PTCHAR) pIOReq->pOutBuf, szDiskName);

    *(pIOReq->pBytesReturned) = dwSize;

    return ERROR_SUCCESS;
}

// ----------------------------------------------------------------------------
// Function: ReadWriteDisk
//     Implement ATA/ATAPI-6 R3B 8.34 (READ SECTOR(S)) and 8.62 (WRITE SECTOR(S)).
//     Implement ATA/ATAPI-6 R3B 9.5 (PIO data-in command protocol) and 9.6
//     (PIO data-out command protocol).
//     This function reads from/writes to an ATA device.
//
// Parameters:
//     pIOReq -
//     fRead -
//
// Notes:
//     READ SECTOR(S) and WRITE SECTOR(S) can transfer up to 256 sectors; however,
//     every transfer is segmented, as per the PIO data-in/out protocol.  A segment
//     of a multiple-block transfer is called a "DRQ data block" and is the length
//     of a sector; see ATA/ATAPI-6 R3B 9.5 and 9.6 for more information.
// ----------------------------------------------------------------------------

DWORD
CDisk::ReadWriteDisk(
    PIOREQ pIOReq,
    BOOL fRead
    )
{
    DWORD dwError = ERROR_SUCCESS; // result

    PSG_REQ pSgReq = (PSG_REQ) pIOReq->pInBuf; // scatter/gather request
    PSG_BUF pSgBuf;                            // scatter/gather buffer

    BYTE bStatus; // device Status register

    BYTE bCmd = fRead ? m_bReadCommand : m_bWriteCommand; // command

    DWORD dwCurBufNum;           // current scatter/gather buffer
    DWORD dwCurBufPos;           // current position in current scatter/gather buffer
    PBYTE pBuffer;               // pointer to current address of current scatter/gather buffer
    DWORD dwCurDoubleBufPos;     // current position in current double buffer
    DWORD dwCurDoubleBufLen;     // length of current double buffer (for reads)
    PBYTE pDoubleBuffer;         // pointer to current address of double buffer
    DWORD dwCurByte;             // current byte (to increment current sector of transfer) of "global" transfer
    DWORD dwCurSec;              // current sector of "global" transfer
    DWORD dwCurDRQDataBlockByte; // current byte of current DRQ data block transfer
    BOOL fWriteComplete;         // to facilitate PIO data-out protocol, flag transfer complete

    // validate arguments
    if ((pSgReq == NULL) || (pIOReq->dwInBufSize < sizeof(SG_REQ))) {
        return ERROR_INVALID_PARAMETER;
    }
    if ((pSgReq->sr_num_sec == 0) || (pSgReq->sr_num_sg == 0)) {
        return  ERROR_INVALID_PARAMETER;
    }
    if ((pSgReq->sr_start + pSgReq->sr_num_sec) > m_DiskInfo.di_total_sectors) {
        return ERROR_SECTOR_NOT_FOUND;
    }

    // do we have to allocate the double buffer?
    if (NULL == m_rgbDoubleBuffer) {
        DEBUGMSG(ZONE_INIT, (TEXT(
            "Atapi!CDisk::ReadWriteDisk> Allocating double buffer [first use]\r\n"
            )));
        m_rgbDoubleBuffer = (PBYTE)LocalAlloc(LPTR, m_pPort->m_pDskReg[m_dwDeviceId]->dwDoubleBufferSize);
        if (NULL == m_rgbDoubleBuffer) {
            DEBUGMSG(ZONE_ERROR, (TEXT(
                "Atapi!CDisk::ReadWriteDisk> Failed to allocate double buffer\r\n"
                )));
            dwError = ERROR_OUTOFMEMORY;
            goto exit;
        }
    }

    // clear interrupt, if set
    // TODO: Is this necessary?
    // GetBaseStatus();

    // initialize "global" transfer state
    dwCurSec = pSgReq->sr_start;
    dwCurByte = 0;

    // fetch first scatter/gather buffer
    dwCurBufNum = 0;
    dwCurBufPos = 0;
    pSgBuf = &(pSgReq->sr_sglist[0]);
    // map nested pointer and test for security violation
    pBuffer = (PBYTE)MapCallerPtr((LPVOID)pSgBuf->sb_buf, pSgBuf->sb_len);
    if (pSgBuf->sb_buf != NULL && pBuffer == NULL) {
        // security violation
        DEBUGMSG(ZONE_ERROR, (TEXT(
            "Atapi!CDisk::ReadWriteDisk> Failed to map pointer to caller\r\n"
            )));
        return ERROR_INVALID_PARAMETER;
    }

    // is this a read or a write?
    if (fRead) {

        // --------------------------------------------------------------------
        // ATA/ATAPI-6 R3B 9.5 (PIO data-in protocol)
        // --------------------------------------------------------------------

        // Host_Idle
        // ---------
        // issue command
PIO_Data_In_Read_Command:;
        // determine size of transfer
        if ((((pSgReq->sr_start + pSgReq->sr_num_sec) - dwCurSec) * m_DiskInfo.di_bytes_per_sect) > m_pPort->m_pDskReg[m_dwDeviceId]->dwDoubleBufferSize) {
            dwCurDoubleBufLen = m_pPort->m_pDskReg[m_dwDeviceId]->dwDoubleBufferSize;
        }
        else {
            dwCurDoubleBufLen = ((pSgReq->sr_start + pSgReq->sr_num_sec) - dwCurSec) * m_DiskInfo.di_bytes_per_sect;
        }
        // issue command
        if (!SendIOCommand(dwCurSec, dwCurDoubleBufLen / m_DiskInfo.di_bytes_per_sect, bCmd)) {
            DEBUGMSG(ZONE_ERROR, (_T(
                "Atapi!CDisk::ReadWriteDisk> Failed to issue read/write command\r\n"
                )));
            dwError = fRead ? ERROR_READ_FAULT : ERROR_WRITE_FAULT;
            goto exit;
        }

        // initialize double buffer for read
        pDoubleBuffer = m_rgbDoubleBuffer;
        dwCurDoubleBufPos = 0;

        // INTRQ_Wait
        // ----------
        // wait for interrupt if nIEN=0 (i.e., if interrupt enabled)
HPIOI_INTRQ_Wait:;
        // if nIEN=0 (interrupt enabled), wait for interrupt
        if (m_fInterruptSupported) {
            if (!WaitForInterrupt(m_dwDiskIoTimeOut) || (CheckIntrState() == ATA_INTR_ERROR)) {
                DEBUGMSG(ZONE_IO|ZONE_WARNING, (_T(
                    "Atapi!CDisk::ReadWriteDisk> Failed to wait for interrupt (m_dwDeviceId=%d)\r\n"
                    ), m_dwDeviceId));
                dwError = ERROR_READ_FAULT;
                goto exit;
            }
        }

        // Check_Status
        // ------------
        // if BSY=0 and DRQ=0, transition to Host_Idle
        // if BSY=1, re-enter this state
        // if BSY=0 and DRQ=1, transition to Transfer_Data
HPIOI_Check_Status:;
        bStatus = GetAltStatus();                                  // read Status register
        if ((!(bStatus & 0x80)) && (!(bStatus & 0x08))) goto exit; // BSY=0, DRQ=0
        if (bStatus & 0x80) goto HPIOI_Check_Status;               // BSY=1
        if ((!(bStatus & 0x80)) && (bStatus & 0x08)) goto HPIOI_Transfer_Data_Setup; // BSY=0, DRQ=1
        DEBUGCHK(FALSE);
        goto exit;

        // Transfer_Data
        // -------------
        // if read Data register, DRQ data block transfer not complete, re-enter this state
        // if raad Data register, all data for command transferred, transition to Host_Idle
        // if read Data register, DRQ data block transferred, all data for command not transferred,
        //     and nIEN=1, transition to Check_Status
        // if read Data register, DRQ data block transferred, all data for command not transferred,
        //     and nIEN=0, transition to INTRQ_Wait
HPIOI_Transfer_Data_Setup:;
        dwCurDRQDataBlockByte = 0;                      // reset DRQ data block
HPIOI_Transfer_Data:;
        if (m_f16Bit) {
            *((PWORD)pDoubleBuffer) = ReadWord();       // read 16-bit Data register
            pDoubleBuffer++;
            dwCurDRQDataBlockByte += 1;                 // increment DRQ data block
        }
        else {
            *((PBYTE)pDoubleBuffer) = (BYTE)ReadByte(); // read 8-bit Data register
        }
        pDoubleBuffer++;
        dwCurDRQDataBlockByte += 1;                     // increment DRQ data block
        // is DRQ data block transferred?
        if (dwCurDRQDataBlockByte == m_pPort->m_pDskReg[m_dwDeviceId]->dwDrqDataBlockSize) {
            dwCurDoubleBufPos += m_pPort->m_pDskReg[m_dwDeviceId]->dwDrqDataBlockSize;
            // has all data for command been transferred?
            if (dwCurDoubleBufPos == dwCurDoubleBufLen) goto HPIOI_Empty_Double_Buffer;
            // DRQ data block transferred, all data for command not transferred
            goto HPIOI_INTRQ_Wait;
        }
        // DRQ data block transfer not complete
        goto HPIOI_Transfer_Data;

HPIOI_Empty_Double_Buffer:;

        // the double buffer has been filled, i.e., a read command has been
        // completed; distribute double buffer to scatter/gather buffers

        // initialize double buffer for empty
        pDoubleBuffer = m_rgbDoubleBuffer;
        dwCurDoubleBufPos = 0;
        // empty current double buffer into current scatter/gather buffer
HPIOI_Distribute_Double_Buffer:;
        // copy a byte from the double buffer to the current scatter/gather buffer
        *pBuffer = m_rgbDoubleBuffer[dwCurDoubleBufPos];
        pBuffer++;
        dwCurBufPos += 1;
        dwCurDoubleBufPos += 1;
        // increment current sector, if necessary
        dwCurByte += 1;
        if (dwCurByte == m_DiskInfo.di_bytes_per_sect) {
            dwCurSec += 1;
            dwCurByte = 0;
        }
        // have we filled the current scatter/gather buffer?
        if (dwCurBufPos == pSgBuf->sb_len) {
            // have we filled the scatter/gather request?
            if ((dwCurBufNum + 1) == pSgReq->sr_num_sg) goto exit;
            // fetch next scatter/gather buffer
            dwCurBufNum += 1;
            dwCurBufPos = 0;
            pSgBuf = &(pSgReq->sr_sglist[dwCurBufNum]);
            pBuffer = (PBYTE)MapCallerPtr((LPVOID)pSgBuf->sb_buf, pSgBuf->sb_len);
            if (pSgBuf->sb_buf != NULL && pBuffer == NULL) {
                // security violation
                DEBUGMSG(ZONE_ERROR, (TEXT(
                    "Atapi!CDisk::ReadWriteDisk> Failed to map pointer to caller\r\n"
                    )));
                return ERROR_INVALID_PARAMETER;
            }
        }
        // have we emptied the double buffer?
        if (dwCurDoubleBufPos == dwCurDoubleBufLen) goto PIO_Data_In_Read_Command;
        goto HPIOI_Distribute_Double_Buffer;
    }
    else {

        // --------------------------------------------------------------------
        // ATA/ATAPI-6 R3B 9.6 (PIO data-out protocol)
        // --------------------------------------------------------------------

        // Host_Idle
        // ---------
        // issue command
PIO_Data_In_Write_Command:;
        // determine size of transfer
        if ((((pSgReq->sr_start + pSgReq->sr_num_sec) - dwCurSec) * m_DiskInfo.di_bytes_per_sect) > m_pPort->m_pDskReg[m_dwDeviceId]->dwDoubleBufferSize) {
            dwCurDoubleBufLen = m_pPort->m_pDskReg[m_dwDeviceId]->dwDoubleBufferSize;
        }
        else {
            dwCurDoubleBufLen = ((pSgReq->sr_start + pSgReq->sr_num_sec) - dwCurSec) * m_DiskInfo.di_bytes_per_sect;
        }
        // issue command
        if (!SendIOCommand(dwCurSec, dwCurDoubleBufLen / m_DiskInfo.di_bytes_per_sect, bCmd)) {
            DEBUGMSG(ZONE_ERROR, (_T(
                "Atapi!CDisk::ReadWriteDisk> Failed to issue read/write command\r\n"
                )));
            dwError = fRead ? ERROR_READ_FAULT : ERROR_WRITE_FAULT;
            goto exit;
        }

        fWriteComplete = FALSE; // mark write as in progress

        // the double buffer is empty, i.e., a write command is about to be
        // issued; fill the double buffer from the scatter/gather buffers

        // initialize double buffer for fill
        pDoubleBuffer = m_rgbDoubleBuffer;
        dwCurDoubleBufPos = 0;
        // fill current double buffer from current scatter/gather buffer
        while (1) {
            // copy a byte from the scatter/gather buffer to the double buffer
            PREFAST_DEBUGCHK(pBuffer);
            m_rgbDoubleBuffer[dwCurDoubleBufPos] = *pBuffer;
            pBuffer++;
            dwCurDoubleBufPos += 1;
            dwCurBufPos += 1;
            // increment current sector, if necessary
            dwCurByte++;
            if (dwCurByte == m_DiskInfo.di_bytes_per_sect) {
                dwCurSec += 1;
                dwCurByte = 0;
            }
            // have we emptied the current scatter/gather buffer?
            if (dwCurBufPos == pSgBuf->sb_len) {
                // have we emptied the scatter/gather request?
                if ((dwCurBufNum + 1) == pSgReq->sr_num_sg) {
                    fWriteComplete = TRUE; // mark write as complete
                    break;
                }
                // fetch next scatter/gather buffer
                dwCurBufNum += 1;
                dwCurBufPos = 0;
                pSgBuf = &(pSgReq->sr_sglist[dwCurBufNum]);
                pBuffer = (PBYTE)MapCallerPtr((LPVOID)pSgBuf->sb_buf, pSgBuf->sb_len);
                if (pSgBuf->sb_buf != NULL && pBuffer == NULL) {
                    // security violation
                    DEBUGMSG(ZONE_ERROR, (TEXT(
                        "Atapi!CDisk::ReadWriteDisk> Failed to map pointer to caller\r\n"
                        )));
                    return ERROR_INVALID_PARAMETER;
                }
            }
            // have we filled the double buffer?
            if (dwCurDoubleBufPos == m_pPort->m_pDskReg[m_dwDeviceId]->dwDoubleBufferSize) break;
        } // while

        // initialize current double buffer for empty
        pDoubleBuffer = m_rgbDoubleBuffer;

        // Check_Status
        // ------------
        // if BSY=0 and DRQ=0, transition to Host_Idle
        // if BSY=1, re-enter this state
        // if BSY=0 and DRQ=1, transition to Transfer_Data
HPIOO_Check_Status:;
        bStatus = GetAltStatus();                         // read Status register
        if ((!(bStatus & 0x80)) && (!(bStatus & 0x08))) { // BSY=0, DRQ=0
            if (fWriteComplete) goto exit;                // if the entire write is complete, exit
            goto PIO_Data_In_Write_Command;               // entire write is not complete, issue next transfer
        }
        if (bStatus & 0x80) goto HPIOO_Check_Status;      // BSY=1
        if ((!(bStatus & 0x80)) && (bStatus & 0x08)) goto HPIOO_Transfer_Data_Reset_DRQ_Data_Block; // BSY=0, DRQ=1
        DEBUGCHK(FALSE);
        goto exit;

        // Transfer_Data
        // -------------
        // if write Data register,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人午夜激情片| 日韩精品影音先锋| 日韩一级大片在线观看| 久久精品一区二区三区四区| 日本欧美久久久久免费播放网| 国产精品911| 7777精品久久久大香线蕉| 日韩理论在线观看| 国产盗摄女厕一区二区三区| 51午夜精品国产| 亚洲精品乱码久久久久久黑人| 精品一区二区免费在线观看| 欧美日韩精品是欧美日韩精品| 国产精品美女久久久久久久| 精品一区二区三区香蕉蜜桃 | 不卡av电影在线播放| 日韩亚洲国产中文字幕欧美| 亚洲精品中文在线观看| 成人精品小蝌蚪| 久久久国产一区二区三区四区小说| 性感美女久久精品| 91国产免费看| 亚洲精品亚洲人成人网| 成人av在线一区二区三区| 国产午夜亚洲精品不卡| 国产美女av一区二区三区| 日韩视频免费观看高清完整版| 五月天欧美精品| 欧美日韩免费观看一区三区| 亚洲国产成人va在线观看天堂| av电影在线观看完整版一区二区| 欧美激情中文不卡| 成人激情开心网| 国产精品乱子久久久久| 国产sm精品调教视频网站| 久久婷婷一区二区三区| 国产高清在线观看免费不卡| 久久久精品tv| 成人高清免费观看| 国产精品理论片在线观看| 成人av中文字幕| 亚洲欧美激情插 | 亚洲色图都市小说| 91麻豆文化传媒在线观看| 亚洲人成在线播放网站岛国| 色菇凉天天综合网| 婷婷丁香久久五月婷婷| 91精品国产黑色紧身裤美女| 久久精品国产99| 欧美国产禁国产网站cc| 91丝袜国产在线播放| 亚洲图片有声小说| 欧美一区二区三区成人| 国产尤物一区二区| 国产精品第四页| 欧美日韩视频不卡| 国内成人精品2018免费看| 国产精品美女久久久久aⅴ| 91色|porny| 日韩av中文字幕一区二区| 久久影院午夜片一区| 97精品久久久午夜一区二区三区| 一区二区成人在线视频| 日韩亚洲欧美在线| 成人av影视在线观看| 五月天久久比比资源色| 久久先锋资源网| 色嗨嗨av一区二区三区| 久久精品国产99国产精品| 国产精品毛片久久久久久久| 欧美日韩国产电影| 国产成人精品1024| 天堂久久一区二区三区| 久久精品亚洲乱码伦伦中文| 欧美日韩一区二区在线观看视频| 国内精品自线一区二区三区视频| 亚洲精品成a人| 精品日韩在线观看| 91国偷自产一区二区开放时间| 另类小说图片综合网| 亚洲欧美韩国综合色| 亚洲精品一区二区三区精华液| 91理论电影在线观看| 精品一区二区三区日韩| 亚洲一二三四区不卡| 国产亚洲精品中文字幕| 欧美一区二区黄| 91久久国产最好的精华液| 国产成人亚洲精品青草天美| 婷婷六月综合亚洲| 一区二区高清在线| 国产精品成人免费在线| 26uuu精品一区二区| 欧美人伦禁忌dvd放荡欲情| av一区二区三区在线| 国内精品不卡在线| 蜜桃av一区二区| 亚洲国产视频一区二区| 国产精品成人网| 欧美国产视频在线| 337p粉嫩大胆噜噜噜噜噜91av | 一区二区视频免费在线观看| 国产欧美日韩中文久久| 精品免费99久久| 欧美日韩中文字幕一区| 日本乱人伦aⅴ精品| 波多野结衣中文字幕一区二区三区| 久国产精品韩国三级视频| 免费在线一区观看| 日本最新不卡在线| 青青青伊人色综合久久| 午夜视频一区在线观看| 午夜精品久久久久| 亚洲高清免费在线| 亚瑟在线精品视频| 午夜成人免费视频| 全部av―极品视觉盛宴亚洲| 日本不卡免费在线视频| 免费看精品久久片| 久久精品二区亚洲w码| 久久99精品久久久| 国产在线播精品第三| 国产高清亚洲一区| 成人免费高清视频在线观看| 成人高清免费观看| 91免费国产视频网站| 91网上在线视频| 欧美视频一区二区三区在线观看| 欧美日韩一级视频| 日韩欧美的一区| 欧美精品一区二区三| 国产三级一区二区三区| 国产精品久久久久久久午夜片| 亚洲欧美色一区| 天堂va蜜桃一区二区三区漫画版| 秋霞午夜av一区二区三区| 国内成人免费视频| 91在线视频免费观看| 欧美日韩在线一区二区| 69久久99精品久久久久婷婷| 2020国产精品久久精品美国| 国产精品三级视频| 亚洲国产乱码最新视频| 美女视频黄频大全不卡视频在线播放| 美女一区二区三区在线观看| 国产成人av电影在线| 日本精品裸体写真集在线观看 | 日韩高清不卡一区| 国产乱人伦精品一区二区在线观看| 成人理论电影网| 欧美日韩亚洲国产综合| 国产亚洲欧美中文| 亚洲精品少妇30p| 免费成人美女在线观看.| 成人一区在线看| 欧美色综合久久| 久久久久国产精品厨房| 亚洲一区二区三区不卡国产欧美| 国产制服丝袜一区| 色哟哟国产精品| 久久婷婷久久一区二区三区| 亚洲精品乱码久久久久久久久| 久久狠狠亚洲综合| 在线欧美日韩精品| 久久精品夜色噜噜亚洲aⅴ| 亚洲h在线观看| 波多野结衣一区二区三区 | 欧美色图第一页| 日本一区二区免费在线观看视频| 亚洲成av人片一区二区梦乃| 粉嫩绯色av一区二区在线观看| 欧美久久高跟鞋激| 亚洲女性喷水在线观看一区| 极品少妇xxxx偷拍精品少妇| 欧美日韩视频专区在线播放| 成人免费在线播放视频| 国产一区二区看久久| 欧美亚洲国产怡红院影院| 国产农村妇女毛片精品久久麻豆| 青青草国产成人av片免费| 在线一区二区三区做爰视频网站| 国产拍欧美日韩视频二区| 麻豆精品在线视频| 欧美日韩的一区二区| 一区二区三区在线视频观看58| 成人性生交大片免费看在线播放| 日韩一级片网址| 日日骚欧美日韩| 欧美亚男人的天堂| 一区二区三区久久| 91片在线免费观看| 成人免费在线观看入口| 成人精品视频一区二区三区 | 欧美激情中文字幕一区二区| 九色综合狠狠综合久久| 日韩女优视频免费观看| 日本视频免费一区| 日韩视频免费直播| 久久精品理论片| 久久午夜电影网|