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

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

?? atapipm.cpp

?? WinCE5.0BSP for Renesas SH7770
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// 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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91丝袜在线播放0| 日韩视频免费观看高清在线视频| 午夜精品久久一牛影视| 久久久久高清精品| 欧美高清hd18日本| 91香蕉视频mp4| 韩国欧美国产1区| 日韩专区中文字幕一区二区| 国产精品久久久久影视| 亚洲精品一区二区三区福利 | 99综合电影在线视频| 免费成人结看片| 亚洲图片自拍偷拍| 亚洲女同一区二区| 中文字幕精品一区二区精品绿巨人| 91麻豆精品91久久久久同性| 在线观看日产精品| 成人免费看视频| 国产91在线观看| 国产精品一区二区视频| 久久av资源站| 久久精品国产网站| 免费高清视频精品| 美国毛片一区二区三区| 五月天中文字幕一区二区| 亚洲精品伦理在线| 综合在线观看色| 亚洲人成精品久久久久久 | 亚洲国产精品v| 久久精品视频在线免费观看| 日韩精品一区二区三区四区| 欧美一区二区三区性视频| 在线播放一区二区三区| 欧美日韩高清在线播放| 欧美区在线观看| 777精品伊人久久久久大香线蕉| 91黄色免费网站| 在线亚洲高清视频| 欧美日韩国产a| 日韩一级在线观看| 欧美精品一区二| 国产蜜臀av在线一区二区三区| 国产精品系列在线| 亚洲色图视频网| 亚洲国产毛片aaaaa无费看| 亚洲国产三级在线| 午夜久久久影院| 日本不卡高清视频| 国产一区二区美女| 成人黄色免费短视频| 9人人澡人人爽人人精品| 日本久久一区二区| 欧美日本国产一区| 欧美变态口味重另类| 欧美激情综合网| 亚洲女爱视频在线| 视频一区视频二区中文| 麻豆精品新av中文字幕| 国产在线不卡视频| 91同城在线观看| 欧美美女视频在线观看| 欧美大片日本大片免费观看| 国产偷国产偷亚洲高清人白洁| 中文字幕综合网| 日韩福利视频导航| 岛国精品在线观看| 在线观看日产精品| 日韩精品一区二区三区在线观看| 国产喂奶挤奶一区二区三区| 一区二区三区自拍| 极品少妇一区二区三区精品视频| 大胆亚洲人体视频| 欧美肥胖老妇做爰| 亚洲国产精品黑人久久久| 亚洲成精国产精品女| 国产一区二区日韩精品| 在线日韩一区二区| 久久综合av免费| 亚洲一区二区视频在线| 精品系列免费在线观看| 91首页免费视频| 欧美mv日韩mv国产网站| 日本sm残虐另类| 成人午夜视频在线观看| 欧美精品精品一区| 成人欧美一区二区三区| 青青草视频一区| 91丨九色丨尤物| 久久亚洲春色中文字幕久久久| 亚洲色图清纯唯美| 韩国成人在线视频| 欧美精品高清视频| 亚洲欧美影音先锋| 国产一区999| 3d动漫精品啪啪1区2区免费| 亚洲欧洲99久久| 国产精品一区三区| 91麻豆精品国产自产在线| 亚洲欧洲另类国产综合| 激情丁香综合五月| 欧美电影影音先锋| 一区二区在线观看免费| 国产成人av电影在线观看| 欧美放荡的少妇| 亚洲午夜三级在线| av影院午夜一区| 久久亚区不卡日本| 久久99精品久久久久婷婷| 欧美日韩国产精品成人| 亚洲黄色免费电影| 成人动漫av在线| 久久久久久久久久久黄色| 青青草精品视频| 91精品久久久久久久久99蜜臂| 依依成人精品视频| 91亚洲男人天堂| 国产精品人妖ts系列视频| 国产综合久久久久久鬼色| 91精品国产综合久久久久久久 | 99久久精品国产网站| 久久久99精品久久| 精品一区二区三区免费播放| 欧美一区二区网站| 日韩不卡一区二区| 欧美三级日韩三级| 亚洲综合男人的天堂| 在线观看日产精品| 亚洲精品乱码久久久久久日本蜜臀| 成人国产精品免费观看| 中文字幕不卡三区| 国产91高潮流白浆在线麻豆| 国产视频亚洲色图| 国产成人丝袜美腿| 日本一区二区三区国色天香| 精品一区二区三区在线播放视频| 日韩你懂的在线播放| 久久se精品一区精品二区| 亚洲精品在线网站| 国产传媒一区在线| 国产精品丝袜91| 91在线视频官网| 亚洲国产一区二区视频| 91麻豆精品久久久久蜜臀| 久久99在线观看| 国产色一区二区| 99久久99久久精品国产片果冻| 亚洲伦理在线免费看| 欧美三级乱人伦电影| 日韩激情一区二区| 精品1区2区在线观看| 成人综合婷婷国产精品久久| 日本 国产 欧美色综合| www久久精品| 99麻豆久久久国产精品免费| 亚洲国产一二三| 日韩欧美在线不卡| 国产成人av一区二区三区在线 | 欧美一区午夜视频在线观看| 美腿丝袜亚洲综合| 国产精品视频一二三| 色成人在线视频| 美女尤物国产一区| 国产精品国产a| 欧美性色aⅴ视频一区日韩精品| 日韩综合一区二区| 中文一区在线播放| 欧美三级日韩在线| 国产又黄又大久久| 夜夜精品浪潮av一区二区三区| 欧美色电影在线| 国产福利电影一区二区三区| 亚洲欧美激情视频在线观看一区二区三区 | 日本不卡123| 国产精品久久久久一区二区三区共 | 黑人精品欧美一区二区蜜桃| 中文字幕一区二区三区在线播放 | 一区二区三区精品在线观看| 91精品麻豆日日躁夜夜躁| 国产宾馆实践打屁股91| 亚洲狠狠爱一区二区三区| 久久久精品国产免费观看同学| 91香蕉视频黄| 黑人精品欧美一区二区蜜桃| 亚洲乱码国产乱码精品精98午夜| 欧美一区二区日韩一区二区| 9l国产精品久久久久麻豆| 激情欧美一区二区| 亚洲综合视频在线| 久久午夜电影网| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 久久精品国内一区二区三区| 一区二区三区成人在线视频| 久久毛片高清国产| 制服丝袜中文字幕亚洲| 91视视频在线直接观看在线看网页在线看| 青青草原综合久久大伊人精品 | 国产欧美日韩中文久久| 欧美日韩精品是欧美日韩精品| 成人av在线资源网| 九色综合狠狠综合久久|