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

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

?? diskmain.cpp

?? 三星2410,WinCE5.0下的硬盤IDE驅動.
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
    // HPIOI1:Check_Status
    // -------------------
HPIOI1_Check_Status:;
    __try {
        bStatus = GetAltStatus();
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {
        DEBUGMSG(ZONE_ERROR, (_T(
            "Atapi!CDisk::SendIdentifyDevice> Exception\r\n"
            )));
        fResult = FALSE;
        goto exit;
    }
    if (!(bStatus & (ATA_STATUS_BUSY|ATA_STATUS_DATA_REQ))) { // BSY=0 and DRQ=0
        // an error occurred
        if (dwRetries < HPIOI1_CHECK_STATUS_RETRIES) {
            dwRetries++;
            Sleep(5);
            goto HPIOI1_Check_Status;
         }
         fResult = FALSE;
         goto exit;
    }
    if (bStatus & ATA_STATUS_BUSY) { // BSY=1
        goto HPIOI1_Check_Status;
    }
    if (!(bStatus & ATA_STATUS_BUSY) && (bStatus & ATA_STATUS_DATA_REQ)) { // BSY=0 and DRQ=1
        goto HPIOI2_Transfer_Data;
    }

    // HPIOI2:Transfer_Data
    // --------------------
    // (IDENTIFY [ATAPI] DEVICE only returns a single DRQ data block)
HPIOI2_Transfer_Data:;
    cbIdentifyDeviceData = sizeof(IDENTIFY_DATA);
    DEBUGCHK(cbIdentifyDeviceData <= BYTES_PER_SECTOR);
    // read result of IDENTIFY DEVICE/IDENTIFY PACKET DEVICE
    if (m_f16Bit) {
        cbIdentifyDeviceData /= 2;
        ReadWordBuffer((PWORD)&m_Id, cbIdentifyDeviceData);
    }
    else {
        ReadByteBuffer((PBYTE)&m_Id, cbIdentifyDeviceData);
    }
    // ignore extraneous data
    while (GetAltStatus() & ATA_STATUS_DATA_REQ ) {
        if (m_f16Bit) {
            ReadWord();
        }
        else {
            ReadByte();
        }
    }

    // Return to Host Idle protocol

exit:;
    return fResult;
}

// ----------------------------------------------------------------------------
// Function: Identify
//     This function initiates communication with the device.  If the
//     appropriate device is detected on the channel, then instruct the device
//     to execute a diagnostic.  Issue IDENTIFY DEVICE/IDENTIFY PACKET DEVICE.
//     Validate the IDENTIFY data.  Inspect IDENTIFY data (if ATA, determine
//     which read/write commands to use, store disk geometry, etc.)
//
// Parameters:
//     None
// ----------------------------------------------------------------------------

BOOL
CDisk::Identify(
    )
{
    DWORD dwBlockSize = 0; // size of IDENTIFY DEVICE/IDENTIFY PACKET DEVICE information
    WORD wDevType = 0;     // command packet set implemented by device (e.g., direct-access, CD-ROM, etc.)
    DWORD dwCHS = 0;       // whether the registry specifies that the device is to use C/H/S mode
    BYTE bDiagnosticCode;  // SendExecuteDeviceDiagnostic argument
    BOOL fIsAtapi;         // SendExecuteDeviceDiagnostic argument

    TakeCS();

    // test for device present

    if (!IsDevicePresent()) {
        ReleaseCS();
        return FALSE;
    }

    // issue EXECUTE DEVICE DIAGNOSTIC; determine whether device is ATA or ATAPI
    // (ignore the result of this call, as old devices fail to respond correctly)

    SendExecuteDeviceDiagnostic(&bDiagnosticCode, &fIsAtapi);
    // try ATA device
    if (SendIdentifyDevice(FALSE)) { // fIsAtapi=FALSE

        m_fAtapiDevice = FALSE;
        // ALi IDE/ATA controller tweak for supporting a DMA-enabled ATAPI device
        if (2 == m_pPort->m_pDskReg[m_dwDeviceId]->dwDMA) { // 0=PIO, 1=DMA, 2=ATA DMA only
            m_fDMAActive = TRUE;
        }
    }
    else {
        // try ATAPI device
        if (SendIdentifyDevice(TRUE)) { // fIsAtapi=TRUE
            m_fAtapiDevice = TRUE;
        }
        else {
            DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
                "Atapi!CDisk::Identify> Device failed to respond to IDENTIFY DEVICE and IDENTIFY PACKET DEVICE\r\n"
                )));
            ReleaseCS();
            return FALSE;
        }
    }

    ReleaseCS();

    // validate IDENTIFY DEVICE/IDENTIFY PACKET DEVICE signature; any empty
    // channel may return invalid data

    if ((m_Id.GeneralConfiguration == 0) || (m_Id.GeneralConfiguration == 0xffff) ||
        (m_Id.GeneralConfiguration == 0xff7f) ||
        (m_Id.GeneralConfiguration == 0x7fff) ||
       ((m_Id.GeneralConfiguration == m_Id.IntegrityWord) && (m_Id.NumberOfCurrentCylinders == m_Id.IntegrityWord))
    ) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
            "Atapi!CDisk::Identify> General configuration(%04X) not valid; device not present\r\n"
            ), m_Id.GeneralConfiguration));
        return FALSE;
    }

    // dump IDENTIFY DEVICE/IDENTIFY PACKET DEVICE data and supported transfer modes
    PIDENTIFY_DATA pId = &m_Id;
    DUMPIDENTIFY(pId);
    DUMPSUPPORTEDTRANSFERMODES(pId);

    // ATA/ATAPI-3 compatible devices store command packet set implemented by
    // device in bits 12-8 of word 0 of IDENTIFY DEVICE/IDENTIFY PACKET DEVICE
    // data (this information is retired in ATA/ATAPI-6)

    wDevType = (m_Id.GeneralConfiguration >> 8) & 0x1F;
    switch (wDevType) {
    case ATA_IDDEVICE_UNKNOWN:
        return FALSE;
    case ATA_IDDEVICE_CDROM:
        m_dwDeviceFlags |= DFLAGS_DEVICE_CDROM;
        break;
    case ATA_IDDEVICE_DISK:
        break;
    case ATA_IDDEVICE_OPTICAL_MEM:
        break;
    default:
        DEBUGMSG(ZONE_INIT, (_T("Atapi!CDisk::Identify> Assuming direct-access device (hard disk drive)\r\n")));
        break;
    }
    // this is redundant; but various routines use this information
    m_dwDeviceFlags |= DFLAGS_DEVICE_PRESENT;
    m_dwDeviceFlags |= (IsAtapiDevice()) ? DFLAGS_ATAPI_DEVICE : 0;
    m_dwDeviceFlags |= (IsRemoveableDevice()) ? DFLAGS_REMOVABLE_DRIVE : 0;

    // ATAPI devices use ATAPI read/write commands; ATA devices support
    // single- and multi-sector transfers; if this is an ATA device, then
    // select multi-sector transfers, if supported

    if (!IsAtapiDevice()) {

        // default to single-sector transfers
        m_bReadCommand = ATA_CMD_READ; m_bWriteCommand = ATA_CMD_WRITE;

        if (m_Id.MaximumBlockTransfer != 0) {

            // device supports multi-sector transfers; enable multi-sector
            // transfers; issue SET MULTIPLE MODE command
            SelectDevice();
            WriteSectorCount((BYTE)m_Id.MaximumBlockTransfer);
            WriteCommand(ATA_CMD_SET_MULTIPLE);

            if (!WaitOnBusy(FALSE) && (GetAltStatus() & ATA_STATUS_READY)) {
                m_bReadCommand = ATA_CMD_MULTIPLE_READ; m_bWriteCommand = ATA_CMD_MULTIPLE_WRITE;
                m_bSectorsPerBlock = m_Id.MaximumBlockTransfer;
            }
            else {
                DEBUGMSG(ZONE_INIT, (_T(
                    "Atapi!CDisk::Identify> (Warning) Failed to enable multi-sector transfers; using single-sector transfers\r\n"
                    )));
            }
        }
    }

    m_fLBAMode = (m_Id.Capabilities & 0x0200) ? TRUE : FALSE;
    m_DiskInfo.di_flags = DISK_INFO_FLAG_MBR;                 // all ATA storage devices have an MBR
    m_DiskInfo.di_bytes_per_sect = BYTES_PER_SECTOR;          // start with 512, then go with SetInfo changes
    m_DiskInfo.di_cylinders = m_Id.NumberOfCylinders;
    m_DiskInfo.di_heads = m_Id.NumberOfHeads;
    m_DiskInfo.di_sectors = m_Id.SectorsPerTrack;
    if (m_fLBAMode) {
        m_DiskInfo.di_total_sectors = m_Id.TotalUserAddressableSectors;
    }
    else {
        m_DiskInfo.di_total_sectors= m_DiskInfo.di_cylinders*m_DiskInfo.di_heads*m_DiskInfo.di_sectors;
    }

    return TRUE;
}

// ----------------------------------------------------------------------------
// Function: ValidateSg
//     Map embedded pointers
//
// Parameters:
//     pSgReq -
//     InBufLen -
// ----------------------------------------------------------------------------

BOOL
CDisk::ValidateSg(
    PSG_REQ pSgReq,
    DWORD InBufLen
    )
{
    if (PSLGetCallerTrust() != OEM_CERTIFY_TRUST) {
        if (pSgReq && InBufLen >= (sizeof(SG_REQ) + sizeof(SG_BUF) * (pSgReq->sr_num_sg - 1))) {
            DWORD dwIndex;
            for (dwIndex = 0; dwIndex < pSgReq -> sr_num_sg; dwIndex++) {
                pSgReq->sr_sglist[dwIndex].sb_buf = (PUCHAR)MapCallerPtr((LPVOID)pSgReq->sr_sglist[dwIndex].sb_buf,pSgReq->sr_sglist[dwIndex].sb_len);
            }
        }
        else {
            return FALSE;
        }
    }
    return TRUE;
}

// ----------------------------------------------------------------------------
// Function: ValidateSg
//     Map embedded pointers
//
// Parameters:
//     pCdrom -
//     InBufLen -
// ----------------------------------------------------------------------------

BOOL
CDisk::ValidateSg(
    PCDROM_READ pCdrom,
    DWORD InBufLen
    )
{
    if (PSLGetCallerTrust() != OEM_CERTIFY_TRUST) {
        if (pCdrom && InBufLen >= (sizeof(CDROM_READ) + sizeof(SGX_BUF) * (pCdrom->sgcount - 1))) {
            DWORD dwIndex;
            for (dwIndex = 0; dwIndex < pCdrom-> sgcount; dwIndex++) {
                pCdrom->sglist[dwIndex].sb_buf = (PUCHAR)MapCallerPtr((LPVOID)pCdrom->sglist[dwIndex].sb_buf,pCdrom->sglist[dwIndex].sb_len);
            }
        }
        else {
            return FALSE;
        }
    }
    return TRUE;
}

// ----------------------------------------------------------------------------
// Function: SendDiskPowerCommand
//     Put the device into a specified power state.  The optional parameter is
//     programmed into the Sector Count register, which is used for the
//     ATA NEW CMD IDLE and ATA CMD STANDBY commands.
//
// Parameters:
//     bCmd -
//     bParam -
// ----------------------------------------------------------------------------

BOOL
CDisk::SendDiskPowerCommand(
    BYTE bCmd,
    BYTE bParam
    )
{
    BYTE bError, bStatus;
    BOOL fOk = TRUE;

    if(ZONE_CELOG) CeLogData(TRUE, CELID_ATAPI_POWERCOMMAND, &bCmd, sizeof(bCmd), 0, CELZONE_ALWAYSON, 0, FALSE);

    // HI:Check_Status (Host Idle); wait until BSY=0 and DRQ=0
    // read Status register
    while (1) {
        bStatus = GetAltStatus();
        if (!(bStatus & (0x80|0x08))) break; // BSY := Bit 7, DRQ := Bit 3
        Sleep(5);
    }

    // HI:Device_Select; select device
    SelectDevice();

    // HI:Check_Status (Host Idle); wait until BSY=0 and DRQ=0
    // read Status register
    while (1) {
        bStatus = GetAltStatus();
        if (!(bStatus & (0x80|0x08))) break; // BSY := Bit 7, DRQ := Bit 3
        Sleep(5);
    }

    // HI:Write_Parameters
    WriteSectorCount(bParam);
    // WriteAltDriveController(0x00); // disable interrupt (nIEN := Bit 1 of Device Control register)

    // HI:Write_Command
    WriteCommand(bCmd);

    // transition to non-data command protocol

    // HND:INTRQ_Wait
    // transition to HND:Check_Status
    // read Status register
    while (1) { // BSY := Bit 7
        bStatus = GetAltStatus();
        bError = GetError();
        if (bError & 0x04) { // ABRT := Bit 2
            // command was aborted
            DEBUGMSG(ZONE_ERROR, (_T(
                "Atapi!CDisk::SendDiskPowerCommand> Failed to send command 0x%x, parameter 0x%x\r\n"
                ), bCmd, bParam));
            fOk = FALSE;
            break;
        }
        if (!(bStatus & 0x80)) break; // BSY := Bit 7
        Sleep(5);
    }

    // transition to host idle protocol

    return fOk;
}

// ----------------------------------------------------------------------------
// Function: GetDiskPowerInterface
//     Return the power management object associated with this device
//
// Parameters:
//     None
// ----------------------------------------------------------------------------

CDiskPower *
CDisk::GetDiskPowerInterface(
    void
    )
{
    CDiskPower *pDiskPower = new CDiskPower;
    return pDiskPower;
}

// ----------------------------------------------------------------------------
// Function: SetDiskPowerState
//     Map a power state to an ATA power management command and issue the
//     command
//
// Parameters:
//     newDx -
// ----------------------------------------------------------------------------

BOOL
CDisk::SetDiskPowerState(
    CEDEVICE_POWER_STATE newDx
    )
{
    BYTE bCmd;

    if (ZONE_CELOG) {
        DWORD dwDx = (DWORD) newDx;
        CeLogData(TRUE, CELID_ATAPI_SETDEVICEPOWER, &dwDx, sizeof(dwDx), 0, CELZONE_ALWAYSON, 0, FALSE);
    }

    // on D0 go to IDLE to minimize latency during disk accesses
    if(newDx == D0 || newDx == D1) {
        bCmd = ATA_CMD_IDLE_IMMEDIATE;
    }
    else if(newDx == D2) {
        bCmd = ATA_CMD_STANDBY_IMMEDIATE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
毛片一区二区三区| 国产日韩欧美精品在线| 国产精品―色哟哟| 顶级嫩模精品视频在线看| 国产亚洲一区字幕| av一区二区三区在线| 亚洲精品日日夜夜| 日本精品视频一区二区| 午夜精品久久久久久久99水蜜桃| 欧美一区三区四区| 成人午夜电影久久影院| 亚洲综合一区在线| 日韩久久久久久| 国产精品99久久久| 一区二区三区国产精品| 精品国产一区二区三区久久久蜜月| 另类专区欧美蜜桃臀第一页| 国产精品久久久久三级| 在线播放一区二区三区| 国产99久久久国产精品免费看| 韩国三级电影一区二区| 日韩在线a电影| 欧美mv日韩mv| 在线欧美日韩国产| 国产成人免费网站| 午夜婷婷国产麻豆精品| 首页综合国产亚洲丝袜| 奇米影视在线99精品| 玉米视频成人免费看| 亚洲成人综合在线| 中文字幕综合网| 久久精品亚洲精品国产欧美kt∨| 精品国产一区二区三区av性色| 久久精品亚洲一区二区三区浴池| 国产精品看片你懂得| 亚洲最快最全在线视频| 裸体歌舞表演一区二区| 丁香六月久久综合狠狠色| 欧美在线短视频| 精品国产青草久久久久福利| 国产精品久久久久久亚洲毛片 | 3d动漫精品啪啪1区2区免费 | 精品国产不卡一区二区三区| 国产欧美一区二区在线观看| 亚洲女人小视频在线观看| 国产亚洲一区二区三区四区| |精品福利一区二区三区| 国产三级精品三级在线专区| 亚洲精品高清在线| 久久成人综合网| 欧美videos中文字幕| 国产视频一区在线播放| 亚洲一二三区不卡| 夜夜爽夜夜爽精品视频| 国模少妇一区二区三区| 欧美三级乱人伦电影| 欧洲视频一区二区| 久久久久成人黄色影片| 欧美激情一区二区在线| 欧美韩国日本一区| 免费久久99精品国产| 91美女精品福利| 91浏览器入口在线观看| 久久网这里都是精品| 中文字幕免费一区| 国产一区 二区| 成人动漫在线一区| 91丝袜国产在线播放| 国产丝袜欧美中文另类| 久久精工是国产品牌吗| 欧美伦理电影网| 亚洲精品一卡二卡| 99在线精品视频| 国产女人水真多18毛片18精品视频 | 国产成人自拍网| 91精品国产免费| 天堂影院一区二区| 欧美三级日韩在线| 五月天中文字幕一区二区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 91小视频免费看| 国产精品国产三级国产aⅴ无密码| 精品中文字幕一区二区 | 国产丝袜在线精品| 国产精品99久久久久久似苏梦涵| 国产欧美一区二区精品久导航| 蜜桃一区二区三区在线观看| 欧美精品在线视频| 日本成人在线一区| 不卡av在线免费观看| 国产精品伦一区| 99久久精品国产观看| 3d动漫精品啪啪一区二区竹菊| 亚洲高清视频的网址| 欧美日韩欧美一区二区| 天堂午夜影视日韩欧美一区二区| 欧美日韩国产小视频在线观看| 国产丝袜在线精品| 成人免费看黄yyy456| 国产精品国产三级国产普通话99| av在线一区二区三区| 亚洲人成精品久久久久久| 色香蕉成人二区免费| 五月婷婷激情综合| 久久影音资源网| 成人app网站| 亚洲伦理在线精品| 91精品国产综合久久久蜜臀图片| 免费观看91视频大全| 久久久99精品免费观看不卡| 高清不卡在线观看| 亚洲尤物在线视频观看| 91精品国产欧美一区二区成人| 久久97超碰色| 亚洲免费av在线| 日韩美女天天操| 91性感美女视频| 美国十次综合导航| 亚洲图片欧美激情| 日韩欧美美女一区二区三区| 成人亚洲一区二区一| 天天影视涩香欲综合网| 国产亚洲一区二区三区四区 | 国产一区二区三区电影在线观看| 成人免费小视频| 日韩精品一区二区三区视频播放 | 日本成人在线不卡视频| 国产精品视频九色porn| 欧美女孩性生活视频| 国v精品久久久网| 日本sm残虐另类| 亚洲三级理论片| xfplay精品久久| 欧美日韩美少妇| 99精品在线观看视频| 激情国产一区二区| 五月婷婷综合激情| 亚洲欧美经典视频| 亚洲国产精品v| 精品久久久久久久一区二区蜜臀| 色婷婷国产精品| 成人激情开心网| 国产剧情av麻豆香蕉精品| 亚洲电影第三页| 亚洲精品中文在线| 最新日韩av在线| 国产亚洲欧美在线| 精品理论电影在线| 日韩欧美亚洲一区二区| 欧美日韩1234| 欧美日韩日日摸| 精品视频资源站| 欧美午夜精品一区二区三区| 日韩中文字幕av电影| 亚洲综合清纯丝袜自拍| 中文字幕一区二区在线观看| 国产日韩精品一区二区浪潮av| 欧美电影免费观看完整版| 91精品国产综合久久精品app| 欧美亚洲自拍偷拍| 欧美性猛交xxxx黑人交| 欧美午夜影院一区| 欧美日韩三级在线| 91精品国产品国语在线不卡| 555www色欧美视频| 日韩欧美资源站| 一本一本久久a久久精品综合麻豆| 东方aⅴ免费观看久久av| www.亚洲免费av| 99久久综合精品| 欧美系列在线观看| 91精品国产品国语在线不卡| 日韩一区二区三区视频| 精品日韩一区二区三区| 久久久久国产精品人| 国产精品国产三级国产aⅴ无密码| 成人欧美一区二区三区视频网页 | 国产.精品.日韩.另类.中文.在线.播放| 久久91精品久久久久久秒播| 黄网站免费久久| 不卡的av电影| 欧美精品1区2区| 2020国产精品自拍| 亚洲欧洲av一区二区三区久久| 亚洲视频一区二区在线| 亚洲午夜国产一区99re久久| 日韩精品久久理论片| 国产乱码精品1区2区3区| 成人精品免费看| 欧美日韩欧美一区二区| 久久色在线视频| 亚洲人成小说网站色在线| 日韩黄色小视频| 国产成人a级片| 欧美午夜片在线观看| 久久久久久麻豆| 亚洲第一狼人社区| 国产一区二区不卡| 欧美日韩精品一区二区在线播放| 2023国产一二三区日本精品2022|