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

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

?? pcibus.c

?? WINCE5.0操作系統(tǒng)下的PCI總線驅(qū)動
?? C
?? 第 1 頁 / 共 5 頁
字號:

        //
        // Adjust list lengths
        //
        if (VendorIDNum > MaxListNum) {
            VendorIDNum = MaxListNum;

             DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegMatchOne: Registry value list '%s\\%s' truncated to %d items.\r\n",
                    RegPath, PCIBUS_VENDORID_VALNAME, MaxListNum));
        }

        if (DeviceIDNum > MaxListNum) {
            DeviceIDNum = MaxListNum;

             DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegMatchOne: Registry value list '%s\\%s' truncated to %d items.\r\n",
                    RegPath, PCIBUS_DEVICEID_VALNAME, MaxListNum));
        }

        if (SubVendorIDNum > MaxListNum) {
            SubVendorIDNum = MaxListNum;

             DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegMatchOne: Registry value list '%s\\%s' truncated to %d items.\r\n",
                    RegPath, PCIBUS_SUBVENDORID_VALNAME, MaxListNum));
        }

        if (SubSystemIDNum > MaxListNum) {
            SubSystemIDNum = MaxListNum;

             DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegMatchOne: Registry value list '%s\\%s' truncated to %d items.\r\n",
                    RegPath, PCIBUS_SUBSYSTEMID_VALNAME, MaxListNum));
        }

        // Walk list pairs looking for match
        for (i = 0; i < MaxListNum; i++) {
            if (((USHORT)VendorIDs[i] == pInfo->Cfg->VendorID) && ((USHORT)DeviceIDs[i] == pInfo->Cfg->DeviceID)) {
                if (!SubVendorIDNum) break;
                
                if ((USHORT)SubVendorIDs[i] == pInfo->Cfg->u.type0.SubVendorID) {
                    if (!SubSystemIDNum) break;

                    if ((USHORT)SubSystemIDs[i] == pInfo->Cfg->u.type0.SubSystemID) break;
                }
            }
        }

        if (i == MaxListNum) {
            // No match found
            Match = 0;
            goto RegMatchOne_Exit;
        } else {
            DEBUGMSG(ZONE_ENUM,
                (TEXT("PCIBUS!RegMatchOne: Match for VendorID (0x%X), DeviceID (0x%X) found.\r\n"), VendorIDs[i], DeviceIDs[i]));

#ifdef DEBUG
            if (SubVendorIDNum) {
                if (SubSystemIDNum) {
                    DEBUGMSG(ZONE_ENUM, (L"PCIBUS!RegMatchOne: Match for SubVendorID (0x%X), SubSystemID (0x%X) found.\r\n",
                        SubVendorIDs[i], SubSystemIDs[i]));
                } else {
                    DEBUGMSG(ZONE_ENUM, (L"PCIBUS!RegMatchOne: Match for SubVendorID (0x%X) found.\r\n",
                        SubVendorIDs[i]));
                }
            }
#endif
            
            Match++;
        }

        //
        // Examine RevisionID value, check against device's revision identification
        //
        RevisionIDNum = PCI_MAX_REG_LIST;
        if (!RegGetList(DevKey, PCIBUS_REVISIONID_VALNAME, &RevisionIDNum, RevisionIDs) && (RevisionIDNum == PCI_MAX_REG_LIST)) {
            DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegMatchOne: Registry value '%s\\%s' has more than %d items in multi_sz list.  Ignoring the additional items.\r\n",
                RegPath, PCIBUS_REVISIONID_VALNAME, PCI_MAX_REG_LIST));
        }

        if (!RevisionIDNum) {
            // No VendorID value found
            goto RegMatchOne_Exit;
        }

        // Scan list for match
        for (i = 0; i < RevisionIDNum; i++) {
            if ((UCHAR)RevisionIDs[i] == pInfo->Cfg->RevisionID) break;
        }

        if (i == RevisionIDNum) {
            // No match found
            Match = 0;
            goto RegMatchOne_Exit;
        } else {
            DEBUGMSG(ZONE_ENUM, (L"PCIBUS!RegMatchOne: Match for RevisionID (0x%X) found.\r\n", RevisionIDs[i]));
            
            Match++;
        }

        //
        // Examine BusNumber value, check against device's bus number
        //
        ValLen = sizeof(Val32);
        status = RegQueryValueEx(DevKey, PCIBUS_BUSNUMBER_VALNAME, NULL, &ValType, (PUCHAR)&Val32, &ValLen);
                    
        if (status != ERROR_SUCCESS) {
            // No BusNumber value found
            goto RegMatchOne_Exit;
        }

        if (Val32 != pInfo->Bus) {
            // Bus number doesn't match
            Match = 0;
            goto RegMatchOne_Exit;
        } else {
            DEBUGMSG(ZONE_ENUM, (TEXT("PCIBUS!RegMatchOne Match for BusNumber (0x%X) found.\r\n"), Val32));
            
            Match++;
        }

        //
        // Examine DeviceNumber value, check against device's device number
        //
        ValLen = sizeof(Val32);
        status = RegQueryValueEx(DevKey, PCIBUS_DEVICENUMBER_VALNAME, NULL, &ValType, (PUCHAR)&Val32, &ValLen);
                    
        if (status != ERROR_SUCCESS) {
            // No DeviceNumber value found
            goto RegMatchOne_Exit;
        }

        if (Val32 != pInfo->Device) {
            // Device number doesn't match
            Match = 0;
            goto RegMatchOne_Exit;
        } else {
            DEBUGMSG(ZONE_ENUM, (TEXT("PCIBUS!RegMatchOne Match for DeviceNumber (0x%X) found.\r\n"), Val32));
            
            Match++;
        }

        //
        // Examine FunctionNumber value, check against device's function number
        //
        ValLen = sizeof(Val32);
        status = RegQueryValueEx(DevKey, PCIBUS_FUNCTIONNUMBER_VALNAME, NULL, &ValType, (PUCHAR)&Val32, &ValLen);
                    
        if (status != ERROR_SUCCESS) {
            // No FunctionNumber value found
            goto RegMatchOne_Exit;
        }

        if (Val32 != pInfo->Function) {
            // Function number doesn't match
            Match = 0;
            goto RegMatchOne_Exit;
        } else {
            DEBUGMSG(ZONE_ENUM, (TEXT("PCIBUS!RegMatchOne Match for FunctionNumber (0x%X) found.\r\n"), Val32));
            
            Match++;
        }
 
RegMatchOne_Exit:
    RegCloseKey(DevKey);
        
    return Match;
}


//
// Search registry for best device/registry match.
//
DWORD
RegMatch(
    PPCI_DEV_INFO pInfo
    )
{
    HKEY Key;
    DWORD DevLoadOrder;
    DWORD LoadOrder;
    DWORD NumDevKeys;
    DWORD RegEnum;
    DWORD status;
    DWORD ValType;
    DWORD ValLen;
    DWORD Match = 0;
    DWORD BestMatch = 0;
    WCHAR DevName[DEVKEY_LEN];
    WCHAR RegPath[DEVKEY_LEN]; 

    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!RegMatch+(%s, %d, %d, %d)\r\n", pInfo->RegPath, pInfo->Bus, pInfo->Device, pInfo->Function));

    //
    // Open key to be enumerated
    //
    status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pInfo->RegPath, 0, 0, &Key);
                
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (TEXT("PCIBUS!RegMatch RegOpenKeyEx(%s) returned %d.\r\n"), pInfo->RegPath, status));
        return 0;
    }

    //
    // Find out how many sub-keys there are
    //
    status = RegQueryInfoKey(
                    Key,
                    NULL,         // class name buffer (lpszClass)
                    NULL,       // ptr to length of class name buffer (lpcchClass)
                    NULL,           // reserved
                    &NumDevKeys,    // ptr to number of subkeys (lpcSubKeys)
                    &ValType,       // ptr to longest subkey name length (lpcchMaxSubKeyLen)
                    &ValLen,        // ptr to longest class string length (lpcchMaxClassLen)
                    &LoadOrder,     // ptr to number of value entries (lpcValues)
                    &DevLoadOrder,  // ptr to longest value name length (lpcchMaxValueNameLen)
                    &ValLen,        // ptr to longest value data length (lpcbMaxValueData)
                    NULL,           // ptr to security descriptor length
                    NULL);          // ptr to last write time
                    
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (TEXT("PCIBUS!RegMatch RegQueryInfoKey(Class) returned %d.\r\n"), status));
        RegCloseKey(Key);
        return 0;
    }
    
    DEBUGMSG(ZONE_ENUM,
        (TEXT("PCIBUS!RegMatch %d devices to search\r\n"), NumDevKeys));

    //
    // Base registry key
    //
    wcsncpy(RegPath, pInfo->RegPath, DEVKEY_LEN);
    RegPath[DEVKEY_LEN-1]=0;

    //
    // Search for closest match
    //
    RegEnum = 0; 
    
    for (RegEnum = 0; RegEnum < NumDevKeys; RegEnum++) {
        DEBUGMSG(ZONE_ENUM, (TEXT("PCIBUS!RegMatch RegEnum = %d\r\n"), RegEnum));

        // Get sub-key according to RegEnum
        ValLen = sizeof(DevName) / sizeof(WCHAR);
        status = RegEnumKeyEx(Key, RegEnum, DevName, &ValLen, NULL, NULL, NULL, NULL);

        if (status != ERROR_SUCCESS) {
            DEBUGMSG(ZONE_ENUM, (TEXT("PCIBUS!RegMatch RegEnumKeyEx(%d) returned %d\r\n"), RegEnum, status));
            break;
        }

        Match = RegMatchOne(pInfo, Key, DevName);
        
        if (Match > BestMatch) {
            if (wcslen(DevName) + wcslen(pInfo->RegPath) + 1 < DEVKEY_LEN) { // We can handle this registry.
                BestMatch = Match;
                
                // There is at least a partial match, construct path to device key
                wcscpy(RegPath, pInfo->RegPath);
                wcscat(RegPath, TEXT("\\"));
                wcscat(RegPath, DevName);
                RegPath[DEVKEY_LEN-1]=0;
            }
        }
    }

    RegCloseKey(Key);

    wcsncpy(pInfo->RegPath, RegPath,DEVKEY_LEN);
    pInfo->RegPath[DEVKEY_LEN-1] = 0;
    
    return BestMatch;
}
//
// Open Non-Exist Instance Registry Key 
//
#define NUMBER_OF_APPENDIX_BYTES 2
#define MAX_APPENDIX_NUMBER 100
static 
HKEY OpenNonExistInstanceKey(LPCWSTR lpInstancePreFix)
{
    HKEY hReturn=NULL;
    WCHAR IndexStr[DEVKEY_LEN];
    DWORD dwLen;
    DWORD iIndex;
    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!OpenNonExistInstanceKey+(%s)\r\n", lpInstancePreFix ));
    wcsncpy(IndexStr,lpInstancePreFix,DEVKEY_LEN-1);
    IndexStr[DEVKEY_LEN-1] = 0;
    dwLen=wcslen(IndexStr);
    if (dwLen>= DEVKEY_LEN -NUMBER_OF_APPENDIX_BYTES-1) {
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS!OpenNonExistInstanceKey Error: instance key prefix '%s' len=%d exceeds %d character limit\r\n", IndexStr,dwLen, DEVKEY_LEN- 3));
        return NULL;
    }
    // Assign an index, starting with index 1
    for (iIndex=1;iIndex<MAX_APPENDIX_NUMBER;iIndex++) {
        DWORD Disposition =0 ;
        LONG status;
        wsprintf(IndexStr+dwLen, L"%d", iIndex);
        // Create/open Instance key
        status = RegCreateKeyEx(HKEY_LOCAL_MACHINE, IndexStr, 0, NULL, 0, 0, NULL, &hReturn, &Disposition);
        if (status==ERROR_SUCCESS) {
            if (Disposition == REG_OPENED_EXISTING_KEY) { // If found it is existing, continue search.
                DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS::OpenNonExistInstanceKey(%s) returned open exist.continue search\r\n",
                    IndexStr));
                RegCloseKey(hReturn);
                hReturn = NULL;                
            }
            else {
                DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!OpenNonExistInstanceKey-(%s) returns key \r\n",IndexStr));
                // Write new InstanceIndex value.. This instance value is need for DDKReg_GetPciInfo
                status = RegSetValueEx(hReturn, PCIBUS_INSTANCEINDEX_VALNAME, 0, PCIBUS_INSTANCEINDEX_VALTYPE, (PUCHAR)&iIndex, sizeof(iIndex));
                if (status != ERROR_SUCCESS) {
                    DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS!RegCopy RegSetValueEx(%s\\%s) returned %d.\r\n",
                        IndexStr, PCIBUS_INSTANCEINDEX_VALNAME, status));
                    RegCloseKey(hReturn);
                    hReturn = NULL;                                    
                }                
                return hReturn;
            }
        }
        else {
            DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS::OpenNonExistInstanceKey(%s) returned fails\r\n", IndexStr));
            break;
        }
            
    }
    return NULL;
}
//
// Copy registry information for device from template key to instance key.  Write device-specific information
// to instance key.
//
static BOOL
RegCopy(
    PPCI_DEV_INFO pInfo
    )
{
    HKEY TKey;
    HKEY IKey;
    DWORD status;
    WCHAR InstKeyPath[DEVKEY_LEN];
    PWCHAR KeyPtr;
    PWCHAR TmpKeyPtr;
    INTERFACE_TYPE IfcType = PCIBus;
    DWORD Irq, Pin, SysIntr;
    BOOL RetVal = TRUE;
    
    DEBUGMSG(ZONE_FUNCTION, (L"PCIBUS!RegCopy+(%s, %d, %d, %d)\r\n", pInfo->RegPath, pInfo->Bus, pInfo->Device, pInfo->Function));

    //
    // Open Template key
    //
    status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, pInfo->RegPath, 0, 0, &TKey);            
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS!RegCopy RegOpenKeyEx(%s) returned %d.\r\n", pInfo->RegPath, status));
        return FALSE;
    }
    
    //
    // Construct Instance key name
    //

    // Find last occurence of "Template" in key
    KeyPtr = NULL;
    TmpKeyPtr = wcsstr(pInfo->RegPath, PCIBUS_TEMPLATE_KEYNAME);
    while (TmpKeyPtr != NULL) {
        KeyPtr = TmpKeyPtr;
        TmpKeyPtr += wcslen(PCIBUS_TEMPLATE_KEYNAME);
        TmpKeyPtr = wcsstr(TmpKeyPtr, PCIBUS_TEMPLATE_KEYNAME);
    };
    
    if (KeyPtr == NULL) {
        // Template key didn't have the word Template in it, report error
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS!RegCopy Key %s doesn't contain %s.\r\n",
            pInfo->RegPath, PCIBUS_TEMPLATE_KEYNAME));

        RetVal = FALSE;
        goto rc_Close_TKey;
    }
    
    StringCchCopy(InstKeyPath, DEVKEY_LEN,pInfo->RegPath);
    {
        DWORD dwIndex = (KeyPtr - pInfo->RegPath);
        if (dwIndex < DEVKEY_LEN)
            InstKeyPath[dwIndex] = (WCHAR)'\0';
    }
    
    wcscat(InstKeyPath, PCIBUS_INSTANCE_KEYNAME);
    wcscat(InstKeyPath, (PWCHAR)(KeyPtr + wcslen(PCIBUS_TEMPLATE_KEYNAME)));
    IKey = OpenNonExistInstanceKey(InstKeyPath);
                
    if (IKey ==NULL ) {
        DEBUGMSG(ZONE_ENUM|ZONE_ERROR, (L"PCIBUS!RegCopy RegCreateKeyEx(%s) returned %d.\r\n",
            InstKeyPath, status));

        RetVal = FALSE;
        goto rc_Close_TKey;
    }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
综合自拍亚洲综合图不卡区| 日韩中文字幕91| 中文字幕av一区 二区| 日韩欧美国产1| 欧美一级高清片| 日韩女优制服丝袜电影| 日韩欧美专区在线| 精品免费视频.| xfplay精品久久| 国产欧美一区二区精品久导航 | 亚洲6080在线| 亚洲bt欧美bt精品| 全部av―极品视觉盛宴亚洲| 蜜臀精品一区二区三区在线观看 | 欧美少妇性性性| 欧美日韩一本到| 日韩欧美中文一区二区| 久久综合九色综合97_久久久| 久久久噜噜噜久久中文字幕色伊伊| 国产亚洲制服色| 欧美高清在线视频| 亚洲色图制服丝袜| 亚洲第一在线综合网站| 麻豆91在线观看| 成人性生交大片免费看在线播放| 99久久99久久免费精品蜜臀| 在线看不卡av| 91精品国产综合久久久久久久| 欧美一区二区三区爱爱| 久久久久久麻豆| 亚洲免费观看在线观看| 日本视频一区二区| 国产sm精品调教视频网站| 色噜噜狠狠成人中文综合| 欧美日产在线观看| 久久精品免费在线观看| 伊人婷婷欧美激情| 青青草伊人久久| 国产**成人网毛片九色| 在线中文字幕一区| 欧美不卡123| 亚洲欧美另类在线| 蓝色福利精品导航| 99久久国产综合色|国产精品| 欧美精品xxxxbbbb| 国产亚洲精品精华液| 亚洲精品一卡二卡| 精品一区二区三区欧美| 色婷婷av一区二区| 久久亚洲精华国产精华液| 亚洲精品视频一区二区| 久久99国产精品成人| 色老汉av一区二区三区| 久久亚洲一区二区三区四区| 亚洲自拍欧美精品| 豆国产96在线|亚洲| 欧美群妇大交群的观看方式| 国产精品伦理在线| 美腿丝袜一区二区三区| 色婷婷狠狠综合| 久久精品一区蜜桃臀影院| 天天操天天干天天综合网| 成人综合在线网站| 日韩一区二区免费电影| 亚洲自拍偷拍欧美| 成人美女在线视频| 日韩免费视频线观看| 亚洲高清一区二区三区| 成人h动漫精品一区二区| 日韩女优电影在线观看| 亚洲已满18点击进入久久| 福利电影一区二区| 日韩欧美高清dvd碟片| 成人动漫一区二区三区| 无码av免费一区二区三区试看| 韩国精品在线观看| 欧美日韩性生活| 亚洲欧美一区二区三区孕妇| 国产在线精品免费| 日韩亚洲欧美在线| 性感美女久久精品| 色欧美日韩亚洲| 欧美激情中文不卡| 国产美女娇喘av呻吟久久| 欧美二区三区的天堂| 亚洲一区二区三区爽爽爽爽爽| 成人精品视频一区二区三区| 精品久久免费看| 美腿丝袜亚洲综合| 91精品久久久久久久久99蜜臂| 亚洲一级二级在线| 91浏览器打开| 中文字幕一区二区不卡| 风流少妇一区二区| 欧美激情一区二区| 国产jizzjizz一区二区| 久久久精品天堂| 国产精品99久| 国产日韩欧美不卡| 丰满少妇久久久久久久| 国产欧美精品区一区二区三区 | 亚洲免费观看高清| voyeur盗摄精品| 日本一区二区三区久久久久久久久不 | 国产精品996| 国产亚洲午夜高清国产拍精品| 久久精品国产精品亚洲红杏| 精品少妇一区二区三区日产乱码 | 成人av在线影院| 国产精品国产三级国产| 9l国产精品久久久久麻豆| 一区免费观看视频| 91麻豆视频网站| 亚洲一区二区三区四区中文字幕| 欧洲一区二区三区免费视频| 亚洲成人资源网| 91精品国产一区二区三区香蕉| 美女久久久精品| 337p日本欧洲亚洲大胆色噜噜| 国产精品一区二区在线观看网站 | 成人综合婷婷国产精品久久蜜臀| 国产欧美视频在线观看| 成人动漫视频在线| 一区二区三区影院| 欧美日韩精品高清| 久久精品国产99| 久久精品夜色噜噜亚洲aⅴ| 成人午夜短视频| 一区二区三区四区在线免费观看| 欧美精品第1页| 精品一区二区av| 中文字幕在线一区免费| 欧美综合在线视频| 日本va欧美va精品| 欧美激情资源网| 日本伦理一区二区| 日产精品久久久久久久性色 | 日韩av成人高清| 久久久夜色精品亚洲| 色综合久久久网| 视频一区二区三区中文字幕| 久久一区二区视频| 色婷婷精品久久二区二区蜜臂av| 秋霞影院一区二区| 国产精品女主播av| 51精品秘密在线观看| 岛国av在线一区| 天天亚洲美女在线视频| 久久精品亚洲国产奇米99| 在线一区二区三区四区五区| 美女在线观看视频一区二区| 国产精品国产自产拍高清av| 欧美日韩一区二区三区不卡 | 久久综合狠狠综合久久激情| 91最新地址在线播放| 五月婷婷激情综合网| 欧美国产欧美综合| 欧美精品xxxxbbbb| 成人精品免费看| 日本不卡高清视频| 亚洲欧美激情小说另类| 精品动漫一区二区三区在线观看| 91蜜桃在线观看| 国产永久精品大片wwwapp | 在线观看国产精品网站| 国产乱码精品一区二区三| 夜夜爽夜夜爽精品视频| 国产欧美一区视频| 欧美丰满少妇xxxbbb| 91蜜桃在线免费视频| 国产精品影视天天线| 午夜激情久久久| 亚洲免费看黄网站| 日本一区二区三区免费乱视频| 欧美一区二区三区白人| 在线观看区一区二| 波多野结衣在线aⅴ中文字幕不卡| 青青草国产成人99久久| 樱花草国产18久久久久| 欧美韩日一区二区三区四区| 日韩久久久精品| 欧美日韩成人在线| 日本精品视频一区二区| av中文一区二区三区| 国产麻豆视频一区二区| 免费在线一区观看| 亚洲午夜一二三区视频| 亚洲日本欧美天堂| 中文av一区二区| 久久综合久久综合久久综合| 91精品国产入口| 欧美日韩aaaaa| 欧美三级午夜理伦三级中视频| 成人污污视频在线观看| 国产毛片精品一区| 精品制服美女丁香| 久草中文综合在线| 久久99国产精品麻豆| 久久精品国产亚洲a| 日韩精品亚洲一区|