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

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

?? pci_sample.c

?? PCI硬件的驅動程序范例
?? C
?? 第 1 頁 / 共 3 頁
字號:
#endif        
        //
        // Clean up the mess
        //
        OsrReturnPool(configInfo, deviceDescription, resources);

        OsrUnload(DriverObj);

        //
        // Indicate load failure to the I/O manager
        //
        return(code);
    }

#if DBG
    //
    // For curiosity and debugging purposes, display the resources that were
    // allocated for our use.
    //
    OsrPrintResourceList(resources);

    portStart.LowPart = 0;
    portLength = 0;
    interruptLevel = 0;
    interruptVector = 0;

#endif
    
    //
    // Decode the returned resources
    //
    // For our device, we know to expect an interrupt resource, and ONE set
    // I/O space port resources.  We expect, and we attempt to handle, no
    // other resources.
    //
    for (index = 0; index < resources->Count; index++)  {
        ULONG index2;
        
        for (index2 = 0;
             index2 < resources->List[index].PartialResourceList.Count;
             index2++) {

            PCM_PARTIAL_RESOURCE_DESCRIPTOR prd;
            
            prd = &resources->List[index].PartialResourceList.PartialDescriptors[index2];

            switch (prd->Type) {
                
                case CmResourceTypePort:

                    //
                    // Our port resources are in I/O space.  And our port
                    // space is 64. bytes long.
                    //
                    ASSERT(prd->Flags == CM_RESOURCE_PORT_IO);
                    ASSERT(prd->u.Port.Length == 64);

                    portStart.HighPart = 0;
                    portStart.LowPart  =  prd->u.Port.Start.LowPart;
                    portLength =  prd->u.Port.Length;
                    break;

                case CmResourceTypeInterrupt:

                    //
                    // PCI interrupts are level sensitive
                    //
                    ASSERT(prd->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE);

                    interruptLevel = prd->u.Interrupt.Level;
                    interruptVector = prd->u.Interrupt.Vector;
                    break;

#if DBG
                case CmResourceTypeMemory:
                    DbgPrint("...Unexpected memory resource!\n");
                    break;

                case CmResourceTypeDma:
                    DbgPrint("...Unexpected DMA resource!\n");
                    break;

                case CmResourceTypeDeviceSpecific:
                    DbgPrint("...Unexpected device specific resource!\n");
                    break;
#endif
                default:
                    DbgPrint("Unexpected and unknown resource type\n");
                    break;
            }
            
        }

    }

    //
    // We NEED the interrupt info AND one port
    //
    ASSERT(interruptLevel && interruptVector && portStart.LowPart && portLength);

    //
    // Indciate that the resigsters are in port space on this card
    //
    addressSpace = 0x01;

    //
    // Get the HAL to translate our bus-relative port base address, to an
    // unambiguous address to be used for device access.  If we're returned
    // FALSE, the call failed.
    //
    if (!HalTranslateBusAddress(PCIBus,
                               devExt->BusNumber,
                               portStart,
                               &addressSpace,
                               &address))  {
        //
        // Print an appropriate error string.
        //
#if DBG
        DbgPrint("HalAssignSlotResourced failed\n");
#endif

        //
        // Clean up the mess
        //
        OsrReturnPool(configInfo, deviceDescription, resources);

        OsrUnload(DriverObj);

        //
        //
        return(STATUS_UNSUCCESSFUL);
    }
    
    //
    // If this card's I/O space registers actually appear in memory space on
    // this processor, we need to map them with some kernel virtual addresses
    // so we can access them. This may be the case on, for example, some RISC
    // processors. NOTE HOWEVER, that regardless of the addressSpace returned,
    // since the registers on the card are in PORT I/O space, we will ALWAYS
    // access them in the driver using WRITE_PORT_xxx and READ_PORT_xxx.
    //
    if (addressSpace == 0x0) {
        ULONG lengthInBytes;

#if DBG
        DbgPrint("Address space for port is MEMORY\n");
#endif

        lengthInBytes =
           resources->List[0].PartialResourceList.PartialDescriptors[1].u.Port.Length;

        //
        // Maps a potentially 64 bit physical address to a 32 bit virtual address.
        //
        devExt->AmccBaseRegisterAddress = MmMapIoSpace(address,
                                                       lengthInBytes,
                                                       FALSE);

    } else {

        ASSERT(addressSpace == 0x01);

#if DBG
        DbgPrint("Address space is port\n");
#endif
        //
        // Port I/O space is only 16 bits long, so we can grab the low 32 bits
        // of the address only.
        //
        devExt->AmccBaseRegisterAddress = (PULONG)address.LowPart;

    }
    
#if DBG
    DbgPrint("OSRPCI Registers start at 0x%x", devExt->AmccBaseRegisterAddress);
#endif
    //
    // Register our DpcforISR routine.  This is the routine which will
    // be used to complete our interrupt processing.
    //
    IoInitializeDpcRequest(devObj, OsrDpcForIsr);
    
    //
    // Like port and memory addresses, interrupts also have to be "translated"
    // from bus-specific values.
    //
    mappedSystemVector = HalGetInterruptVector(PCIBus,
                                                devExt->BusNumber,
                                                interruptLevel,
                                                interruptVector,
                                                &irql,
                                                &affinity);
#if DBG
    DbgPrint("HalGetInterruptVector returned vector 0x%x, IRQL 0x%0x, Affinity 0x%0x\n",
                    mappedSystemVector,
                    irql,
                    affinity);
#endif

    //
    // Connect to interrupt from the device.  After this call,
    // interrupts from the device will result in calls to our OsrHandleInterrupt
    // function.
    //
    code = IoConnectInterrupt(&devExt->InterruptObject,
                              OsrHandleInterrupt,
                              devExt,
                              NULL,
                              mappedSystemVector,
                              irql,
                              irql,
                              LevelSensitive,
                              TRUE,
                              affinity,
                              FALSE);
    if (!NT_SUCCESS(code))  {

#if DBG
        DbgPrint("IoConnectInterrupt failed with error 0x%x", code);
#endif

        //
        // Clean up the mess
        //
        OsrReturnPool(configInfo, deviceDescription, resources);

        OsrUnload(DriverObj);

        //
        // Indicate load failure to the I/O manager; driver image is deleted...
        //
        return(code);
    }
    
    //
    // Now we reset the adapter card.
    //
    OsrResetAdapter(devObj, FALSE);

    //
    // Finally, we get our adapter objects from the HAL. When we do this,
    // we describe out device to the HAL in pretty gory detail.   In return,
    // he gives us a pointer to our adapter object, and tells us the maximum
    // number of mapping registers we should ever use.  This is based on
    // the maximum transfer size that we support, yet limited by the number
    // of available map registers on HALs where real map registers are used.
    // 
    // Note that since this device is capable of performing reads and writes
    // in parallel we allocate TWO ADAPTER OBJECTS.  We use the same device
    // description structure for both, since the device's READ DMA ability is
    // identical to its WRITE DMA ability.
    // 
    deviceDescription = ExAllocatePoolWithTag(PagedPool,
                                            sizeof(DEVICE_DESCRIPTION), 'dRSO');

    //
    // Important: Zero out the entire structure first!
    //
    RtlZeroMemory(deviceDescription, sizeof(DEVICE_DESCRIPTION));

    deviceDescription->Version = DEVICE_DESCRIPTION_VERSION;
    deviceDescription->Master = TRUE;
    deviceDescription->ScatterGather = FALSE;
    deviceDescription->Dma32BitAddresses = TRUE;
    deviceDescription->BusNumber = devExt->BusNumber;
    deviceDescription->InterfaceType = PCIBus;

    //
    // Maximum size of transfer that we support on this device.
    //
    deviceDescription->MaximumLength = OSR_PCI_MAX_TXFER;

    devExt->ReadAdapter = HalGetAdapter(deviceDescription, &devExt->ReadMapRegsGot);

    if(!devExt->ReadAdapter)  {

#if DBG
        DbgPrint("HalGetAdapter for READ FAILED!!\n");    
#endif
        //
        // Clean up the mess
        //
        OsrReturnPool(configInfo, deviceDescription, resources);

        OsrUnload(DriverObj);

        return(STATUS_UNSUCCESSFUL);
    }

#if DBG
    DbgPrint("Map Registers got for read = %d.\n", devExt->ReadMapRegsGot);
#endif

    //
    // Get ANOTHER Adapter Object for use with WRITE transfers
    //
    devExt->WriteAdapter = HalGetAdapter(deviceDescription, &devExt->WriteMapRegsGot);

    if(!devExt->WriteAdapter)  {

#if DBG
        DbgPrint("HalGetAdapter for WRITE FAILED!!\n");    
#endif
        //
        // Clean up the mess
        //
        OsrReturnPool(configInfo, deviceDescription, resources);

        OsrUnload(DriverObj);

        return(STATUS_UNSUCCESSFUL);
    }

#if DBG
    DbgPrint("Map Registers got for write = %d.\n", devExt->WriteMapRegsGot);
#endif

    //
    // Initialize the watchdog timer.  This timer causes a "soft reset"
    // on the device, in a particular direction, if an in-progress IRP
    // hangs around too long.
    //
    IoInitializeTimer(devObj, OsrWatchdogTimer, NULL);
    IoStartTimer(devObj);

    //
    // Return the memory allocated from pool during initialization
    //
    ExFreePool(configInfo);
    ExFreePool(deviceDescription);    
    
    //
    // Don't forget to free the CM_RESOURCE_LIST structure!
    // Even though HalAssignSlotResources(...) allocated it, we're
    // responsible for freeing it!!
    //
    ExFreePool(resources); 

#if DBG
    DbgPrint("DriverEntry: done\n");
#endif
    
    return(STATUS_SUCCESS);
    
}

///////////////////////////////////////////////////////////////////////////////
//
//  OsrUnload
//
//      This routine is our dynamic unload entry point.  We are called here when
//    the OS wants to unload our driver.  It is our responsibility to release any
//    resources we allocated.
//
//  INPUTS:
//
//      DriverObj - Address of our DRIVER_OBJECT.
//
//  OUTPUTS:
//
//      None.
//
//  RETURNS:
//
//      None.
//
//  IRQL:
//
//    This routine is called at IRQL_PASSIVE_LEVEL.
//
//  NOTES:
//
//    No doubt we pool leak at this entry point by not properly returning everything.
//
///////////////////////////////////////////////////////////////////////////////
static VOID
OsrUnload(PDRIVER_OBJECT DriverObject)
{
    POSR_DEVICE_EXT devExt;
    PDEVICE_OBJECT devObj;
    IO_RESOURCE_REQUIREMENTS_LIST reqList;
    NTSTATUS code;
    UNICODE_STRING linkName;
    CM_RESOURCE_LIST returnResources;
    BOOLEAN conflictDetected;
            
#if DBG
    DbgPrint("SAMPLE-PCI: UNLOAD called.\n");
#endif

    //
    // For THIS driver, there will only ever be a single device object.
    // Because of this, we just get it from the DriverObj.  If this were
    // a multiple device driver, we would do this in a while loop...
    //
    devObj = DriverObject->DeviceObject;

    if (!devObj) {

        return;
    }

    devExt= (POSR_DEVICE_EXT)devObj->DeviceExtension;

    RtlInitUnicodeString(&linkName, L"\\??\\OSRPCI");

    IoDeleteSymbolicLink(&linkName);

    //
    // Reset the adapter card
    //
    OsrResetAdapter(devObj, FALSE);

    if (devExt->InterruptObject) {
        //
        // Disconnect the interrupt.
        //
        IoDisconnectInterrupt(devExt->InterruptObject);
    }

    //
    // Set up a "special" reasource list, that indicates NO RESOURCES.
    // This will result in our resouces being returned.
    //
    returnResources.Count = 0;

    code = IoReportResourceUsage(NULL,
                                DriverObject,
                                NULL,
                                0,
                                devObj,
                                &returnResources,
                                sizeof(returnResources),
                                FALSE,
                                &conflictDetected);

    if(!NT_SUCCESS(code))  {
        
#if DBG
        DbgPrint("UNLOAD: IoReportResourceUsage failed.  Status = 0x%0x\n",
                        code);
#endif
    }                          

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区欧美日韩| 欧美精品一区二区不卡| 床上的激情91.| 国产精品一二三区在线| 久久机这里只有精品| 秋霞电影一区二区| 亚洲午夜电影在线观看| 亚洲一级片在线观看| 亚洲成人自拍网| 亚洲成在线观看| 麻豆国产91在线播放| 老司机免费视频一区二区| 久久机这里只有精品| 国模套图日韩精品一区二区| 国产毛片精品视频| 99久久国产免费看| 欧美亚洲综合网| 欧美一区二区大片| 精品第一国产综合精品aⅴ| 日本一区二区三区高清不卡| 中文字幕在线一区免费| 亚洲精品伦理在线| 国产盗摄精品一区二区三区在线| 经典三级视频一区| 成人免费视频播放| 欧美性xxxxxxxx| 精品国产乱码久久久久久夜甘婷婷| 亚洲精品在线观看网站| 国产精品女同一区二区三区| 一区二区三区在线免费| 麻豆久久久久久久| 97久久精品人人做人人爽| 在线亚洲人成电影网站色www| 91精品欧美综合在线观看最新| 精品美女一区二区| 亚洲激情图片qvod| 精品一区二区日韩| 欧美撒尿777hd撒尿| 久久精品日产第一区二区三区高清版| 中文字幕中文字幕在线一区 | 精品欧美乱码久久久久久| 欧美国产1区2区| 天使萌一区二区三区免费观看| 精品制服美女丁香| 欧美性xxxxx极品少妇| 国产农村妇女精品| 美女精品自拍一二三四| 91欧美一区二区| 精品黑人一区二区三区久久 | 日韩视频一区二区三区在线播放| 国产日韩欧美精品综合| 日韩精品一级二级| 色综合一个色综合| 精品成人一区二区| 强制捆绑调教一区二区| 在线观看亚洲精品| 国产精品高潮呻吟久久| 日本欧美在线看| 在线日韩国产精品| 中文一区二区完整视频在线观看 | 精品入口麻豆88视频| 亚洲免费资源在线播放| 国产精品自拍毛片| 欧美v亚洲v综合ⅴ国产v| 日韩专区欧美专区| 欧美老肥妇做.爰bbww视频| 国产精品国产馆在线真实露脸| 精品亚洲成a人| 日韩视频免费直播| 日韩有码一区二区三区| 欧美亚洲自拍偷拍| 亚洲资源中文字幕| 在线影视一区二区三区| 亚洲精品久久久蜜桃| 91在线精品一区二区三区| 亚洲国产精品高清| 国产69精品一区二区亚洲孕妇| 久久精品亚洲乱码伦伦中文| 久久91精品国产91久久小草 | 国产成a人亚洲精品| 久久亚区不卡日本| 国产乱对白刺激视频不卡| 久久综合国产精品| 成人黄色777网| 亚洲人午夜精品天堂一二香蕉| 成人av资源站| 亚洲免费观看高清完整版在线| 99精品在线观看视频| 亚洲精品一卡二卡| 欧美日韩一区久久| 毛片不卡一区二区| 久久精品网站免费观看| 99久久免费视频.com| 一区二区免费视频| 欧美一区二区网站| 国产一区二区按摩在线观看| 亚洲国产精品成人综合| 99re成人精品视频| 一级女性全黄久久生活片免费| 在线成人av网站| 国产呦萝稀缺另类资源| 国产精品系列在线| 欧美丝袜丝交足nylons图片| 美女任你摸久久| 欧美激情中文不卡| 日本韩国欧美国产| 极品美女销魂一区二区三区| 综合激情成人伊人| 日韩午夜在线观看视频| 成人av电影免费观看| 亚洲成人精品一区二区| 久久久综合网站| 一本色道a无线码一区v| 看电视剧不卡顿的网站| 国产精品成人在线观看| 337p亚洲精品色噜噜| 国产91对白在线观看九色| 亚洲国产欧美另类丝袜| 久久日一线二线三线suv| 色狠狠桃花综合| 国产馆精品极品| 首页国产欧美久久| 国产精品视频一区二区三区不卡| 欧美色图第一页| 91亚洲国产成人精品一区二三 | 26uuu亚洲综合色| 在线一区二区三区四区| 国产精品亚洲成人| 日日摸夜夜添夜夜添亚洲女人| 亚洲欧洲在线观看av| 精品久久久久久久久久久久久久久久久| 91啪亚洲精品| 丰满亚洲少妇av| 久久 天天综合| 青娱乐精品视频| 亚洲国产一区二区视频| 国产精品久久久久7777按摩| 欧美成人a视频| 日韩欧美一区二区在线视频| 91久久久免费一区二区| av亚洲精华国产精华精华| 国产乱对白刺激视频不卡| 免费在线成人网| 亚洲h在线观看| 亚洲精品国久久99热| 亚洲人成影院在线观看| 国产精品少妇自拍| 中文字幕在线观看不卡| 国产日韩三级在线| 久久久国产一区二区三区四区小说| 91麻豆精品久久久久蜜臀| 欧美日韩一区二区三区在线看| 91免费观看视频| 91麻豆123| 91久久香蕉国产日韩欧美9色| 91丨porny丨最新| 一本一道久久a久久精品 | 偷拍与自拍一区| 视频一区视频二区中文字幕| 亚洲高清在线精品| 亚洲电影视频在线| 亚洲国产成人av网| 成人激情文学综合网| 国产精品一区二区x88av| 国产一区美女在线| 国产伦精一区二区三区| 国产aⅴ综合色| caoporn国产精品| 91福利精品视频| 欧美日韩aaa| 26uuu国产一区二区三区| 久久亚洲综合av| 亚洲手机成人高清视频| 亚洲成av人片在www色猫咪| 午夜a成v人精品| 黄页视频在线91| 成人福利视频网站| 91成人在线精品| 久久综合一区二区| 中文字幕亚洲一区二区va在线| 亚洲一二三区在线观看| 免费精品视频最新在线| 丁香婷婷综合激情五月色| 色又黄又爽网站www久久| 91精品国产综合久久香蕉的特点| 精品久久国产97色综合| 亚洲欧洲另类国产综合| 欧美aa在线视频| 成人免费视频app| 欧美日韩aaaaa| 日本一区二区三区高清不卡| 丝袜亚洲另类欧美综合| 成人av影院在线| 91麻豆精品91久久久久同性| 亚洲国产精品成人综合色在线婷婷 | 欧美四级电影网| 国产人久久人人人人爽| 日韩综合一区二区| 色综合咪咪久久| 26uuu亚洲|