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

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

?? diskmain.cpp

?? 三星2410,WinCE5.0下的硬盤IDE驅動.
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//
// 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>
/*++

Module Name:
    diskmain.cpp

Abstract:
    Base ATA/ATAPI device abstraction.

Revision History:

--*/

static HANDLE g_hTestUnitReadyThread = NULL;

// ----------------------------------------------------------------------------
// Function: CDisk
//     Constructor
//
// Parameters:
//     None
// ----------------------------------------------------------------------------

CDisk::CDisk(
    )
{
    // empty
}

// ----------------------------------------------------------------------------
// Function: CDisk
//     Constructor
//
// Parameters:
//     hKey -
// ----------------------------------------------------------------------------

CDisk::CDisk(
    HKEY hKey
    )
{
    m_dwDeviceFlags = 0;
    m_pNextDisk = NULL;
    m_pATAReg = NULL;
    m_pATARegAlt = NULL;
    m_dwDevice = 0;
    m_hDevKey = hKey;
    m_dwDeviceId = 0;
    m_dwPort = 0;
    m_f16Bit = FALSE;
    m_fAtapiDevice = FALSE;
    m_fInterruptSupported = FALSE;
    m_szDiskName = NULL;
    m_fDMAActive = FALSE;
    m_dwOpenCount = 0;
    m_dwUnitReadyTime = 0;
    m_dwStateFlag = 0;
    m_dwLastCheckTime = 0;
    m_dwStride = 1;
    m_pDiskPower = NULL;
    m_rgbDoubleBuffer = NULL;

    m_pPort = NULL;

    // init generic structures
    InitializeCriticalSection(&m_csDisk);
    memset(&m_Id, 0, sizeof(IDENTIFY_DATA));
    memset(&m_DiskInfo, 0, sizeof(DISK_INFO));
    memset(&m_InqData, 0, sizeof(INQUIRY_DATA));
}

// ----------------------------------------------------------------------------
// Function: ~CDisk
//     Destructor
//
// Parameters:
//     None
// ----------------------------------------------------------------------------

CDisk::~CDisk(
    )
{
    if (m_hDevKey) {
        RegCloseKey(m_hDevKey);
    }

    if(m_pDiskPower != NULL) {
        delete m_pDiskPower;
    }

    DeleteCriticalSection(&m_csDisk);

    // deallocate double buffer, if present
    if (NULL != m_rgbDoubleBuffer) {
        LocalFree((HLOCAL)m_rgbDoubleBuffer);
    }
}

// ----------------------------------------------------------------------------
// Function: StallExecution
//     Stall execution for the specified period of time
//
// Parameters:
//     dwTime -
// ----------------------------------------------------------------------------

void
CDisk::StallExecution(
    DWORD dwTime
    )
{
    if ((dwTime >= 100) && (m_dwDeviceFlags & DFLAGS_DEVICE_CDROM)) {
        Sleep (dwTime / 100);
    }
    else {
        ::StallExecution(dwTime * 10);
    }
}

#define HELPER_

// These functions should be inlined or converted to macros
void CDisk::TakeCS()                    { EnterCriticalSection(&m_csDisk); }
void CDisk::ReleaseCS()                 { LeaveCriticalSection(&m_csDisk); }
void CDisk::Open()                      { InterlockedIncrement((LONG *)&m_dwOpenCount); }
void CDisk::Close()                     { InterlockedDecrement((LONG *)&m_dwOpenCount); }
BOOL CDisk::IsAtapiDevice()             { return m_fAtapiDevice; }
BOOL CDisk::IsCDRomDevice()             { return (((m_Id.GeneralConfiguration >> 8) & 0x1f) == ATA_IDDEVICE_CDROM); }
BOOL CDisk::IsDVDROMDevice()            { return TRUE; }
BOOL CDisk::IsDiskDevice()              { return (((m_Id.GeneralConfiguration >> 8) & 0x1f) == ATA_IDDEVICE_DISK); }
BOOL CDisk::IsRemoveableDevice()        { return (m_Id.GeneralConfiguration & IDE_IDDATA_REMOVABLE); }
BOOL CDisk::IsDMASupported()            { return ((m_Id.Capabilities & IDENTIFY_CAPABILITIES_DMA_SUPPORTED) && m_fDMAActive); }
BOOL CDisk::IsDRQTypeIRQ()              { return ((m_Id.GeneralConfiguration >> 5) & 0x0003) == ATA_DRQTYPE_INTRQ; }
WORD CDisk::GetPacketSize()             { return m_Id.GeneralConfiguration & 0x0003 ? 16 : 12; }
BOOL CDisk::IsValidCommandSupportInfo() { return ((m_Id.CommandSetSupported2 & (1 << 14)) && !(m_Id.CommandSetSupported2 & (1 << 15))); }
BOOL CDisk::IsWriteCacheSupported()     { return ((m_Id.CommandSetSupported1 & COMMAND_SET_WRITE_CACHE_SUPPORTED) && IsValidCommandSupportInfo()); }
BOOL CDisk::IsPMSupported()             { return (m_Id.CommandSetSupported1 & COMMAND_SET_POWER_MANAGEMENT_SUPPORTED && IsValidCommandSupportInfo()); }
BOOL CDisk::IsPMEnabled()               { return (IsPMSupported() && (m_Id.CommandSetFeatureEnabled1 & COMMAND_SET_POWER_MANAGEMENT_ENABLED)); }

// These functions are called (1x) in atamain and should be inlined
void CDisk::SetActiveKey(TCHAR *szActiveKey)
{
    wcsncpy(m_szActiveKey, szActiveKey, MAX_PATH - 1);
    m_szActiveKey[MAX_PATH - 1] = 0;
}

void CDisk::SetDeviceKey(TCHAR *szDeviceKey)
{
    wcsncpy(m_szDeviceKey, szDeviceKey, MAX_PATH - 1);
    m_szDeviceKey[MAX_PATH - 1] = 0;
}

#define _HELPER

// ----------------------------------------------------------------------------
// Function: InitController
//     Reset the controller and determine whether a device is present on the
//     channel; if a device is present, then query and store its capabilities
//
// Parameters:
//     fForce -
// ----------------------------------------------------------------------------

BOOL
CDisk::InitController(
    BOOL fForce
    )
{
    BOOL bRet = TRUE;

    // if the controller has not already been reset, then perform a soft-reset
    // to enable the channel

    if (!(m_dwDeviceFlags & DFLAGS_DEVICE_INITIALIZED)) {

        // perform a soft-reset on the controller; if we don't do this, then
        // we won't be able to detect whether or not devices are present on the
        // channel

        bRet = ResetController(FALSE);
        if (!bRet) {
            goto exit;
        }

        // if interrupt is supported, enable interrupt

        if (m_fInterruptSupported) {
            SelectDevice();
            WriteAltDriveController(ATA_CTRL_ENABLE_INTR);
            EnableInterrupt();
        }
    }

    // issue IDENTIFY DEVICE and/or IDENTIFY PACKET DEVICE

    bRet = Identify();
    if (!bRet) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
            "Atapi!CDisk::InitController> Device did not respond to identify\r\n"
            )));
        goto exit;
    }
    else {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR, (_T(
            "Atapi!CDisk::InitController> Device responded to identify\r\n"
            )));
        m_dwDeviceFlags |= DFLAGS_DEVICE_INITIALIZED;
    }

exit:;
    return bRet;
}

// ----------------------------------------------------------------------------
// Function: ConfigureRegisterBlock
//     This function is called by DSK_Init before any other CDisk function to
//     set up the register block.
//
// Parameters:
//     dwStride -
// ----------------------------------------------------------------------------

VOID
CDisk::ConfigureRegisterBlock(
    DWORD dwStride
    )
{
	
    m_dwStride = dwStride;
    m_dwDataDrvCtrlOffset = ATA_REG_DATA * dwStride;
    m_dwFeatureErrorOffset = ATA_REG_FEATURE * dwStride;
    m_dwSectCntReasonOffset = ATA_REG_SECT_CNT * dwStride;
    m_dwSectNumOffset = ATA_REG_SECT_NUM * dwStride;
    m_dwDrvHeadOffset = ATA_REG_DRV_HEAD * dwStride;
    m_dwCommandStatusOffset = ATA_REG_COMMAND * dwStride;
    m_dwByteCountLowOffset = ATA_REG_BYTECOUNTLOW * dwStride;
    m_dwByteCountHighOffset = ATA_REG_BYTECOUNTHIGH * dwStride;
    m_dwAltStatusOffset = ATA_REG_ALT_STATUS_CS1 * dwStride;
    m_dwAltDrvCtrl = ATA_REG_DRV_CTRL_CS1 * dwStride;
}

// ----------------------------------------------------------------------------
// Function: Init
//     This function is called by the IDE/ATA controller enumerator to trigger
//     the initialization of a device
//
// Parameters:
//     hActiveKey -
// ----------------------------------------------------------------------------

BOOL
CDisk::Init(
    HKEY hActiveKey
    )
{
    BOOL fRet = FALSE;

    // replicate CDisk::ReadRegistry

    m_dwWaitCheckIter = m_pPort->m_pController->m_pIdeReg->dwStatusPollCycles;
    m_dwWaitSampleTimes = m_pPort->m_pController->m_pIdeReg->dwStatusPollsPerCycle;
    m_dwWaitStallTime = m_pPort->m_pController->m_pIdeReg->dwStatusPollCyclePause;

    m_dwDiskIoTimeOut = DEFAULT_DISK_IO_TIME_OUT;

    // replicate CDisk::ReadSettings

    m_dwUnitReadyTime = DEFAULT_MEDIA_CHECK_TIME;

    // if DMA=2 and this is not an ATAPI device, then we'll set m_fDMAActive in Identify
    if (1 == m_pPort->m_pDskReg[m_dwDeviceId]->dwDMA) { // 0=PIO, 1=DMA, 2=ATA DMA only
        m_fDMAActive = TRUE;
    }
    m_dwDMAAlign = m_pPort->m_pController->m_pIdeReg->dwDMAAlignment;

    // m_dwDeviceFlags |= DFLAGS_DEVICE_ISDVD; this is ignored

    if (m_pPort->m_pDskReg[m_dwDeviceId]->dwInterruptDriven) {
        m_fInterruptSupported = TRUE;
    }

    // initialize controller

    if (!InitController(TRUE)) {
        DEBUGMSG(ZONE_INIT, (_T(
            "Atapi!CDisk::Init> Failed to initialize device\r\n"
            )));
        goto exit;
    }

    // set write cache mode, if write cache mode supported

    if (m_Id.CommandSetSupported1 & 0x20) {
        if (SetWriteCacheMode(m_pPort->m_pDskReg[m_dwDeviceId]->dwWriteCache)) {
            if (m_pPort->m_pDskReg[m_dwDeviceId]->dwWriteCache) {
                m_dwDeviceFlags |= DFLAGS_USE_WRITE_CACHE;
                DEBUGMSG(ZONE_INIT, (_T(
                    "Atapi!CDisk::Init> Enabled write cache\r\n"
                    )));
            }
            else {
                m_dwDeviceFlags &= ~DFLAGS_USE_WRITE_CACHE;
                DEBUGMSG(ZONE_INIT, (_T(
                    "Atapi!CDisk::Init> Disabled on device write cache\r\n"
                    )));
            }
        }
        else {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Failed to set write cache mode\r\n"
                )));
        }
    }

    // set read look-ahead, if read look-ahead supported

    if ((m_Id.CommandSetSupported1 & 0x40) && m_pPort->m_pDskReg[m_dwDeviceId]->dwLookAhead) {
        if (SetLookAhead()) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Enabled read look-ahead\r\n"
                )));
        }
        else {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Failed to enable read look-ahead\r\n"
                )));
        }
    }

    // set transfer mode, if a specific transfer mode was specified in the
    // device's instance key

    BYTE bTransferMode = (BYTE)m_pPort->m_pDskReg[m_dwDeviceId]->dwTransferMode;
    if (0xFF != bTransferMode) {
        if (0x00 == bTransferMode) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Selecting PIO default mode(0x%x)\r\n"
                ), bTransferMode));
        }
        else if (0x01 == bTransferMode) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Selecting PIO default mode(0x%x); disabled IORDY\r\n"
                ), bTransferMode));
        }
        else if ((bTransferMode & 0xF8) == 0x08) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Selecting PIO flow control mode %d (0x%x)\r\n"
                ), (bTransferMode & 0x08), bTransferMode));
        }
        else if ((bTransferMode & 0xF0) == 0x20) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Selecting Multi-word DMA mode %d (0x%x)\r\n"
                ), bTransferMode, bTransferMode));
        }
        else if ((bTransferMode & 0xF0) == 0x40) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Selecting Ultra DMA mode %d (0x%x)\r\n"
                ), bTransferMode, bTransferMode));
        }
        else {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Unknown transfer mode(0x%x)\r\n"
                ), bTransferMode));
        }
        // @bTransferMode is a valid transfer mode
        if (!SetTransferMode(bTransferMode)) {
            DEBUGMSG(ZONE_INIT, (_T(
                "Atapi!CDisk::Init> Failed to set transfer mode(0x%x)\r\n"
                ), bTransferMode));
        }
    }

    fRet = TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本高清成人免费播放| 成人午夜电影网站| 午夜久久久久久久久| 日韩毛片在线免费观看| 麻豆久久一区二区| 精品成人私密视频| 日韩有码一区二区三区| 亚洲精品在线观看视频| 日韩欧美国产电影| 奇米精品一区二区三区四区| 夜夜嗨av一区二区三区中文字幕 | 国产麻豆欧美日韩一区| 久久精品国产亚洲aⅴ| 日韩二区三区四区| 韩国av一区二区| 国产河南妇女毛片精品久久久| 精品一区二区精品| 成人性色生活片免费看爆迷你毛片| 懂色av一区二区三区蜜臀| 成人综合在线观看| 色婷婷精品久久二区二区蜜臂av | 欧美亚洲综合另类| 91精品欧美一区二区三区综合在| 日韩手机在线导航| 欧美国产精品一区二区| 亚洲精品久久久久久国产精华液| 一区二区三区四区不卡在线 | xfplay精品久久| 中文字幕亚洲区| 亚洲6080在线| 国产成人h网站| 日本电影亚洲天堂一区| 日韩午夜在线观看视频| 欧美国产精品劲爆| 亚洲一二三区在线观看| 国产一区二区伦理| 久久99久久99| 自拍偷在线精品自拍偷无码专区| 99久久综合99久久综合网站| 精品在线视频一区| 色妞www精品视频| 欧美一区二区在线视频| 国产午夜精品久久| 日韩极品在线观看| 成人免费av网站| 日韩欧美一区二区三区在线| 国产精品国产三级国产aⅴ入口| 日日噜噜夜夜狠狠视频欧美人 | 亚洲少妇中出一区| 久久成人精品无人区| 91麻豆国产在线观看| 精品国产乱子伦一区| 亚洲最快最全在线视频| 欧美精品一区二区三区一线天视频| 99久久免费精品| 国产主播一区二区| 欧美日韩欧美一区二区| 国产精品国产自产拍高清av| 蜜桃视频在线一区| 欧美伊人久久大香线蕉综合69| 国产午夜三级一区二区三| 日本成人在线看| 欧美色电影在线| 亚洲麻豆国产自偷在线| 成人午夜私人影院| 国产日韩av一区| 老鸭窝一区二区久久精品| 欧美性生活久久| 亚洲精品国产精品乱码不99| 成人丝袜18视频在线观看| 久久久精品人体av艺术| 国内精品免费在线观看| 日韩精品专区在线| 麻豆久久久久久| 欧美成人video| 久久 天天综合| 欧美xxxxxxxx| 国产伦精品一区二区三区免费| 69成人精品免费视频| 国产亚洲午夜高清国产拍精品 | 亚洲国产精品一区二区www | 亚洲狠狠爱一区二区三区| 99这里都是精品| 日韩美女啊v在线免费观看| 99久久综合国产精品| 亚洲欧美日韩中文播放| 色哟哟一区二区| 一区二区三区四区在线播放| 色8久久精品久久久久久蜜| 亚洲午夜在线电影| 欧美一区二区啪啪| 国精产品一区一区三区mba桃花| 精品成人佐山爱一区二区| 国产一区二区美女诱惑| 中文字幕在线不卡一区 | 欧美精品自拍偷拍动漫精品| 午夜成人免费电影| 久久亚洲综合av| 99久久综合狠狠综合久久| 亚洲女性喷水在线观看一区| 精品视频全国免费看| 免费欧美在线视频| 久久麻豆一区二区| 91国偷自产一区二区使用方法| 日韩专区中文字幕一区二区| 精品少妇一区二区三区日产乱码 | 国产精品美女www爽爽爽| 色偷偷成人一区二区三区91| 日本不卡中文字幕| 国产日产欧美一区二区视频| 欧日韩精品视频| 狠狠色丁香婷婷综合| 一区二区三区毛片| 2021国产精品久久精品| 91麻豆国产自产在线观看| 麻豆精品国产传媒mv男同| 国产精品视频观看| 678五月天丁香亚洲综合网| 国产精品一区二区久激情瑜伽| 亚洲欧美日韩在线| 久久精品欧美日韩| 欧美精品一卡两卡| 99精品在线观看视频| 久久99精品久久久久婷婷| 亚洲男人天堂av网| 国产调教视频一区| 这里只有精品99re| 日本高清不卡视频| 国产成人在线视频免费播放| 午夜久久久久久久久| 最新国产精品久久精品| 99精品视频在线免费观看| 欧美国产日韩一二三区| 国产精品久久久久久久久晋中| 91福利精品视频| 国产福利一区二区三区视频在线 | 91在线视频网址| 国产老妇另类xxxxx| 婷婷一区二区三区| 一区二区三区在线免费| 中文字幕制服丝袜一区二区三区 | 亚洲日本电影在线| 国产日韩欧美不卡| 亚洲精品一区二区在线观看| 91麻豆精品国产自产在线| 91高清视频免费看| 91美女福利视频| 成人激情综合网站| 国产99久久久国产精品潘金| 九色porny丨国产精品| 日韩国产成人精品| 一区二区三区在线播| 亚洲黄色免费网站| 伊人婷婷欧美激情| 伊人婷婷欧美激情| 亚洲成人一区二区在线观看| 亚洲综合久久久久| 亚洲二区在线观看| 日韩激情一二三区| 日av在线不卡| 黄色日韩网站视频| 国产精品一区二区不卡| 懂色av一区二区夜夜嗨| gogogo免费视频观看亚洲一| 99国产精品一区| 在线观看免费视频综合| 欧美日韩你懂得| 日韩午夜在线影院| 日本一区免费视频| 中文字幕一区在线| 亚洲一区二区三区自拍| 午夜欧美大尺度福利影院在线看| 日韩制服丝袜av| 精品一区二区三区日韩| 国产精品亚洲午夜一区二区三区| 国产成人午夜精品5599| 99视频一区二区三区| 欧美天堂一区二区三区| 欧美一二三区在线观看| 久久精品无码一区二区三区| 国产精品免费视频网站| 亚洲成人免费观看| 国产在线国偷精品产拍免费yy| 成人精品亚洲人成在线| 色偷偷久久一区二区三区| 日韩视频一区二区三区在线播放| 久久毛片高清国产| 亚洲国产va精品久久久不卡综合| 麻豆精品一区二区| 97久久精品人人做人人爽| 欧美精品色综合| 国产精品网站在线观看| 亚洲香蕉伊在人在线观| 国产精品羞羞答答xxdd| 欧美人伦禁忌dvd放荡欲情| 国产日本欧美一区二区| 婷婷综合在线观看| 97久久精品人人做人人爽50路| 日韩久久精品一区| 亚洲影视在线观看|