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

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

?? atapipm.cpp

?? 三星2410,WinCE5.0下的硬盤IDE驅(qū)動.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
    GUID gPMClass;
    int nPriority = 250;    // THREAD_PRIORITY_ABOVE_NORMAL
    HANDLE hActive = NULL;
    BOOL fOk = TRUE;

    PREFAST_DEBUGCHK(pDiskParent != NULL);
    DEBUGMSG(ZONE_INIT, (_T("+CDiskPower::Init(): parent is 0x%08x\r\n"), pDiskParent));

    // record the parent device
    m_pDisk = pDiskParent;

    // get a pointer to the PM APIs we need
    if(fOk) {
        HMODULE hmCoreDll = LoadLibrary(L"coredll.dll");
        if(hmCoreDll == NULL) {
            DEBUGMSG(ZONE_INIT || ZONE_ERROR, (_T("CDevicePower::Init: LoadLibrary('coredll.dll') failed %d\r\n"), GetLastError()));
            fOk = FALSE;
        } else {
            m_pfnDevicePowerNotify = (DWORD ((*)(PVOID, CEDEVICE_POWER_STATE, DWORD))) GetProcAddress(hmCoreDll, L"DevicePowerNotify");
            if(m_pfnDevicePowerNotify == NULL) {
                DEBUGMSG(ZONE_INIT || ZONE_ERROR, (_T("CDevicePower::Init: GetProcAddress('DevicePowerNotify') failed %d\r\n"), GetLastError()));
                fOk = FALSE;
            }
            // we're explicitly linked with coredll so we don't need the handle
            FreeLibrary(hmCoreDll);
        }
    }

    // read registry configuration
    if(fOk) {
        HKEY hk;
        BOOL fGotClass = FALSE;
        WCHAR szClass[64];     // big enough for a GUID

        // determine the power class we are advertising
        dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, m_pDisk->m_szDeviceKey, 0, 0, &hk);
        if(dwStatus == ERROR_SUCCESS) {
            // read the PM class
            DWORD dwSize = sizeof(szClass);
            dwStatus = RegQueryValueEx(hk, L"PowerClass", NULL, NULL, (LPBYTE) szClass, &dwSize);
            if(dwStatus == ERROR_SUCCESS) {
                fGotClass = TRUE;
            }

            // get the inactivity timeout
            DWORD dwValue;
            dwSize = sizeof(dwValue);
            dwStatus = RegQueryValueEx(hk, L"InactivityTimeout", NULL, NULL, (LPBYTE) &dwValue, &dwSize);
            if(dwStatus == ERROR_SUCCESS) {
                m_dwPowerTimeout = dwValue;
            }
            DEBUGMSG(ZONE_INIT, (_T("CDiskPower::Init: inactivity timeout is %u ms\r\n"), m_dwPowerTimeout));
            
            // get the inactivity timeout
            dwSize = sizeof(dwValue);
            dwStatus = RegQueryValueEx(hk, L"TimeoutDx", NULL, NULL, (LPBYTE) &dwValue, &dwSize);
            if(dwStatus == ERROR_SUCCESS) {
                if(VALID_DX((CEDEVICE_POWER_STATE)dwValue) && dwValue != D3) {
                    m_timeoutDx = (CEDEVICE_POWER_STATE) dwValue;
                } else {
                    DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::Init: invalid or unsupported timeout device power state %d (0x%x)\r\n"), dwValue, dwValue));
                }
            }
            DEBUGMSG(ZONE_INIT, (_T("CDiskPower::Init: timeout state is D%d\r\n"), m_timeoutDx));
            
            // get the inactivity timeout
            dwSize = sizeof(dwValue);
            dwStatus = RegQueryValueEx(hk, L"InactivityPriority256", NULL, NULL, (LPBYTE) &dwValue, &dwSize);
            if(dwStatus == ERROR_SUCCESS) {
                nPriority = (int) dwValue;
            }
            DEBUGMSG(ZONE_INIT, (_T("CDiskPower::Init: inactivity timeout thread priority is %d\r\n"), nPriority));
            
            RegCloseKey(hk);
        }   

        // did we get a class string?
        if(!fGotClass) {
            // no, use the default disk class
            wcsncpy(szClass, PMCLASS_BLOCK_DEVICE, dim(szClass));
            szClass[dim(szClass) - 1] = 0;
        }

        // convert to a GUID
        fOk = GUIDFromString(szClass, &gPMClass);
        if(!fOk) {
            DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: invalid power management class '%s'\r\n"),
                szClass));
        }
    }

    // get our active key from the registry
    if(fOk) {
        HKEY hk;
        dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, m_pDisk->m_szActiveKey, 0, 0, &hk);
        if(dwStatus == ERROR_SUCCESS) {
            DWORD dwValue;
            DWORD dwSize = sizeof(dwValue);
            dwStatus = RegQueryValueEx(hk, DEVLOAD_HANDLE_VALNAME, NULL, NULL, (LPBYTE) &dwValue, &dwSize);
            if(dwStatus != ERROR_SUCCESS) {
                DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: can't read '%s' from '%s'\r\n"),
                    DEVLOAD_HANDLE_VALNAME, m_pDisk->m_szActiveKey));
                fOk = FALSE;
            } else {
                DEBUGCHK(dwValue != 0);
                hActive = (HANDLE) dwValue;
            }
        }
    }

    // figure out the name we are using
    if(fOk) {
        WCHAR szName[MAX_PATH];
        DWORD dwIndex = 0;
        do {
            DWORD dwSize = sizeof(szName);
            GUID gClass;
            fOk = EnumDeviceInterfaces(hActive, dwIndex, &gClass, szName, &dwSize);
            if(fOk && gPMClass == gClass) {
                // we found the interface
                break;
            }
            dwIndex++;
        } while(fOk);
        DEBUGMSG(!fOk && (ZONE_WARNING || ZONE_INIT), (_T("CDiskPower::Init: can't find PM interface\r\n")));

        // did we find the name?
        if(fOk) {
            // yes, allocate a name buffer to use to talk to the power manager
            DWORD dwChars = wcslen(PMCLASS_BLOCK_DEVICE) + wcslen(szName) + 2;  // class + separator + name + null
            LPWSTR pszPMName = (LPWSTR) LocalAlloc(LPTR, dwChars * sizeof(WCHAR));
            fOk = FALSE;        // assume failure
            if(pszPMName) {
                HRESULT hr = StringCchPrintfW(pszPMName, dwChars, L"{%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x}\\%s",
                    gPMClass.Data1, gPMClass.Data2, gPMClass.Data3,
                    (gPMClass.Data4[0] << 8) + gPMClass.Data4[1], gPMClass.Data4[2], gPMClass.Data4[3], 
                    gPMClass.Data4[4], gPMClass.Data4[5], gPMClass.Data4[6], gPMClass.Data4[7],
                    szName);
                if(SUCCEEDED(hr)) {
                    m_pszPMName = (LPCWSTR) pszPMName;
                    fOk = TRUE;
                }
            }
            DEBUGMSG(!fOk && (ZONE_WARNING || ZONE_INIT), (_T("CDiskPower::Init: can't find PM interface\r\n")));
        }
    }

    // create an event to tell the timeout thread about activity
    if(fOk) {
        m_hevPowerSignal = CreateEvent(NULL, FALSE, FALSE, NULL);
        m_hevDummy = CreateEvent(NULL, FALSE, FALSE, NULL);
        if(!m_hevPowerSignal || !m_hevDummy) {
            DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: couldn't create status events\r\n")));
            fOk = FALSE;
        }
    }

    // create the timeout thread
    if(fOk) {
        m_htPower = CreateThread(NULL, 0, DiskPowerThreadStub, this, 0, NULL);
        if(!m_htPower) {
            DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: CreateThread() failed %d\r\n"), GetLastError()));
            fOk = FALSE;
        } else {
            BOOL fSuccess = CeSetThreadPriority(m_htPower, nPriority);
            DEBUGMSG(!fSuccess && (ZONE_WARNING || ZONE_INIT), (_T("CDiskPower::Init: CeSetThreadPriority(%d) failed %d\r\n"), nPriority, GetLastError()));
        }
    }

    // disable the standby timer, since the PM is going to be controlling
    // the disk power state
    if(fOk) {
        if(!m_pDisk->SendDiskPowerCommand(ATA_NEW_CMD_IDLE, 0)) {
            DEBUGMSG(ZONE_WARNING || ZONE_INIT, (_T("CDiskPower::Init: disable standby timer failed\r\n")));
        }
    }

    // on error, cleanup will happen in the destructor
    DEBUGMSG(ZONE_INIT, (_T("-CDiskPower::Init(): returning %d\r\n"), fOk));
    return fOk;
}

// This routine issues the ATAPI commands necessary to put the disk into a new power state.
// The caller must hold the disk critical section.
DWORD CDiskPower::SetDiskPower(CEDEVICE_POWER_STATE newDx)
{
    DWORD dwStatus = ERROR_SUCCESS;
    
    DEBUGCHK(VALID_DX(newDx));
    PREFAST_DEBUGCHK(m_pDisk != NULL);
    
    TakeCS();
    DEBUGMSG(ZONE_POWER, (_T("CDiskPower::SetDiskPower: updating from D%d to D%d\r\n"), m_curDx, newDx));
    if(newDx != m_curDx) {
        switch(newDx) {
        case D0:
        case D1:
        case D2:
            if(m_curDx == D4) {
                // have to reset and reinitialize to come out of SLEEP mode
                if(!m_pDisk->WakeUp()) {
                    DEBUGMSG(ZONE_ERROR, (_T("CDiskPower::SetDiskPower: couldn't re-initialize hard drive\r\n")));
                    dwStatus = ERROR_GEN_FAILURE;
                }
            }
            break;
        case D3:
        case D4:
            newDx = D4;         // no D3 support
            break;
        }

        // enter the new device state
        if(dwStatus == ERROR_SUCCESS && !m_pDisk->SetDiskPowerState(newDx)) {
            DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::SetDiskPower: SetDiskPowerState(D%d) failed\r\n"), newDx));
            dwStatus = ERROR_GEN_FAILURE;
        }
        
        // update the device power status
        if(dwStatus == ERROR_SUCCESS) {
            LARGE_INTEGER li;
            BOOL fGotQPC = QueryPerformanceCounter(&li);
            if(!fGotQPC) {
                DEBUGMSG(ZONE_WARNING, (_T("CDiskPower::SetDiskPower: QueryPerformanceCounter() failed, can't update statistics\r\n")));
            } else {
                m_dxInfo[m_curDx].totalQPC.QuadPart += li.QuadPart - m_startQPC.QuadPart;
            }
            m_curDx = newDx;
            m_dxInfo[m_curDx].dwCount++;
            if(fGotQPC) {
                m_startQPC = li;
            }
        }
    }

    ReleaseCS();
    return dwStatus;
}

// This routine returns the disk's current device power state.  The caller must hold the disk
// critical section.
CEDEVICE_POWER_STATE CDiskPower::GetDiskPower(void)
{
    CEDEVICE_POWER_STATE curDx;
    TakeCS();
    curDx = m_curDx;
    DEBUGMSG(ZONE_POWER, (_T("CDiskPower::GetDiskPower: returning D%d\r\n"), curDx));
    ReleaseCS();
    return curDx;
}

// This routine fills in the POWER_CAPABILITIES structure with information for this driver
DWORD CDiskPower::GetDiskCapabilities(PPOWER_CAPABILITIES pCap)
{
    DWORD dwStatus = ERROR_SUCCESS;
    
    DEBUGCHK(pCap != NULL);
    PREFAST_DEBUGCHK(m_pDisk != NULL);

    // clear the capabilities structure
    memset(pCap, 0, sizeof(*pCap));

    // has power management been enabled for this drive?
    if(!m_pDisk->IsPMEnabled()) {
        // no, just report D0 support
        pCap->DeviceDx = 0x01;
    } else {
        pCap->DeviceDx = 0x17;       // support D4, D2, D1, D0
    }

    return dwStatus;
}

// This routine handles Power Manager IOCTLs for the disk.  It returns a Win32 error
// code if there's a problem, ERROR_SUCCESS if the IOCTL was handled successfully, or 
// ERROR_NOT_SUPPORTED if the IOCTL was not from the PM.  The caller must hold the
// disk critical section.
DWORD CDiskPower::DiskPowerIoctl(PIOREQ pIOReq)
{
    DWORD dwStatus = ERROR_INVALID_PARAMETER;

    PREFAST_DEBUGCHK(pIOReq != NULL);

    switch(pIOReq->dwCode) {
    case IOCTL_POWER_CAPABILITIES:
        if(pIOReq->pOutBuf != NULL && pIOReq->dwOutBufSize >= sizeof(POWER_CAPABILITIES) && pIOReq->pBytesReturned != NULL) {
            POWER_CAPABILITIES pc;
            dwStatus = GetDiskCapabilities(&pc);
            if(dwStatus == ERROR_SUCCESS) {
                PPOWER_CAPABILITIES ppc = (PPOWER_CAPABILITIES) pIOReq->pOutBuf;
                *ppc = pc;
                *pIOReq->pBytesReturned = sizeof(*ppc);
            }
        }
        break;
    case IOCTL_POWER_SET:
        if(pIOReq->pOutBuf != NULL && pIOReq->dwOutBufSize == sizeof(CEDEVICE_POWER_STATE) && pIOReq->pBytesReturned != NULL) {
            CEDEVICE_POWER_STATE newDx = *(PCEDEVICE_POWER_STATE) pIOReq->pOutBuf;
            m_fReductionRequested = FALSE;
            m_fBoostRequested = FALSE;
            dwStatus = SetDiskPower(newDx);
            *pIOReq->pBytesReturned = sizeof(newDx);
            dwStatus = ERROR_SUCCESS;
        }
        break;
    case IOCTL_POWER_GET:
        if(pIOReq->pOutBuf != NULL && pIOReq->dwOutBufSize == sizeof(CEDEVICE_POWER_STATE) && pIOReq->pBytesReturned != NULL) {
            CEDEVICE_POWER_STATE curDx = GetDiskPower();
            *(PCEDEVICE_POWER_STATE) pIOReq->pOutBuf = curDx;
            *pIOReq->pBytesReturned = sizeof(curDx);
            dwStatus = ERROR_SUCCESS;
        }
        break;
    case IOCTL_DISK_GETPMTIMINGS:
        if(pIOReq->pInBuf != NULL && pIOReq->dwInBufSize >= sizeof(PowerTimings)) {
            PowerTimings pt;
            memset(&pt, 0, sizeof(pt));
            pt.dwSize = sizeof(pt);
            TakeCS();
            pt.dwLoadedTicks = GetTickCount() - m_dwStartTickCount;
            for(int i = 0; i < PwrDeviceMaximum; i++) {
                pt.DxTiming[i].dwCount = m_dxInfo[i].dwCount;
                pt.DxTiming[i].liElapsed = m_dxInfo[i].totalQPC;
            }
            LARGE_INTEGER li;
            if(QueryPerformanceCounter(&li)) {
                pt.DxTiming[m_curDx].liElapsed.QuadPart += li.QuadPart - m_startQPC.QuadPart;
            }
            ReleaseCS();

            // copy the data to the user buffer
            pPowerTimings ppt = (pPowerTimings) pIOReq->pInBuf;
            if(ppt->dwSize >= sizeof(PowerTimings) && ppt->dwSize <= pIOReq->dwInBufSize) {
                *ppt = pt;
                dwStatus = ERROR_SUCCESS;
            } else {
                dwStatus = ERROR_INVALID_PARAMETER;
            }
        }
        break;
    default:    // not a PM ioctl
        dwStatus = ERROR_NOT_SUPPORTED;
        break;
    }

    DEBUGMSG(dwStatus != ERROR_NOT_SUPPORTED && dwStatus != ERROR_SUCCESS && ZONE_WARNING, 
        (_T("CDiskPower::DiskPowerIoctl: ioctl 0x%x failed %u\r\n"), pIOReq->dwCode, dwStatus));
    return dwStatus;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆精品国产91久久久资源速度| 久久精品免费在线观看| 91亚洲精品久久久蜜桃网站 | 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 日韩欧美电影在线| 日韩免费在线观看| 欧美变态口味重另类| 在线播放日韩导航| 日韩欧美国产综合在线一区二区三区| 欧美一区二区免费视频| 欧美一区二区视频在线观看2022| 777亚洲妇女| 日韩欧美亚洲国产精品字幕久久久| 这里只有精品视频在线观看| 欧美一区二区久久久| 精品免费视频一区二区| 久久久久久一级片| 欧美国产日韩在线观看| 亚洲欧洲av一区二区三区久久| 亚洲欧洲精品成人久久奇米网| 亚洲日本在线a| 亚洲成a人v欧美综合天堂下载 | 伊人一区二区三区| 午夜欧美一区二区三区在线播放| 首页综合国产亚洲丝袜| 久99久精品视频免费观看| 国产精品资源在线观看| 99久久免费视频.com| 在线精品视频免费播放| 欧美嫩在线观看| 欧美精品一区二区三区四区 | 免费人成黄页网站在线一区二区| 毛片一区二区三区| 国产成人av电影在线观看| 99久久婷婷国产综合精品电影 | 日韩欧美的一区| 国产午夜亚洲精品午夜鲁丝片| 国产精品国产三级国产普通话99 | 日韩欧美在线1卡| 日本一区二区三级电影在线观看 | 亚洲精品国产精品乱码不99 | 粉嫩aⅴ一区二区三区四区五区| 91亚洲男人天堂| 欧美一级欧美一级在线播放| 国产日韩欧美在线一区| 亚洲午夜精品在线| 国产尤物一区二区在线| 一本大道av一区二区在线播放| 777午夜精品免费视频| 国产色一区二区| 亚洲第一精品在线| 国产69精品久久777的优势| 欧美专区日韩专区| 26uuu精品一区二区在线观看| 亚洲六月丁香色婷婷综合久久| 毛片av一区二区| 色天天综合久久久久综合片| 精品欧美乱码久久久久久1区2区| 中文字幕一区二区在线播放| 免费成人在线播放| 色综合久久综合| 久久久夜色精品亚洲| 亚洲一区二区三区激情| 国产+成+人+亚洲欧洲自线| 7777女厕盗摄久久久| 综合久久给合久久狠狠狠97色| 欧美日韩成人一区| 国产精品三级视频| 久久精品国产秦先生| 在线这里只有精品| 日本一区二区三区dvd视频在线| 五月激情综合色| 91在线视频观看| 久久久久国产精品麻豆ai换脸 | 国产一区二区不卡老阿姨| 欧美在线免费观看视频| 国产精品嫩草久久久久| 蜜臀av性久久久久av蜜臀妖精| 在线视频你懂得一区二区三区| 中文字幕免费观看一区| 极品少妇xxxx精品少妇偷拍| 欧美日韩一级黄| 一区二区三区在线免费观看| 成人动漫视频在线| 久久久一区二区三区| 久久66热re国产| 日韩欧美亚洲另类制服综合在线| 亚洲大片精品永久免费| 在线不卡欧美精品一区二区三区| 国产丝袜欧美中文另类| 精品在线你懂的| 欧美精品一卡二卡| 亚洲国产毛片aaaaa无费看| 色综合天天综合狠狠| 中文欧美字幕免费| 国产盗摄视频一区二区三区| 精品国产91亚洲一区二区三区婷婷| 日韩高清国产一区在线| 欧美精品一卡两卡| 五月天国产精品| 欧美群妇大交群中文字幕| 亚洲高清视频的网址| 欧美性生活大片视频| 亚洲一区二区三区四区在线| 色狠狠色狠狠综合| 亚洲午夜国产一区99re久久| 在线亚洲精品福利网址导航| 一区二区三国产精华液| 欧美性猛交xxxxxxxx| 亚洲国产视频一区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 亚洲精品视频一区| 在线观看日韩av先锋影音电影院| 一区二区三区免费| 欧美日韩一区中文字幕| 图片区日韩欧美亚洲| 日韩一二三四区| 韩国v欧美v亚洲v日本v| 久久影视一区二区| 国产91丝袜在线播放0| 国内外成人在线| 国产欧美1区2区3区| 99精品一区二区三区| 亚洲免费观看高清在线观看| 欧美性色综合网| 蜜臀av亚洲一区中文字幕| 久久久久久亚洲综合影院红桃 | 欧美日韩一级二级三级| 日韩激情在线观看| 久久综合色鬼综合色| 国产成人精品亚洲日本在线桃色| 中文字幕在线一区免费| 在线观看网站黄不卡| 蜜桃av一区二区在线观看| 久久蜜桃香蕉精品一区二区三区| 成人免费毛片app| 亚洲一区在线看| 欧美成人欧美edvon| 国产99精品视频| 亚洲一二三四在线| 日韩欧美色综合| 99视频有精品| 日韩av一区二区三区四区| 久久青草欧美一区二区三区| 99久久精品国产毛片| 日韩专区一卡二卡| 国产欧美视频一区二区三区| 色诱视频网站一区| 久久国产免费看| 最新中文字幕一区二区三区| 在线播放一区二区三区| 成人综合婷婷国产精品久久蜜臀| 亚洲在线视频网站| 久久精品欧美日韩| 欧美日韩免费观看一区三区| 国产精品一卡二卡在线观看| 亚洲综合色噜噜狠狠| 亚洲精品在线观看视频| 在线观看日韩高清av| 国产在线国偷精品产拍免费yy| 亚洲久本草在线中文字幕| 精品欧美黑人一区二区三区| 色爱区综合激月婷婷| 精品影视av免费| 亚洲精品视频在线看| 久久久精品黄色| 欧美日韩日本视频| 99热国产精品| 国内精品自线一区二区三区视频| 一区二区三区四区不卡视频| 久久久久青草大香线综合精品| 欧美日韩日日摸| 不卡在线视频中文字幕| 麻豆国产精品官网| 亚洲综合成人在线视频| 日本一区二区三区在线不卡| 日韩三级.com| 欧美日韩国产一二三| 99久久精品99国产精品| 国产在线播放一区三区四| 午夜精品福利一区二区三区av | 精品亚洲成a人| 午夜久久久久久电影| 亚洲天堂精品在线观看| 久久影院午夜论| 日韩欧美亚洲国产另类| 欧美麻豆精品久久久久久| 91久久精品一区二区二区| www.日韩精品| 国产麻豆成人传媒免费观看| 日日摸夜夜添夜夜添亚洲女人| 亚洲精品欧美激情| 综合色天天鬼久久鬼色| 国产精品日韩精品欧美在线| 久久综合狠狠综合久久综合88 | 日韩有码一区二区三区| 一区二区三区中文在线观看| 国产精品久久二区二区| 国产精品久久久久影视| 中文在线免费一区三区高中清不卡|