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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? atapipm.cpp

?? 三星2410,WinCE5.0下的硬盤IDE驅(qū)動(dòng).
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
//
// 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>

#define dim(x)      (sizeof(x) / sizeof(x[0]))
 
static BOOL 
HexStringToDword(LPCWSTR FAR& lpsz, DWORD FAR& Value,
                 int cDigits, WCHAR chDelim)
{
    int Count;
    
    Value = 0;
    for (Count = 0; Count < cDigits; Count++, lpsz++)
    {
        if (*lpsz >= '0' && *lpsz <= '9')
            Value = (Value << 4) + *lpsz - '0';
        else if (*lpsz >= 'A' && *lpsz <= 'F')
            Value = (Value << 4) + *lpsz - 'A' + 10;
        else if (*lpsz >= 'a' && *lpsz <= 'f')
            Value = (Value << 4) + *lpsz - 'a' + 10;
        else
            return(FALSE);
    }
    
    if (chDelim != 0)
        return *lpsz++ == chDelim;
    else
        return TRUE;
}


static BOOL 
wUUIDFromString(LPCWSTR lpsz, LPGUID pguid)
{
    DWORD dw;
    
    if (!HexStringToDword(lpsz, pguid->Data1, sizeof(DWORD)*2, '-'))
        return FALSE;
    
    if (!HexStringToDword(lpsz, dw, sizeof(WORD)*2, '-'))
        return FALSE;
    
    pguid->Data2 = (WORD)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(WORD)*2, '-'))
        return FALSE;
    
    pguid->Data3 = (WORD)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[0] = (BYTE)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, '-'))
        return FALSE;
    
    pguid->Data4[1] = (BYTE)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[2] = (BYTE)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[3] = (BYTE)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[4] = (BYTE)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[5] = (BYTE)dw;
    
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[6] = (BYTE)dw;
    if (!HexStringToDword(lpsz, dw, sizeof(BYTE)*2, 0))
        return FALSE;
    
    pguid->Data4[7] = (BYTE)dw;
    
    return TRUE;
}

static BOOL 
GUIDFromString(LPCWSTR lpsz, LPGUID pguid)
{
    if (*lpsz++ != '{' )
        return FALSE;
    
    if(wUUIDFromString(lpsz, pguid) != TRUE)
        return FALSE;
    
    lpsz +=36;
    
    if (*lpsz++ != '}' )
        return FALSE;
    
    return TRUE;
}


CDiskPower::CDiskPower(void) :
        m_curDx(D0),
        m_timeoutDx(D2),
        m_fBoostRequested(FALSE),
        m_fReductionRequested(FALSE),
        m_dwPowerTimeout(1000),
        m_htPower(NULL),
        m_hevPowerSignal(NULL),
        m_fShutdownPowerThread(FALSE),
        m_PowerThreadPriority(250),     // THREAD_PRIORITY_ABOVE_NORMAL
        m_pDisk(NULL),
        m_pszPMName(NULL),
        m_UseCount(0),
        m_pfnDevicePowerNotify(NULL)
{
    memset(&m_dxInfo, 0, sizeof(m_dxInfo));
    m_dwStartTickCount = GetTickCount();
    QueryPerformanceCounter(&m_startQPC);
    m_dxInfo[m_curDx].dwCount++;
    InitializeCriticalSection(&m_csPower);
}

CDiskPower::~CDiskPower(void)
{
    if(m_htPower) {
        DEBUGCHK(m_hevPowerSignal);
        m_fShutdownPowerThread = TRUE;
        SignalActivity();
        WaitForSingleObject(m_htPower, INFINITE);
        CloseHandle(m_htPower);
    }
    if(m_hevPowerSignal) {
        CloseHandle(m_hevPowerSignal);
    }
    if(m_hevDummy) {
        CloseHandle(m_hevDummy);
    }
    if(m_pszPMName) {
        LocalFree((LPWSTR) m_pszPMName);    // cast to remove const
    }
        
    DeleteCriticalSection(&m_csPower);
}

// Note: the caller should own the parent disk device's critical section
void CDiskPower::TakeCS(void) 
{ 
    EnterCriticalSection(&m_csPower); 
}

void CDiskPower::ReleaseCS(void) 
{ 
    LeaveCriticalSection(&m_csPower); 
}

// this routine wakes the power timeout thread
void CDiskPower::SignalActivity(void) 
{
    DEBUGCHK(m_hevPowerSignal);
    DEBUGCHK(m_htPower);
    SetEvent(m_hevPowerSignal);
}

// This routine marks the disk as in use.  If it is powered down,
// it spins it up and waits for it to become ready.  The caller
// must hold the disk critical section.
BOOL CDiskPower::RequestDevice(void)
{
    BOOL fOk = TRUE;
    PREFAST_DEBUGCHK(m_pfnDevicePowerNotify != NULL);

    TakeCS();

    // is the disk powered up?
    if(m_curDx != D0) {
        // don't bother requesting from the PM if we've already asked in a previous request
        DEBUGMSG(ZONE_POWER, (_T("CDiskPower::RequestDevice: device at D%d, m_fBoostRequested is %d\r\n"), m_curDx, m_fBoostRequested));
        if(!m_fBoostRequested) {
            // request that the PM make us available
            m_fBoostRequested = TRUE;
            DWORD dwStatus = m_pfnDevicePowerNotify((PVOID) m_pszPMName, D0, POWER_NAME);
            if(dwStatus != ERROR_SUCCESS) {
                DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::RequestDevice: DevicePowerNotify('%s') failed %d\r\n"), m_pszPMName, dwStatus));
                m_fBoostRequested = FALSE;
                fOk = FALSE;
            }
        }
    }

    if(m_curDx == D0) {
        // wait for the disk to spin up so that we can do I/O
        DEBUGCHK(m_UseCount == 0);
        m_UseCount++;
    } else {
        fOk = FALSE;
    }

    ReleaseCS();
    
    return fOk;
}

// This API signals that the caller is done doing I/O.  The caller must hold the 
// parent disk's critical section.
void CDiskPower::ReleaseDevice(void)
{
    PREFAST_DEBUGCHK(m_pfnDevicePowerNotify);
    
    TakeCS();

    // update the usage counter
    DEBUGCHK(m_UseCount != 0);
    m_UseCount--;
    DEBUGCHK(m_UseCount == 0);

    // wake the timeout thread to restart its countdown
    SignalActivity();
    if(m_fReductionRequested) {
        // cancel outstanding requests to spin down the disk
        DWORD dwStatus = m_pfnDevicePowerNotify((PVOID) m_pszPMName, D0, POWER_NAME);
        if(dwStatus != ERROR_SUCCESS) {
            DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::DiskPowerThread: DevicePowerNotify('%s', D%d) failed %d\r\n"), m_pszPMName, D0, dwStatus));
        } else {
            m_fReductionRequested = FALSE;
        }
    }    
    ReleaseCS();
}

DWORD CDiskPower::DiskPowerThread(void)
{
    BOOL fDone = FALSE;
    DWORD dwTimeout = m_dwPowerTimeout;
    HANDLE hev = m_hevPowerSignal;

    PREFAST_DEBUGCHK(m_pfnDevicePowerNotify != NULL);
    DEBUGCHK(m_hevPowerSignal);
    DEBUGCHK(m_hevDummy);

    DEBUGMSG(ZONE_INIT, (_T("CDiskPower::DiskPowerThread: starting up for '%s', timeout is %d ms\r\n"), m_pszPMName, m_dwPowerTimeout));

    while(!fDone) {
        //DEBUGMSG(ZONE_POWER, (_T("CDiskPower::DiskPowerThread: waiting on '%s', timeout is %u\r\n"), m_pszPMName, dwTimeout));
        DWORD dwStatus = WaitForSingleObject(hev, dwTimeout);
        //DEBUGMSG(ZONE_POWER, (_T("CDiskPower::DiskPowerThread: WaitForSingleObject() returned %u\r\n"), dwStatus));
        switch(dwStatus) {
        case WAIT_OBJECT_0:
            // are we supposed to exit?
            if(m_fShutdownPowerThread) {
                DEBUGMSG(ZONE_INIT, (_T("CDiskPower::DiskPowerThread: shutdown event signaled\r\n")));
                fDone = TRUE;
            } else {
                // ignore further activity until the timeout expires
                TakeCS();               // Note: if you take the disk cs here, take it first
                DEBUGMSG(ZONE_POWER, (_T("CDiskPower::DiskPowerThread: disk activity detected on '%s', use count is %d\r\n"), m_pszPMName, m_UseCount));
                DEBUGCHK(hev != m_hevDummy);
                hev = m_hevDummy;
                dwTimeout = m_dwPowerTimeout;
                ReleaseCS();
            }
            break;
        case WAIT_TIMEOUT:
            // inactivity timeout -- see if we should spin down the disk
            m_pDisk->TakeCS();
            TakeCS();

            // we should be the only thread in the driver at this point
            DEBUGCHK(m_UseCount == 0);

            // By the time we have acquired these critical sections, we may have seen
            // some disk activity from an I/O thread that held them previously.  Check
            // for this by polling our timeout event.
            if(WaitForSingleObject(m_hevPowerSignal, 0) == WAIT_TIMEOUT) {
                // don't bother asking the PM if we've already requested to spin down
                DEBUGMSG(ZONE_POWER, (_T("CDiskPower::DiskPowerThread: no disk activity on '%s', m_fReductionRequested is %d\r\n"), m_pszPMName, m_fReductionRequested));
                if(!m_fReductionRequested) {
                    // spin down the disk to m_timeoutDx
                    m_fReductionRequested = TRUE;
                    dwStatus = m_pfnDevicePowerNotify((PVOID) m_pszPMName, m_timeoutDx, POWER_NAME);
                    if(dwStatus != ERROR_SUCCESS) {
                        DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::DiskPowerThread: DevicePowerNotify('%s', D%d) failed %d\r\n"), m_pszPMName, m_timeoutDx, dwStatus));
                        m_fReductionRequested = FALSE;
                    }
                }

                // no need for more timeouts until the disk spins up again
                hev = m_hevPowerSignal;
                dwTimeout = INFINITE;
            } else {
                DEBUGMSG(ZONE_POWER, (_T("CDiskPower::DiskPowerThread: activity on '%s' after timeout, device at D%d\r\n"), m_pszPMName, m_curDx));
                DEBUGCHK(hev == m_hevDummy);

                // if we are already at or below the spin-down disk power state we don't need
                // to have a timeout.  The comparison relies on the fact that D0 >= Dx >= D4.
                if(m_curDx < m_timeoutDx) {
                    dwTimeout = m_dwPowerTimeout;
                } else {
                    dwTimeout = INFINITE;
                }

                // if we are not spun up, allow disk activity to wake us up
                if(m_curDx != D0) {
                    hev = m_hevPowerSignal;
                }
            }

            // release resources
            ReleaseCS();
            m_pDisk->ReleaseCS();
            break;
        default:
            DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::DiskPowerThread: WaitForSingleObject() returned %d, error %d\r\n"), dwStatus, GetLastError()));
            break;
        }
    }

    DEBUGMSG(ZONE_INIT, (_T("CDiskPower::DiskPowerThread: all done\r\n")));
    return 0;
}

DWORD CDiskPower::DiskPowerThreadStub(LPVOID lpvParam)
{
    PREFAST_DEBUGCHK(lpvParam != NULL);
    CDiskPower *pDiskPower = (CDiskPower *) lpvParam;
    DWORD dwStatus = pDiskPower->DiskPowerThread();
    return dwStatus;
}

// This routine is called during IOCTL_POWER_CAPABILITIES processing.  It 
// returns TRUE if successful and FALSE if not.  The caller is expected to
// destroy the CDiskPower object if this routine fails.
BOOL CDiskPower::Init(CDisk *pDiskParent)
{
    DWORD dwStatus;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va国产天堂va久久en| 日本成人在线网站| 欧美人妇做爰xxxⅹ性高电影| 国内精品不卡在线| 亚洲专区一二三| 日本一区二区成人在线| 欧美人体做爰大胆视频| 97久久精品人人做人人爽50路| 另类小说一区二区三区| 亚洲一区二区在线播放相泽| 国产欧美精品一区| 日韩色视频在线观看| 国产欧美日本一区视频| 6080日韩午夜伦伦午夜伦| 91视频www| 国产成人aaa| 国模少妇一区二区三区| 午夜精品免费在线观看| 亚洲激情欧美激情| 综合久久久久久久| 国产欧美一区二区精品性色| 欧美sm极限捆绑bd| 在线电影欧美成精品| 欧美亚洲禁片免费| 色综合久久中文综合久久牛| 国产**成人网毛片九色 | 亚洲成a人片在线不卡一二三区| 欧美国产在线观看| 久久久99精品免费观看不卡| 日韩精品一区二区三区四区| 欧美情侣在线播放| 欧美男生操女生| 欧美日韩午夜在线视频| 在线观看国产日韩| 色噜噜狠狠成人中文综合| 北条麻妃国产九九精品视频| 成人午夜av电影| 夫妻av一区二区| 大尺度一区二区| 大白屁股一区二区视频| av成人老司机| 91首页免费视频| 在线精品国精品国产尤物884a| 91麻豆国产福利精品| 色婷婷一区二区三区四区| 91色|porny| 欧美怡红院视频| 欧美日韩国产三级| 日韩视频国产视频| 精品粉嫩超白一线天av| 久久久欧美精品sm网站| 国产精品午夜在线| 成人欧美一区二区三区小说 | 极品美女销魂一区二区三区免费| 青青草视频一区| 韩国精品在线观看| 成人免费毛片嘿嘿连载视频| 波多野结衣在线一区| 91久久精品网| 91精品中文字幕一区二区三区| 日韩亚洲国产中文字幕欧美| 2020日本不卡一区二区视频| 日本一区二区三区电影| 亚洲同性gay激情无套| 亚洲一区二区三区美女| 日本免费在线视频不卡一不卡二| 国产专区欧美精品| 99久久精品国产导航| 欧美婷婷六月丁香综合色| 欧美一区二区三区精品| 久久综合色鬼综合色| 亚洲婷婷综合久久一本伊一区| 亚洲成人1区2区| 国产做a爰片久久毛片 | 亚洲欧美视频在线观看视频| 夜夜亚洲天天久久| 久久超碰97人人做人人爱| 懂色av一区二区三区免费观看 | 美女国产一区二区| 国产成人综合视频| 日本精品视频一区二区三区| 日韩视频中午一区| 日韩伦理电影网| 麻豆精品蜜桃视频网站| 91丨porny丨最新| 欧美一区二区精美| 成人免费一区二区三区视频| 男女男精品视频| 99久久综合狠狠综合久久| 正在播放亚洲一区| 国产精品剧情在线亚洲| 青娱乐精品在线视频| 99精品久久免费看蜜臀剧情介绍| 91精品国模一区二区三区| 国产精品国产精品国产专区不蜜 | 久久久午夜精品理论片中文字幕| 亚洲视频电影在线| 国产揄拍国内精品对白| 欧美亚洲禁片免费| 国产精品久久久久久久久果冻传媒| 丝袜美腿亚洲色图| 91色九色蝌蚪| 国产午夜精品久久久久久久 | 国产一区二三区好的| 在线观看三级视频欧美| 日本一区二区三区国色天香 | 日韩电影免费在线看| 91在线观看视频| 国产亚洲综合色| 老司机免费视频一区二区| 色丁香久综合在线久综合在线观看| 国产亚洲一区字幕| 麻豆精品在线观看| 在线不卡一区二区| 亚洲影视在线播放| 97久久久精品综合88久久| 久久久久国产成人精品亚洲午夜| 天天av天天翘天天综合网| 91丨九色丨蝌蚪富婆spa| 国产日韩精品一区二区浪潮av | 日韩欧美中文字幕公布| 欧美高清一级片在线观看| 狠狠久久亚洲欧美| 欧美一卡二卡在线观看| 99精品视频一区| 久久蜜桃一区二区| 久久精品国产秦先生| 欧美一区二区日韩一区二区| 日韩精品一级二级| 91精品欧美久久久久久动漫| 亚洲成人动漫在线观看| 色欧美日韩亚洲| 亚洲精选视频免费看| 91丨九色丨国产丨porny| 亚洲欧洲制服丝袜| 色噜噜狠狠色综合欧洲selulu| 亚洲欧美另类小说| 99久久精品一区| 亚洲天堂av一区| 色嗨嗨av一区二区三区| 一区二区三区小说| 欧美三级电影网| 日韩国产欧美在线视频| 日韩三级在线免费观看| 久国产精品韩国三级视频| 日韩丝袜美女视频| 国产中文字幕精品| 中文字幕第一区二区| 99久久99久久综合| 一区二区在线观看视频在线观看| 在线亚洲精品福利网址导航| 亚洲午夜精品在线| 欧美一级生活片| 久久99国内精品| 欧美国产1区2区| 91福利资源站| 日韩精品欧美精品| 久久久久久99久久久精品网站| 高清国产一区二区三区| 亚洲欧美日韩国产成人精品影院| 欧美优质美女网站| 日韩不卡手机在线v区| 久久久另类综合| eeuss国产一区二区三区| 亚洲成a人v欧美综合天堂| 日韩欧美视频在线| 大胆亚洲人体视频| av中文字幕不卡| 亚洲成人免费在线观看| 欧美zozo另类异族| 97久久精品人人做人人爽| 视频精品一区二区| 国产色综合一区| 欧美性一级生活| 黄页网站大全一区二区| 亚洲人妖av一区二区| 91精品在线免费| 99久久精品99国产精品| 日精品一区二区| 中文字幕高清不卡| 欧美日韩高清一区二区| 国产成人日日夜夜| 亚洲成人你懂的| 亚洲国产精品成人综合| 欧美日韩成人综合| 成人精品国产福利| 日韩国产在线一| 中文字幕一区二区不卡 | 欧美成人精品福利| 色婷婷国产精品| 国产一区二区福利| 一区二区三区不卡在线观看 | 国产精品久久久99| 91精品国产综合久久久久久| 不卡大黄网站免费看| 激情综合色综合久久| 亚洲成人激情社区| 日韩一区有码在线| 久久久久国产精品厨房| 91精品在线麻豆|