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

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

?? pcicfg.cpp

?? 這是運行在windows ce 4.2 版本下的關于硬盤加載的驅動程序
?? 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 <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <PCIbus.h>
#include <debug.h>

//
// Function prototypes
//
static BOOL ConfigRsrc(
    PPCI_DEV_INFO pInfo,
    PPCI_RSRC pMemHead,
    PPCI_RSRC pIoHead,
    DWORD *pMemSize,
    DWORD *pIoSize 
    );

static BOOL ConfigSize(
    PPCI_DEV_INFO pInfo 
    );

static BOOL ConfigInit(
    PPCI_DEV_INFO pInfo 
    );


__inline static DWORD
PCIConfig_Read(
    ULONG BusNumber,
    ULONG Device,
    ULONG Function,
    ULONG Offset
    );


__inline static void
PCIConfig_Write(
    ULONG BusNumber,
    ULONG Device,
    ULONG Function,
    ULONG Offset,
    ULONG Value,
    ULONG Size = sizeof(DWORD)
    );



//
// DeviceConfig
//
EXTERN_C DWORD GenericConfig(
    DWORD Command, 
    PPCI_DEV_INFO pInfo,
    PPCI_RSRC pRsrc1,
    PPCI_RSRC pRsrc2,
    DWORD *pMemSize,
    DWORD *pIoSize
    )
{
    DEBUGMSG(1, (L"ATAPI:PCIConfig!DeviceConfig+(%d)\r\n", Command));

    switch (Command) {
    case PCIBUS_CONFIG_RSRC:
        if (ConfigRsrc(pInfo, pRsrc1, pRsrc2, pMemSize, pIoSize)) {
            return ERROR_SUCCESS;
        } else {
            return ERROR_GEN_FAILURE;
        }

    case PCIBUS_CONFIG_SET:
        return ERROR_NOT_SUPPORTED;
        
    case PCIBUS_CONFIG_SIZE:
        if (ConfigSize(pInfo)) {
            return ERROR_SUCCESS;
        } else {
            return ERROR_GEN_FAILURE;
        }

    case PCIBUS_CONFIG_INIT:
        if (ConfigInit(pInfo)) {
            return ERROR_SUCCESS;
        } else {
            return ERROR_GEN_FAILURE;
        }

    default:
        break;
    }

    DEBUGMSG(1, (L"ATAPI:PCIConfig!DeviceConfig-: ERROR: Command %d not recognized\r\n", Command));
    
    return ERROR_BAD_COMMAND;
}


// Inline functions
__inline static DWORD
PCIConfig_Read(
    ULONG BusNumber,
    ULONG Device,
    ULONG Function,
    ULONG Offset
    )
{
    ULONG RetVal = FALSE;
    PCI_SLOT_NUMBER SlotNumber;

    SlotNumber.u.AsULONG = 0;
    SlotNumber.u.bits.DeviceNumber = Device;
    SlotNumber.u.bits.FunctionNumber = Function;
    
    HalGetBusDataByOffset(PCIConfiguration, BusNumber, SlotNumber.u.AsULONG, &RetVal, Offset, sizeof(RetVal));

    return RetVal;
}

// Inline functions
__inline static BYTE
PCIConfig_ReadByte(
    ULONG BusNumber,
    ULONG Device,
    ULONG Function,
    ULONG Offset
    )
{
    BYTE  RetVal = FALSE;
    PCI_SLOT_NUMBER SlotNumber;

    SlotNumber.u.AsULONG = 0;
    SlotNumber.u.bits.DeviceNumber = Device;
    SlotNumber.u.bits.FunctionNumber = Function;
    
    HalGetBusDataByOffset(PCIConfiguration, BusNumber, SlotNumber.u.AsULONG, &RetVal, Offset, sizeof(RetVal));

    return RetVal;
}



__inline static void
PCIConfig_Write(
    ULONG BusNumber,
    ULONG Device,
    ULONG Function,
    ULONG Offset,
    ULONG Value,
    ULONG Size
    )
{
    PCI_SLOT_NUMBER SlotNumber;

    SlotNumber.u.AsULONG = 0;
    SlotNumber.u.bits.DeviceNumber = Device;
    SlotNumber.u.bits.FunctionNumber = Function;

    HalSetBusDataByOffset(PCIConfiguration, BusNumber, SlotNumber.u.AsULONG, &Value, Offset, Size);
}


__inline static void
InsertRsrc(
    PPCI_RSRC Ptr, 
    PPCI_RSRC Rsrc
    ) 
{
    Rsrc->Next = Ptr;
    Rsrc->Prev = Ptr->Prev;
    Ptr->Prev->Next = Rsrc;
    Ptr->Prev = Rsrc;
}


__inline static void
RemoveRsrc(
    PPCI_RSRC Rsrc
    )
{
    Rsrc->Prev->Next = Rsrc->Next;
    Rsrc->Next->Prev = Rsrc->Prev;
}
void
PCIRsrc_Add(
    PPCI_RSRC Head,
    PPCI_RSRC Rsrc
    )
{
    PPCI_RSRC Ptr;

    // Find place to insert Rsrc.  Sort first on Placed then Size.
    for (Ptr = Head->Next; Ptr != Head; Ptr = Ptr->Next) {
        if (Rsrc->Placed) {
            if (!Ptr->Placed) break;

            if (Rsrc->Size > Ptr->Size) break;
        } else {
            if (Ptr->Placed) continue;

            if (Rsrc->Size > Ptr->Size) break;
        }
    }
            
    // Insert Rsrc node
    InsertRsrc(Ptr, Rsrc); 
}


PPCI_RSRC
PCIRsrc_New(
    DWORD Bus,
    DWORD Device,
    DWORD Function,
    DWORD Offset,
    DWORD Base,
    DWORD Size,
    BOOL Bridge,
    DWORD SecBus,
    BOOL Placed,
    PPCI_CFG_INFO ConfigInfo
    )
{
    PPCI_RSRC Rsrc;

    Rsrc = (PPCI_RSRC)LocalAlloc(0, sizeof(PCI_RSRC));

    if (!Rsrc) return NULL;
    
    Rsrc->Bus = Bus;
    Rsrc->Device = Device;
    Rsrc->Function = Function;
    Rsrc->Offset = Offset;
    Rsrc->Base = Base;
    Rsrc->Size = Size;
    Rsrc->Bridge = Bridge;
    Rsrc->SecBus = SecBus;
    Rsrc->Placed = Placed;
    Rsrc->ConfigInfo = ConfigInfo;
    Rsrc->Next = Rsrc;
    Rsrc->Prev = Rsrc;

    return Rsrc;
}

//
// ConfigRsrc
//
static BOOL ConfigRsrc(
    PPCI_DEV_INFO pInfo,
    PPCI_RSRC pMemHead,
    PPCI_RSRC pIoHead,
    DWORD *pMemSize,
    DWORD *pIoSize   
    )
{
    DWORD NumberOfRegs;
    ULONG Offset;
    ULONG i;
    ULONG BaseAddress;
    ULONG Size;
    ULONG Type;
    DWORD Reg;
    BOOL SizeFound;
    DWORD IoIndex = 0;
    DWORD MemIndex = 0;
    DWORD Bus = pInfo->Bus;
    DWORD Device = pInfo->Device;
    DWORD Function = pInfo->Function;
    PPCI_COMMON_CONFIG pCfg = pInfo->Cfg;

    DEBUGMSG(ZONE_PCI | ZONE_INIT, (L"ATAPI:PCIConfig!ConfigRsrc+(Bus %d, Device %d, Function %d)\r\n",
        Bus, Device, Function));

    // Determine number of BARs to examine from header type
    switch (pCfg->HeaderType & ~PCI_MULTIFUNCTION) {
    case PCI_DEVICE_TYPE:
        NumberOfRegs = PCI_TYPE0_ADDRESSES;
        break;

    case PCI_BRIDGE_TYPE:
        NumberOfRegs = PCI_TYPE1_ADDRESSES;
        break;

    case PCI_CARDBUS_TYPE:
        NumberOfRegs = PCI_TYPE2_ADDRESSES;
        break;

    default:
        return FALSE;
    }
    
    for (i = 0, Offset = 0x10; i < NumberOfRegs; i++, Offset += 4) {
        // Get base address register value
        Reg = pCfg->u.type0.BaseAddresses[i];
        Type = Reg & PCI_ADDRESS_IO_SPACE;
        
        // Probe hardware for size
        PCIConfig_Write(Bus,Device,Function,Offset,0xFFFFFFFF);
        BaseAddress = PCIConfig_Read(Bus,Device,Function,Offset);
        PCIConfig_Write(Bus, Device, Function, Offset, Reg);

        if (Type) {
            // IO space
            // Re-adjust BaseAddress if upper 16-bits are 0 (allowable in PCI 2.2 spec)
            if (((BaseAddress & PCI_ADDRESS_IO_ADDRESS_MASK) != 0) && ((BaseAddress & 0xFFFF0000) == 0)) {
                BaseAddress |= 0xFFFF0000;
            }
            
            Size = ~(BaseAddress & PCI_ADDRESS_IO_ADDRESS_MASK);
            Reg &= PCI_ADDRESS_IO_ADDRESS_MASK;
        } else {
            // Memory space
            if ((Reg & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_20BIT) {
                // PCI 2.2 spec no longer supports this type of memory addressing
                DEBUGMSG(ZONE_ERROR, (L"ATAPI:PCIConfig!ConfigRsrc: 20-bit addressing not supported\r\n"));
                return FALSE;
            }
            
            // Re-adjust BaseAddress if upper 16-bits are 0 (allowed by PCI 2.2 spec)
            if (((BaseAddress & PCI_ADDRESS_MEMORY_ADDRESS_MASK) != 0) && ((BaseAddress & 0xFFFF0000) == 0)) {
                BaseAddress |= 0xFFFF0000;
            }
            
            Size = ~(BaseAddress & PCI_ADDRESS_MEMORY_ADDRESS_MASK);
            Reg &= PCI_ADDRESS_MEMORY_ADDRESS_MASK;
        }

        // Check that the register has a valid format; it should have consecutive high 1's and consecutive low 0's
        SizeFound = (BaseAddress != 0) && (BaseAddress != 0xFFFFFFFF) && (((Size + 1) & Size) == 0);

        Size +=1;

        if (SizeFound) {
            PPCI_RSRC Rsrc = PCIRsrc_New(Bus, Device, Function, Offset, Reg, Size, FALSE, 0, FALSE, pInfo->ConfigInfo);

            if (!Rsrc) {
                DEBUGMSG(ZONE_PCI | ZONE_ERROR, (L"ATAPI:PCIConfig!ConfigRsrc: Failed local alloc of Rsrc\r\n"));
                return FALSE;
            }

            if (Type == PCI_ADDRESS_IO_SPACE) {
                *pIoSize += Size;
                PCIRsrc_Add(pIoHead, Rsrc);
            } else {
                *pMemSize += Size;
                PCIRsrc_Add(pMemHead, Rsrc);
            }

            DEBUGMSG(ZONE_PCI | ZONE_INIT, (L"ATAPI:PCIConfig!ConfigRsrc: BAR(%d/%d/%d): Offset 0x%x, Type %s, Size 0x%X\r\n",
                Bus, Device, Function, Offset, (Type == PCI_ADDRESS_IO_SPACE) ? TEXT("I/O") : TEXT("Memory"), Size));
        } else {
            // Some devices have invalid BARs before valid ones (even though the spec says you can't).  Skip invalid BARs.
            continue;
        }

        // check for 64 bit device (memory only)
        if ((Type == PCI_ADDRESS_MEMORY_SPACE) && ((Reg & PCI_ADDRESS_MEMORY_TYPE_MASK) == PCI_TYPE_64BIT)) {
            // 64 bit device - BAR is twice as wide - zero out high part

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区日韩一区二区| 久久理论电影网| 中文字幕一区免费在线观看| 国产91色综合久久免费分享| 成人福利电影精品一区二区在线观看 | 一区二区三区不卡视频在线观看| 欧美午夜电影网| 一区二区三区自拍| 欧美日韩视频专区在线播放| 日韩电影在线免费看| 日韩欧美国产精品一区| 国产精品综合一区二区三区| 国产欧美一区二区三区网站| 99国产精品久久久久久久久久 | 国产精品综合视频| 中文欧美字幕免费| 欧美中文字幕一区| 久久精品av麻豆的观看方式| 久久久欧美精品sm网站| 97久久精品人人做人人爽 | 国产精品电影院| 欧美丝袜丝交足nylons| 久久99国产精品久久99果冻传媒| 久久久精品国产免大香伊| 91农村精品一区二区在线| 天涯成人国产亚洲精品一区av| 日韩精品一区二| 91在线国产福利| 美女免费视频一区| 成人免费在线播放视频| 日韩欧美一级精品久久| 成人在线综合网| 日韩国产高清在线| 国产精品久久久久久久久久免费看 | 国产精品久久久久影院老司| 欧美人与z0zoxxxx视频| 国产成人丝袜美腿| 五月婷婷激情综合| 国产精品久久久久永久免费观看| 欧美理论电影在线| 91视频国产资源| 狠狠色丁香婷婷综合久久片| 亚洲午夜一区二区三区| 中文字幕乱码亚洲精品一区| 91精品国产综合久久久久| 成人国产视频在线观看| 久久精品噜噜噜成人88aⅴ | 亚洲成人av在线电影| 欧美激情在线观看视频免费| 欧美一级夜夜爽| 欧洲中文字幕精品| 成人国产一区二区三区精品| 麻豆精品国产传媒mv男同| 亚洲美女免费在线| 中文字幕高清不卡| 久久久久久久国产精品影院| 欧美一卡二卡在线观看| 欧美日韩国产小视频| 91麻豆免费看片| 成人av第一页| 国产福利一区二区三区视频| 久久国产麻豆精品| 五月激情丁香一区二区三区| 亚洲黄色在线视频| 亚洲欧美另类综合偷拍| 欧美国产精品专区| 国产视频不卡一区| wwww国产精品欧美| 26uuu久久天堂性欧美| 日韩一卡二卡三卡四卡| 制服丝袜亚洲网站| 欧美美女激情18p| 精品视频一区三区九区| 欧美少妇一区二区| 欧美日韩一区在线| 欧美日韩在线一区二区| 欧美日韩你懂得| 欧美日韩午夜精品| 欧美一区二区三区免费在线看| 欧美日韩精品欧美日韩精品| 欧美日韩一区不卡| 欧美日韩国产综合一区二区| 欧美丰满美乳xxx高潮www| 欧美巨大另类极品videosbest| 欧美日韩国产天堂| 欧美一区二区精品在线| 欧美mv日韩mv| 国产日产欧产精品推荐色| 国产午夜精品一区二区三区四区| 久久久久久黄色| 欧美极品aⅴ影院| 亚洲免费看黄网站| 亚洲国产成人porn| 另类小说视频一区二区| 韩国v欧美v日本v亚洲v| 成人精品一区二区三区中文字幕| 成人免费看视频| 欧美在线视频你懂得| 欧美一区中文字幕| 久久久天堂av| 一区二区在线观看视频在线观看| 亚洲一区二区三区四区在线免费观看| 午夜精品久久久久久久| 奇米影视7777精品一区二区| 国产成人av网站| 色婷婷精品大视频在线蜜桃视频| 欧美日韩一区在线| 精品福利在线导航| 亚洲欧美乱综合| 看国产成人h片视频| av不卡免费在线观看| 欧美日韩一区在线| 国产欧美一区在线| 亚洲一区二区综合| 国产精品1区二区.| 在线观看欧美精品| 久久综合久久99| 亚洲一区二区三区视频在线| 国产一区二区免费在线| 色94色欧美sute亚洲线路二| 精品剧情在线观看| 夜色激情一区二区| 国产精品羞羞答答xxdd| 欧美性欧美巨大黑白大战| 久久久亚洲欧洲日产国码αv| 一区二区三区精品| 国产精品一区2区| 在线不卡a资源高清| 最新中文字幕一区二区三区| 人人爽香蕉精品| 一本久道中文字幕精品亚洲嫩| 精品sm在线观看| 亚洲高清不卡在线观看| 成人h动漫精品一区二区| 欧美一区二区三区小说| 一区二区三区美女| 顶级嫩模精品视频在线看| 337p亚洲精品色噜噜| 一区二区三区蜜桃| 99在线精品观看| 国产片一区二区三区| 日本不卡视频在线| 欧美性受极品xxxx喷水| 国产精品成人一区二区艾草 | 欧美午夜不卡在线观看免费| 国产欧美精品一区aⅴ影院 | 国产一区二区三区蝌蚪| 欧美日韩在线播放| 亚洲欧美日韩国产手机在线| 国产一区二区h| 欧美电影精品一区二区| 天天影视网天天综合色在线播放| 91伊人久久大香线蕉| 欧美国产综合一区二区| 国产乱一区二区| 亚洲精品在线网站| 老司机精品视频在线| 制服丝袜亚洲播放| 日韩精品成人一区二区三区| 欧美中文字幕一二三区视频| 一区二区三区国产精华| 91在线观看污| 亚洲色图视频网| 91免费国产在线观看| 中文字幕一区二区三区av| 成人影视亚洲图片在线| 国产欧美日韩不卡| 国产成人精品一区二区三区四区| 久久亚洲影视婷婷| 国产成人午夜高潮毛片| 日本一区二区三区视频视频| 懂色av一区二区夜夜嗨| 欧美国产成人精品| heyzo一本久久综合| 综合久久久久久| 欧美在线|欧美| 日韩1区2区日韩1区2区| 日韩视频免费观看高清完整版在线观看 | 色综合久久88色综合天天免费| 国产精品短视频| 欧美在线观看一区二区| 午夜精品久久久久久不卡8050| 91精品国产欧美日韩| 加勒比av一区二区| 亚洲国产精品激情在线观看| www.欧美日韩| 亚洲已满18点击进入久久| 欧美一区二区黄| 国产激情偷乱视频一区二区三区 | 91精品国产一区二区三区蜜臀| 免费高清视频精品| 久久久777精品电影网影网| 本田岬高潮一区二区三区| 亚洲一区在线看| 日韩欧美高清一区| 成人国产精品免费观看| 一区二区三区不卡视频在线观看| 日韩一区二区免费高清| 国产成人夜色高潮福利影视| 依依成人精品视频|