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

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

?? skeleton.c

?? PCI驅動開發框架
?? C
?? 第 1 頁 / 共 3 頁
字號:
UnmapMemory(IN PDEVICE_OBJECT devObj, IN OUT PVOID ioBuf,	  IN ULONG inBufLen, IN ULONG outBufLen){    if (inBufLen < sizeof(PVOID)) {	KdPrint(("SKELETON.SYS(UnmapMemory): Insufficient input buffer\n"));	return STATUS_BUFFER_TOO_SMALL;    }    KdPrint(("SKELETON.SYS: memory unmapped\n"));    return ZwUnmapViewOfSection((HANDLE) -1, *((PVOID *) ioBuf));}/* *---------------------------------------------------------------------- * ResetBoard -- * *	Does a hard reset of the board * *---------------------------------------------------------------------- */static VOIDResetBoard(PSKELETON_DEVICE skelDev){    PUCHAR	 		    base;    /*     * Reset the board     */    base = skelDev->FrameBase;    *((unsigned long *)(base + 0x7f0000)) = 0;    KeStallExecutionProcessor(500);    /*     * Enable the board     */    *((unsigned long *)(base + 0x7f0000)) = LITTLE_ENDIAN_32(1);}/* *---------------------------------------------------------------------- * CreateDevice -- * *	Create a Skeleton device * *---------------------------------------------------------------------- */static NTSTATUSCreateDevice(IN PDRIVER_OBJECT drvObj, IN PUNICODE_STRING regPath,	     ULONG busId, ULONG slotId, IN PPCI_COMMON_CONFIG pciData){    PDEVICE_OBJECT		    devObj = NULL;    WCHAR			    devNameBuf[] = L"\\Device\\Skeleton0";    UNICODE_STRING		    devNameUniStr;    WCHAR			    devLinkBuf[] = L"\\DosDevices\\SKELETON0";    UNICODE_STRING		    devLinkUniStr;    NTSTATUS			    status;    INTERFACE_TYPE		    interfaceType;    ULONG			    busNumber;    PCM_RESOURCE_LIST		    resourceList;    PCM_PARTIAL_RESOURCE_LIST	    partialResourceList;    PCM_PARTIAL_RESOURCE_DESCRIPTOR partialDescriptor;    PHYSICAL_ADDRESS		    xlatedAddr;    PHYSICAL_ADDRESS		    start;    ULONG			    length;    ULONG			    addressSpace;    PSKELETON_DEVICE		    skelDev;    ULONG			    i, j;    BOOLEAN			    b;    int				    found;    DEVICE_DESCRIPTION		    devDesc;    static WCHAR		    devNum = 0;        devNameBuf[sizeof(devNameBuf) - 2] = L'0' + devNum;    devLinkBuf[sizeof(devLinkBuf) - 2] = L'0' + devNum;    devNum++;    RtlInitUnicodeString(&devNameUniStr, devNameBuf);    status = IoCreateDevice(drvObj, sizeof(SKELETON_DEVICE), &devNameUniStr,			    FILE_DEVICE_SKELETON, 0, FALSE, &devObj);    devObj->Flags |= DO_DIRECT_IO;    /*     * 1. Create dispatch points for device control, create, close.     * 2. Create a symbolic link, i.e. a nmae that a Win32 app can     *    specify to open the device.  If this fails, delete the     *    device object.     */    if (! NT_SUCCESS(status)) {        KdPrint(("SKELETON.SYS: IoCreateDevice failed\n"));	return status;    }    RtlInitUnicodeString(&devLinkUniStr, devLinkBuf);    status = IoCreateSymbolicLink(&devLinkUniStr, &devNameUniStr);    if (!NT_SUCCESS(status)) {	KdPrint(("SKELETON.SYS: IoCreateSymbolicLink failed\n"));	goto error;    }    resourceList = NULL;    status = HalAssignSlotResources(regPath, NULL, drvObj, devObj,				    PCIBus, busId, slotId,				    &resourceList);    if (!NT_SUCCESS(status)) {	KdPrint(("SKELETON.SYS: HalAssignSlotResources failed\n"));	goto error;    }    /*     * Now, we hopefully have an address for the card on the bus,     * but who knows for sure.  We need to translate the returned     * address and map the address space into kernel space.     */    skelDev = devObj->DeviceExtension;    skelDev->BusId = busId;    skelDev->SlotId = slotId;    found = 0;    for (i = 0; i < resourceList->Count; i++) {	interfaceType = resourceList->List[i].InterfaceType;	busNumber = resourceList->List[i].BusNumber;	partialResourceList = &resourceList->List[i].PartialResourceList;	for (j = 0; j < partialResourceList->Count; j++) {	    partialDescriptor = &partialResourceList->PartialDescriptors[j];	    if (partialDescriptor->Type == CmResourceTypeMemory) {		addressSpace = 0; /* Memory */		start = partialDescriptor->u.Memory.Start;		length = partialDescriptor->u.Memory.Length;		b = HalTranslateBusAddress(interfaceType, busNumber,					   start,					   &skelDev->FrameMemType,					   &xlatedAddr);		if (!b) {		    KdPrint(("SKELETON.SYS: HalTranslateBusAddress failed\n"));		    status = STATUS_UNSUCCESSFUL;		    goto error;		}		skelDev->MemStart = xlatedAddr;		skelDev->MemLength = length;		if (skelDev->FrameMemType == 0) {		    skelDev->FrameBase = MmMapIoSpace(xlatedAddr, length, FALSE);		} else {		    skelDev->FrameBase = (PUCHAR) xlatedAddr.LowPart;		}		found++;	    } else if (partialDescriptor->Type == CmResourceTypeInterrupt) {		/*		 * Get the system interrupt vector for IoConnectInterrupt		 */		ULONG level    = partialDescriptor->u.Interrupt.Level;		ULONG vector   = partialDescriptor->u.Interrupt.Vector;		ULONG affinity = partialDescriptor->u.Interrupt.Affinity;		skelDev->KIntrVector =		    HalGetInterruptVector(PCIBus, busId, level, vector,					  &skelDev->KIrql,					  &skelDev->KIntrAffinity);		devDesc.Version = DEVICE_DESCRIPTION_VERSION;		devDesc.Master = TRUE;		devDesc.ScatterGather = TRUE;		devDesc.DemandMode = FALSE;		devDesc.AutoInitialize = FALSE;		devDesc.Dma32BitAddresses = TRUE;		devDesc.IgnoreCount = FALSE;		devDesc.Reserved1 = FALSE;		devDesc.Reserved2 = FALSE;		devDesc.BusNumber = busId;		devDesc.DmaChannel = 0; /* ? */		devDesc.InterfaceType = PCIBus;		devDesc.DmaWidth = Width32Bits;		devDesc.DmaSpeed = Compatible;		devDesc.MaximumLength = 255 * 1024;		devDesc.DmaPort = 0;		skelDev->AdaptorObj = 		    HalGetAdapter(&devDesc, &skelDev->DmaMapRegisters);		found++;	    }	}    }    if (found != 2) {	KdPrint(("SKELETON.SYS: Failed to find frame buffer address or interrupt\n"));	status = STATUS_UNSUCCESSFUL;	goto error;    }    /*     * Enable Memory Space and Bus Master control bits     */    pciData->Command = 6;    HalSetBusDataByOffset(PCIConfiguration, busId, slotId,			  &pciData->Command,			  offsetof(PCI_COMMON_CONFIG, Command),			  sizeof(pciData->Command));    ResetBoard(skelDev);    /*     * 1. Initialize the device mutex     * 2. Initialize the device spin lock to protect the DPC routine     *    for callers to SynchronizeDPC.     * 3. Initialize the DPC data and register with Io system     * 4. Connect the interrupt     */    ExInitializeFastMutex(&skelDev->IrpMutex);    KeInitializeSpinLock(&skelDev->DeviceSpinLock);    KeInitializeTimer(&skelDev->DeviceCheckTimer);    KeInitializeTimer(&skelDev->StartIoTimer);    skelDev->TimerStarted = FALSE;    KeInitializeDpc(&skelDev->TimerDpc, TimeoutDPC, devObj);    skelDev->DpcRequested = FALSE;    IoInitializeDpcRequest(devObj, TransferDPC);    status = IoConnectInterrupt(&skelDev->KIntrObj, ServiceInterrupt,				devObj, NULL,				skelDev->KIntrVector,				skelDev->KIrql, skelDev->KIrql,				LevelSensitive,				TRUE, /* ShareVector */				skelDev->KIntrAffinity, FALSE);    if (!NT_SUCCESS(status)) {	KdPrint(("SKELETON.SYS: Unable to connect interrupt\n"));	status = STATUS_UNSUCCESSFUL;	goto error;    }    if (0) {  error:	IoDeleteDevice(devObj);    } else {	ExFreePool(resourceList);    }    return status;}/* *---------------------------------------------------------------------- * * ProbePCI * *	Attempt to find all Skeleton adapters in PCI address space * * Return Value: *	STATUS_SUCCESSFUL if everything went OK, STATUS_UNSUCCESSFUL *	if not. * *---------------------------------------------------------------------- */static NTSTATUSProbePCI(IN PDRIVER_OBJECT drvObj, IN PUNICODE_STRING regPath){    PCI_SLOT_NUMBER     slotNumber;    PPCI_COMMON_CONFIG  pciData;    UCHAR               buf[PCI_COMMON_HDR_LENGTH];    ULONG               i, f, j, bus;    BOOLEAN             flag;    UCHAR               vendorString[5] = {0};    UCHAR               deviceString[5] = {0};    NTSTATUS		status;    ULONG		total = 0;    pciData = (PPCI_COMMON_CONFIG) buf;    slotNumber.u.bits.Reserved = 0;    flag = TRUE;    for (bus = 0; flag; bus++) {        for (i = 0; i < PCI_MAX_DEVICES  &&  flag; i++) {            slotNumber.u.bits.DeviceNumber = i;            for (f = 0; f < PCI_MAX_FUNCTION; f++) {                slotNumber.u.bits.FunctionNumber = f;                j = HalGetBusData(PCIConfiguration, bus, slotNumber.u.AsULONG,                    pciData, PCI_COMMON_HDR_LENGTH);                if (j == 0) {                    /* out of buses */                    flag = FALSE;                    break;                }                if (pciData->VendorID == PCI_INVALID_VENDORID) {                    /* skip to next slot */                    break;                }#if 0                KdPrint(("PciData: ------------------------\n"			 "  Bus: %d\n"			 "  Device: %d\n"			 "  Function: %d\n"			 "  Vendor Id: %x\n"			 "  Device Id: %x\n"			 "  Command: %x\n"			 "  Status: %x\n"			 "  Rev Id: %x\n"			 "  Pro`gIf: %x\n"			 "  SubClass: %x\n"			 "  BaseClass: %x\n"			 "  CacheLine: %x\n"			 "  Latency: %x\n"			 "  Header Type: %x\n"			 "  BIST: %x\n"			 "  Base Reg[0]: %x\n"			 "  Base Reg[1]: %x\n"			 "  Base Reg[2]: %x\n"			 "  Base Reg[3]: %x\n"			 "  Base Reg[4]: %x\n"			 "  Base Reg[5]: %x\n"			 "  Rom Base: %x\n"			 "  Interrupt Line: %x\n"			 "  Interrupt Pin: %x\n"			 "  Min Grant: %x\n"			 "  Max Latency: %x\n",			 bus,			 i,			 f,			 pciData->VendorID,			 pciData->DeviceID,			 pciData->Command,			 pciData->Status,			 pciData->RevisionID,			 pciData->ProgIf,			 pciData->SubClass,			 pciData->BaseClass,			 pciData->CacheLineSize,			 pciData->LatencyTimer,			 pciData->HeaderType,			 pciData->BIST,			 pciData->u.type0.BaseAddresses[0],			 pciData->u.type0.BaseAddresses[1],			 pciData->u.type0.BaseAddresses[2],			 pciData->u.type0.BaseAddresses[3],			 pciData->u.type0.BaseAddresses[4],			 pciData->u.type0.BaseAddresses[5],			 pciData->u.type0.ROMBaseAddress,			 pciData->u.type0.InterruptLine,			 pciData->u.type0.MinimumGrant,			 pciData->u.type0.MaximumLatency));#endif		/*		 * If we find the Skeleton id, create a device		 */		if (pciData->VendorID == 0x115b && pciData->DeviceID == 0) {		    status = CreateDevice(drvObj, regPath, bus,					  slotNumber.u.AsULONG, pciData);		    if (NT_SUCCESS(status)) {			total++;		    }                }            }        }    }    if (total > 0) {	return STATUS_SUCCESS;    } else {	return STATUS_NO_SUCH_DEVICE;    }}/* *---------------------------------------------------------------------- * ServiceInterrupt -- * *	Service an interrupt from the Skeleton board * * Results: *	TRUE if the interrupt was handled, FALSE otherwise. *---------------------------------------------------------------------- */static BOOLEANServiceInterrupt(IN PKINTERRUPT Interrupt, IN PVOID ServiceContext){    PDEVICE_OBJECT devObj = (PDEVICE_OBJECT) ServiceContext;    PSKELETON_DEVICE skelDev;    skelDev = devObj->DeviceExtension;    /*     * XXX: Check if this interrupt was really intended for your board.     * If not, return FALSE;     */    if (skelDev->RequestDpc) {	if (!skelDev->DpcRequested) {	    skelDev->DpcRequested = TRUE;	    IoRequestDpc(devObj, NULL, devObj);	} else {	    KdPrint(("SKELETON.SYS: dpc overrun\n"));	}    }    /*     * Change this to TRUE when this routine does something     */    return TRUE;}/* * Overrides for Emacs to get consistency. * Emacs will notice this stuff at the end of the file and automatically * adjust the settings for this buffer only.  This must remain at the end * of the file. * --------------------------------------------------------------------------- * Local variables: * tab-width: 8 * c-brace-imaginary-offset: 0 * c-brace-offset: -4 * c-argdecl-indent: 4 * c-label-offset: -2 * c-continued-statement-offset: 4 * c-continued-brace-offset: 0 * c-indent-level: 4 * End: */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亚洲成人| 亚洲小说欧美激情另类| 国内不卡的二区三区中文字幕| 欧美一区二区黄色| 另类小说欧美激情| 国产亚洲1区2区3区| 国产91丝袜在线播放0| 成人欧美一区二区三区黑人麻豆 | 国产午夜精品久久| 成人国产精品免费观看| 亚洲激情图片一区| 日韩丝袜美女视频| 成人永久看片免费视频天堂| 亚洲欧美精品午睡沙发| 91精品国产综合久久久久久久 | 日韩欧美二区三区| 大尺度一区二区| 一区二区三区久久| 欧美xxxx老人做受| 91丨porny丨国产| 爽爽淫人综合网网站| 中文字幕欧美国产| 欧美图区在线视频| 国产一区二区三区综合| 亚洲精品国产成人久久av盗摄 | 色吊一区二区三区| 日韩不卡在线观看日韩不卡视频| 久久先锋影音av| 欧美午夜不卡视频| 国产一区二区中文字幕| 亚洲尤物视频在线| 久久久久九九视频| 欧美日韩激情一区二区三区| 国产成人精品一区二区三区四区 | a亚洲天堂av| 日韩国产高清在线| 日韩毛片高清在线播放| 欧美v日韩v国产v| 色综合久久九月婷婷色综合| 狠狠v欧美v日韩v亚洲ⅴ| 一区二区三区四区亚洲| 国产亚洲综合色| 69堂成人精品免费视频| 色综合色综合色综合色综合色综合| 秋霞影院一区二区| 亚洲夂夂婷婷色拍ww47| 国产午夜精品美女毛片视频| 日韩欧美久久久| 欧美日韩不卡视频| 91色乱码一区二区三区| 成人美女视频在线看| 久久精品国产一区二区三区免费看| 亚洲免费看黄网站| 国产精品美女久久久久高潮| 精品乱码亚洲一区二区不卡| 欧美夫妻性生活| 欧美专区在线观看一区| 99精品一区二区| 成人福利视频在线| 国产精品资源网| 精品一区二区综合| 人禽交欧美网站| 日韩国产一区二| 肉丝袜脚交视频一区二区| 亚洲一二三专区| 亚洲精品视频在线看| 中文字幕在线不卡| 国产精品国产三级国产三级人妇| 久久精品亚洲一区二区三区浴池| 日韩久久久精品| 日韩免费看的电影| 欧美一级片在线看| 日韩欧美在线影院| 精品伦理精品一区| 久久综合色播五月| 久久久久9999亚洲精品| 久久日韩粉嫩一区二区三区| 久久伊99综合婷婷久久伊| 久久久久国产一区二区三区四区 | 久久久久国产精品人| 精品欧美乱码久久久久久| 日韩精品一区二区三区四区| 欧美大片在线观看一区| 精品裸体舞一区二区三区| 国产亚洲欧美日韩日本| 国产精品美女久久久久久2018| 国产精品久久久久久妇女6080| 国产精品久久久久影院色老大| 国产精品久久综合| 亚洲欧美另类久久久精品 | 日本v片在线高清不卡在线观看| 秋霞午夜av一区二区三区| 久久成人精品无人区| 国产精品一区专区| av色综合久久天堂av综合| 99久久久精品| 欧美日韩成人综合在线一区二区| 欧美放荡的少妇| 久久无码av三级| 亚洲人成人一区二区在线观看| 亚洲动漫第一页| 久久精品国内一区二区三区| 国产91精品一区二区| 91国偷自产一区二区开放时间 | 日韩欧美一二三四区| 国产午夜精品在线观看| 亚洲人成影院在线观看| 日韩av中文在线观看| 国产乱码字幕精品高清av | 中文字幕中文字幕中文字幕亚洲无线 | 国产喷白浆一区二区三区| 亚洲激情图片小说视频| 久久精品国产在热久久| 99久久精品国产一区| 欧美精品乱人伦久久久久久| 久久久久国产精品麻豆ai换脸| 一区二区三区91| 国产精品1区2区| 欧美精品久久一区| 国产精品白丝在线| 精品在线亚洲视频| 欧美性色黄大片| 国产网站一区二区| 婷婷丁香激情综合| 国产91精品露脸国语对白| 91精品在线观看入口| 亚洲精品成人悠悠色影视| 寂寞少妇一区二区三区| 欧美日韩一区二区三区在线| 国产亚洲婷婷免费| 青青草91视频| 在线观看亚洲精品视频| 日本一区二区三区高清不卡| 日韩一区欧美二区| 色综合天天狠狠| 国产精品伦理在线| 久久国产麻豆精品| 欧美日韩成人在线| 亚洲男人天堂av网| 99亚偷拍自图区亚洲| 国产亚洲欧洲一区高清在线观看| 日韩国产欧美视频| 欧美色手机在线观看| 国产精品免费av| 国产一区二区视频在线播放| 日韩视频一区二区三区在线播放| 亚洲精品久久久蜜桃| eeuss影院一区二区三区 | aaa国产一区| 国产日韩欧美不卡在线| 韩国av一区二区三区| 91精品免费在线观看| 亚洲成精国产精品女| 在线精品亚洲一区二区不卡| 中文字幕中文字幕一区| 成人免费看黄yyy456| 国产日韩精品一区二区三区| 国产专区综合网| 国产亚洲精品精华液| 国产成人av一区二区三区在线观看| 久久综合给合久久狠狠狠97色69| 麻豆一区二区三区| 日韩一本二本av| 久久精品99国产精品| 日韩一区二区不卡| 久久国产乱子精品免费女| 精品久久人人做人人爰| 久久精品国产网站| 欧美xxxxxxxx| 国产成人啪免费观看软件| 久久九九久久九九| 成人av网站在线观看免费| 一区在线中文字幕| 一本色道综合亚洲| 一区二区欧美在线观看| 欧美色视频一区| 秋霞影院一区二区| 久久久亚洲精品石原莉奈 | 一区二区三区91| 欧美日本国产视频| 美女脱光内衣内裤视频久久影院| 欧美一级片在线看| 国产白丝精品91爽爽久久| 亚洲特黄一级片| 欧美视频在线播放| 紧缚捆绑精品一区二区| 国产精品毛片大码女人| 91久久一区二区| 午夜不卡在线视频| 欧美大白屁股肥臀xxxxxx| 国产老妇另类xxxxx| 最新日韩av在线| 欧美精品久久一区二区三区| 国产一区二区电影| 一区二区三区自拍| 日韩欧美你懂的| 色综合久久综合网| 青青草伊人久久| 亚洲图片激情小说| 日韩欧美在线综合网|