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

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

?? pcibus.c

?? WINCE5.0操作系統(tǒng)下的PCI總線驅(qū)動(dòng)
?? C
?? 第 1 頁 / 共 5 頁
字號(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.
//

//
// PCIbus bus driver and enumerator.
//

#include <windows.h>
#include <nkintr.h>
#include <pkfuncs.h>
#include <devload.h>
#include <resmgr.h>
#include <ceddk.h>
#include <stdarg.h>
#include <PCIbus.h>
#include "PCIproto.h"
#include "PCIdbg.h"
#include "PciEnum.h"
#ifndef _PREFAST_
#pragma warning(disable: 4068) // Disable pragma warnings
#endif

#ifdef DEBUG
//
// These defines must match the ZONE_* defines in PCIdbg.h
//
#define DBG_ERROR      1
#define DBG_WARNING    2
#define DBG_FUNCTION   4
#define DBG_INIT       8
#define DBG_ENUM      16
#define DBG_ORDER     32
#define DBG_RSRC     64

DBGPARAM dpCurSettings = {
    TEXT("PCIBUS"), {
    TEXT("Errors"),TEXT("Warnings"),TEXT("Functions"),TEXT("Initialization"),
    TEXT("Enumeration"),TEXT("Load Order"),TEXT("Resource"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),
    TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined"),TEXT("Undefined") },
    DBG_ERROR | DBG_WARNING
};
#endif  // DEBUG

//
// Function prototypes
//
static HANDLE
Enumerate(
    LPCWSTR EnumKey, LPCWSTR lpActiveKey
    );

static BOOL
RegGetFlags(
    PPCI_DEV_INFO pInfo 
    );
    
static DWORD
MinVal(
    DWORD List[],
    DWORD Len
    );
    
static BOOL
PCIEnum(
    LPCWSTR EnumKey, DWORD dwBusNumberBase, DWORD dwBusNumberLength
    );

static BOOL
PCIRegClean(
    LPCWSTR EnumKey
    );

static BOOL
PCIReg(
    PPCI_DEV_INFO pInfo
    );

static DWORD
RegMatchOne(
    PPCI_DEV_INFO pInfo,
    HKEY Key,
    LPCWSTR DevName
    );

static BOOL
RegCopy(
    PPCI_DEV_INFO pInfo
    );

static BOOL
RegCopyKey(
    HKEY TKey,
    HKEY IKey
    );

static BOOL
RegSetVal(
    HKEY Key,
    LPCWSTR ValName,
    DWORD ValType, 
    const PBYTE ValData,
    DWORD ValLen
    );

static BOOL
RegSetList(
    HKEY Key,
    LPCWSTR ValName,
    DWORD Num,
    DWORD List[]
    );
    
static BOOL
RegGetList(
    HKEY Key,
    LPCWSTR ValName,
    PDWORD pNum,
    DWORD List[]
    );

static BOOL 
RegSetConfig(
    PPCI_DEV_INFO pInfo 
    );
    
static BOOL
RequestSysIntr(
    DWORD Irq,
    DWORD *pSysIntr
    );

static PPCI_CFG_INFO
AddConfigInfo(
    HMODULE hDll,
    PFN_CONFIGENTRY ConfigEntryFn
    );

static void
DelConfigInfoList(
    void
    );
    
//
// Global variables
//
PPCI_CFG_INFO g_ConfigInfoList = NULL;
CRITICAL_SECTION    g_CSection;

//
// Process attach/detach API.
//
BOOL WINAPI
DllMain(
     HINSTANCE hinstDll,             /*@parm Instance pointer. */
     DWORD    dwReason,              /*@parm Reason routine is called. */
     LPVOID    lpReserved            /*@parm system parameter. */
     )
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        DEBUGREGISTER(hinstDll);
        DEBUGMSG(ZONE_INIT, (L"PCIBUS!DllMain: process attach\r\n"));
        InitializeCriticalSection( &g_CSection );
        DisableThreadLibraryCalls((HMODULE)hinstDll);
    }

    if (dwReason == DLL_PROCESS_DETACH) {
        DEBUGMSG(ZONE_INIT, (L"PCIBUS!DllMain: process detach\r\n"));
        DeleteCriticalSection( &g_CSection );
    }

    return TRUE;
}


//
// PCIbus driver entry point.
//
HANDLE
Init(
    LPCWSTR ActiveKey
    )
{
    HKEY Key;
    DWORD Status;
    WCHAR EnumKey[DEVKEY_LEN];
    DWORD KeyLen;
    HANDLE hReturn = NULL;

    // Signal Entry Allow.
    EnterCriticalSection( &g_CSection ) ;
    //
    // Open the Active key and find the client key.
    //
    Status = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ActiveKey, 0, 0, &Key);
    if (Status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ERROR, (L"PCIBUS!Init RegOpenKeyEx(%s) returned %d.\r\n", ActiveKey, Status));
        LeaveCriticalSection( &g_CSection );
        return (HANDLE)0;
    }

    KeyLen = sizeof(EnumKey);
    Status = RegQueryValueEx(Key, DEVLOAD_DEVKEY_VALNAME, NULL, NULL, (PUCHAR)EnumKey, &KeyLen);
    if (Status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_ERROR, (L"PCIBUS!Init RegQueryValueEx(%s\\%s) returned %d.\r\n", ActiveKey, DEVLOAD_DEVKEY_VALNAME, Status));
        RegCloseKey(Key);
        LeaveCriticalSection( &g_CSection );
        return (HANDLE)0;
    }

    RegCloseKey(Key);
    
    hReturn = Enumerate(EnumKey,ActiveKey);
    LeaveCriticalSection( &g_CSection );
    
    return hReturn;
}


//
//  De-init entry point.
//
void
Deinit(
    HANDLE hInitKey
    )
{
    if (hInitKey)
        DeletePciBus(hInitKey);
}


//
// Enumerate PCIbus.
//
static HANDLE
Enumerate(
    LPCWSTR EnumKey,LPCWSTR lpActiveKey
    )
{
    WCHAR RegPath[DEVKEY_LEN];
    PCI_DEV_INFO_EX Info;
    size_t MaxKeyLen = DEVKEY_LEN - (wcslen(L"\\") + wcslen(PCIBUS_INSTANCE_KEYNAME) + 1);

    // If EnumKey too long, return with error
    if (wcslen(EnumKey) > MaxKeyLen) {
        DEBUGMSG(ZONE_ERROR, (L"PCIBUS!Enumerate: ERROR: EnumKey '%s' exceeds the allowed %d characters\r\n", EnumKey, MaxKeyLen));
        return NULL;
    }

    PCIInitInfo(EnumKey, 0, 0, 0, NULL, &Info.pciDevice);

    if (!RegGetInfo(&Info.pciDevice)) {
        DEBUGMSG(ZONE_ERROR, (L"PCIBUS!Enumerate: RegGetInfo failed\r\n"));
        return NULL;
    }
    if (!RegGetExtraDeviceInfo(&Info)) {
        Info.PrefetchMemBase.Num = 0;
        Info.PrefetchMemLen.Num = 0;
        Info.dwBusNumberBase = 0;
        Info.dwBusNumberLength = PCI_MAX_BUS;
    }
    
    if (Info.pciDevice.Configure) {
        // Configure bus
        if (!PCICfg(&Info)) {
            DEBUGMSG(ZONE_ERROR, (L"PCIBUS!Enumerate: PCICfg failed\r\n"));
            return NULL;
        }
    }

    // Clean out devices from under PCI\Instance sub-key that have no physical device available.  This is
    // to prevent device drivers from being loaded for devices that have been removed while suspended and while
    // retaining the registry settings.
    wcscpy(RegPath, EnumKey);
    wcscat(RegPath, L"\\");
    wcscat(RegPath, PCIBUS_INSTANCE_KEYNAME);

    PCIRegClean(RegPath);
    
    // Enumerate bus
    if (!PCIEnum(EnumKey,Info.dwBusNumberBase, Info.dwBusNumberLength)) {
        DEBUGMSG(ZONE_ERROR, (L"PCIBUS!Enumerate: PCIEnum failed\r\n"));
        return NULL;
    }

    // Start DLL under PCI\Instance key to load drivers (usually RegEnum.dll)
    return CreatePciBus(lpActiveKey,RegPath);
}


//
// Get registry information.
//
BOOL
RegGetInfo(
    PPCI_DEV_INFO pInfo
    )
{
    HKEY Key;
    DWORD Status;
    DWORD ValLen;
    DWORD ValType;
    DWORD Val;
    BOOL ConfigDllExists = TRUE;
    BOOL DllExists = TRUE;

    //
    // 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!RegGetInfo RegOpenKeyEx(%s) returned %d.\r\n"),
            pInfo->RegPath, Status));
        return FALSE;
    }

    //
    // Read NoConfig value
    //
    ValLen = sizeof(Val);
    Status = RegQueryValueEx(Key, PCIBUS_NOCONFIG_VALNAME, NULL, &ValType, (PUCHAR)&Val, &ValLen);            
    if ((Status == ERROR_SUCCESS) && (Val != 0)) {
        // If NoConfig exists and non-zero, don't configure bus
        pInfo->Configure = FALSE;
        RegCloseKey(Key);
        return TRUE;
    } else {
        pInfo->Configure = TRUE;
    }

    //
    // Read MemBase and MemLen values.
    //
    pInfo->MemBase.Num = PCI_TYPE0_ADDRESSES;
    if (!RegGetList(Key, PCIBUS_MEMBASE_VALNAME, &pInfo->MemBase.Num, pInfo->MemBase.Reg) && (pInfo->MemBase.Num == PCI_TYPE0_ADDRESSES)) {
        DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegGetInfo: Registry value '%s\\%s' has more than %d items in multi_sz list.  Ignoring the additional items.\r\n",
            pInfo->RegPath, PCIBUS_MEMBASE_VALNAME, PCI_TYPE0_ADDRESSES));
    }

    pInfo->MemLen.Num = PCI_TYPE0_ADDRESSES;
    if (!RegGetList(Key, PCIBUS_MEMLEN_VALNAME, &pInfo->MemLen.Num, pInfo->MemLen.Reg) && (pInfo->MemLen.Num == PCI_TYPE0_ADDRESSES)) {
        DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegGetInfo: Registry value '%s\\%s' has more than %d items in multi_sz list.  Ignoring the additional items.\r\n",
            pInfo->RegPath, PCIBUS_MEMLEN_VALNAME, PCI_TYPE0_ADDRESSES));
    }

    //
    // Read IoBase and IoLen values
    //
    pInfo->IoBase.Num = PCI_TYPE0_ADDRESSES;
    if (!RegGetList(Key, PCIBUS_IOBASE_VALNAME, &pInfo->IoBase.Num, pInfo->IoBase.Reg) && (pInfo->IoBase.Num == PCI_TYPE0_ADDRESSES)) {
        DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegGetInfo: Registry value '%s\\%s' has more than %d items in multi_sz list.  Ignoring the additional items\r\n",
            pInfo->RegPath, PCIBUS_IOBASE_VALNAME, PCI_TYPE0_ADDRESSES));
    }

    pInfo->IoLen.Num = PCI_TYPE0_ADDRESSES;
    if (!RegGetList(Key, PCIBUS_IOLEN_VALNAME, &pInfo->IoLen.Num, pInfo->IoLen.Reg) && (pInfo->IoLen.Num == PCI_TYPE0_ADDRESSES)) {
        DEBUGMSG(ZONE_WARNING, (L"PCIBUS!RegGetInfo: Registry value '%s\\%s' has more than %d items in multi_sz list.  Ignoring the additional items\r\n",
            pInfo->RegPath, PCIBUS_IOLEN_VALNAME, PCI_TYPE0_ADDRESSES));
    }

    //
    // Read ConfigEntry value (if it exists)
    //
    ValLen = sizeof(pInfo->ConfigEntryName);
    Status = RegQueryValueEx(Key, PCIBUS_CONFIGENTRY_VALNAME, NULL, &ValType, (PUCHAR)pInfo->ConfigEntryName, &ValLen);            
    if ((Status == ERROR_SUCCESS) && (ValType == PCIBUS_CONFIGENTRY_VALTYPE)) {
        // ConfigEntry value exists
        pInfo->ConfigEntry = TRUE;
    } else {
        pInfo->ConfigEntry = FALSE;
        wcscpy(pInfo->ConfigEntryName, L"");
        ConfigDllExists = FALSE;
    }
    
    if (pInfo->ConfigEntry) {
        //
        // Read ConfigDllName value (if it exists)
        //
        ValLen = sizeof(pInfo->ConfigDllName);
        Status = RegQueryValueEx(Key, PCIBUS_CONFIGDLL_VALNAME, NULL, &ValType, (PUCHAR)pInfo->ConfigDllName, &ValLen);            
        if ((Status != ERROR_SUCCESS) || (ValType != PCIBUS_CONFIGDLL_VALTYPE)) {

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日本一区二区在线观看| 色综合天天综合网天天狠天天 | 国产91精品久久久久久久网曝门| 制服丝袜中文字幕一区| 奇米亚洲午夜久久精品| 欧美videossexotv100| 国产一区二三区| 国产精品久久久久久久浪潮网站| 色哟哟一区二区| 午夜久久电影网| 亚洲精品一区二区三区影院| 粉嫩在线一区二区三区视频| 亚洲欧美在线观看| 欧美猛男gaygay网站| 韩国女主播一区| 亚洲欧美福利一区二区| 精品污污网站免费看| 麻豆91精品视频| 国产精品白丝在线| 欧美日本不卡视频| 国产69精品久久久久777| 亚洲欧美国产三级| 亚洲精品在线三区| 91成人免费网站| 久久99久久99| 亚洲一区二区三区免费视频| 26uuu亚洲| 在线国产电影不卡| 国产一区日韩二区欧美三区| 亚洲伦在线观看| 久久蜜臀精品av| 欧美日韩国产区一| 成人免费va视频| 日韩va亚洲va欧美va久久| 中文字幕免费一区| 精品久久久网站| 精品视频免费在线| 不卡大黄网站免费看| 麻豆国产精品视频| 一区二区三区在线免费| 国产欧美精品一区二区色综合| 欧美亚洲动漫精品| 成人av第一页| 国产原创一区二区| 亚洲成av人影院在线观看网| 国产精品伦理一区二区| 日韩你懂的在线观看| 欧美在线一区二区| 成人av资源网站| 国内精品视频一区二区三区八戒| 亚洲一级片在线观看| 欧美高清在线视频| 久久久久久久av麻豆果冻| 4438成人网| 欧美日韩一区二区三区视频| bt欧美亚洲午夜电影天堂| 精品一区二区三区久久久| 五月综合激情日本mⅴ| 亚洲欧美日韩小说| 中文字幕一区二区三区不卡| 2020国产精品久久精品美国| 777亚洲妇女| 欧美久久免费观看| 欧美日韩国产区一| 欧美人成免费网站| 欧美日韩在线电影| 欧美三级韩国三级日本一级| 在线观看av不卡| 一本久道中文字幕精品亚洲嫩| 成人性视频免费网站| 国产99精品国产| 国产91精品欧美| 成人a免费在线看| 91香蕉视频污| 91网上在线视频| 色视频欧美一区二区三区| 91亚洲大成网污www| 色网站国产精品| 欧美亚洲自拍偷拍| 欧美制服丝袜第一页| 精品视频一区三区九区| 91精品免费在线| 日韩一区二区三区电影 | 91成人免费电影| 在线观看不卡一区| 制服丝袜日韩国产| 日韩欧美精品在线| 久久综合九色综合欧美就去吻| 久久久久88色偷偷免费 | 中文字幕在线观看不卡视频| **性色生活片久久毛片| 日韩毛片精品高清免费| 一区二区三区四区蜜桃| 日本不卡在线视频| 国产在线精品不卡| 一本色道a无线码一区v| 欧美另类一区二区三区| www激情久久| 亚洲丝袜精品丝袜在线| 午夜激情综合网| 国产真实乱子伦精品视频| 成人av免费在线观看| 欧美三级一区二区| 久久久久久免费| 亚洲天堂成人在线观看| 天天综合天天综合色| 狠狠久久亚洲欧美| www.爱久久.com| 91精品国产色综合久久| 久久久午夜精品| 亚洲制服欧美中文字幕中文字幕| 日本视频一区二区三区| 成人h动漫精品一区二| 欧美麻豆精品久久久久久| 久久影院午夜论| 一区二区三区四区精品在线视频| 看电影不卡的网站| 色综合天天视频在线观看| 宅男噜噜噜66一区二区66| 中文字幕乱码一区二区免费| 亚洲第一av色| 99麻豆久久久国产精品免费优播| 91精品国产全国免费观看| 国产精品久久久久久久久动漫 | 亚洲免费三区一区二区| 九九国产精品视频| 在线观看国产91| 国产精品日韩精品欧美在线| 亚洲v中文字幕| 99久久er热在这里只有精品66| 欧美一级日韩免费不卡| 亚洲欧美国产毛片在线| 国产精品一区免费在线观看| 欧美日韩国产美女| 亚洲精品国产a久久久久久 | 国产精品久久久久三级| 国内外成人在线| 欧美精品亚洲二区| 亚洲欧美国产高清| 99视频一区二区三区| 久久香蕉国产线看观看99| 亚洲成a天堂v人片| 欧美在线观看视频在线| 国产精品久久久久影视| 激情文学综合丁香| 日韩午夜在线影院| 亚洲成人你懂的| 欧洲精品在线观看| 亚洲精品乱码久久久久久| 成人av午夜影院| 国产日本欧美一区二区| 国产一区二区美女诱惑| 日韩一区二区在线观看视频| 午夜精品久久久久久不卡8050| 色婷婷综合视频在线观看| 久久久久国产免费免费| 国产在线精品一区二区不卡了| 欧美一区二区三区不卡| 午夜成人免费电影| 欧美日本高清视频在线观看| 一区二区免费看| 91高清视频免费看| 亚洲国产综合色| 欧美在线视频全部完| 亚洲一区二区在线播放相泽| 91丨九色丨蝌蚪富婆spa| 亚洲视频免费在线观看| 99久久精品一区二区| 中文字幕一区日韩精品欧美| caoporm超碰国产精品| 亚洲人成7777| 欧美亚洲精品一区| 亚洲第一二三四区| 日韩视频国产视频| 国产一区二区三区不卡在线观看 | 欧美日韩一区二区不卡| 婷婷中文字幕一区三区| 欧美一区二区精美| 狠狠色综合色综合网络| 久久久噜噜噜久久中文字幕色伊伊| 黄色精品一二区| 国产精品久久夜| 日本道在线观看一区二区| 亚洲国产视频在线| 日韩欧美国产高清| 成人精品视频.| 亚洲综合在线免费观看| 777精品伊人久久久久大香线蕉| 日韩精品视频网站| 久久综合999| 91麻豆精品秘密| 日韩在线观看一区二区| 久久亚洲一级片| 色综合网色综合| 日本大胆欧美人术艺术动态| 国产欧美一区二区三区网站| av成人动漫在线观看| 视频在线观看91| 国产女人水真多18毛片18精品视频| 99re热这里只有精品免费视频 |