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

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

?? skeleton.c

?? PCI驅動開發框架
?? C
?? 第 1 頁 / 共 3 頁
字號:
	ioBuf     = irp->AssociatedIrp.SystemBuffer;	inBufLen  = irpStack->Parameters.DeviceIoControl.InputBufferLength;	outBufLen = irpStack->Parameters.DeviceIoControl.OutputBufferLength;	ioctlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;        switch (ioctlCode) {	  default:            KdPrint(("SKELETON.SYS(StartIo): unexpected IRP_MJ_DEVICE_CONTROL\n"));            status = STATUS_INVALID_PARAMETER;            break;        }	if (status != STATUS_PENDING) {	    irp->IoStatus.Status = status;	    IoCompleteRequest(irp, IO_VIDEO_INCREMENT);	    IoStartNextPacket(devObj, TRUE);	}	return;      default:	KdPrint(("SKELETON.SYS(StartIo): unexpected major function\n"));	irp->IoStatus.Status = STATUS_INVALID_PARAMETER;	IoCompleteRequest(irp, IO_NO_INCREMENT);	IoStartNextPacket(devObj, TRUE);	return;    }    skelDev->OperationType = irpStack->MajorFunction;    skelDev->IrpSystemBuffer = irp->AssociatedIrp.SystemBuffer;    if (skelDev->OperationType == IRP_MJ_READ) {	skelDev->IrpBufLen = irpStack->Parameters.Read.Length;    } else {	skelDev->IrpBufLen  = irpStack->Parameters.Write.Length;    }    if (skelDev->IrpBufLen == 0 || irp->MdlAddress == NULL) {	irp->IoStatus.Status = STATUS_INVALID_PARAMETER;	IoCompleteRequest(irp, IO_NO_INCREMENT);	IoStartNextPacket(devObj, TRUE);    }	    skelDev->VirtualAddress = MmGetMdlVirtualAddress(irp->MdlAddress);    if (skelDev->TimerStarted) {	KeCancelTimer(&skelDev->DeviceCheckTimer);	skelDev->TimerStarted = FALSE;    }    writeOp = (skelDev->OperationType == IRP_MJ_READ) ? FALSE : TRUE;    KeFlushIoBuffers(irp->mdlAddress, !writeOp, TRUE);    status = IoAllocateAdapterChannel(skelDev->AdaptorObj, devObj,				      skelDev->DmaMapRegisters, ProgramDMA, devObj);    KdPrint(("SKELETON.SYS(StartIo): Exiting irp %p\n", irp));    if (!NT_SUCCESS(status)) {	KdPrint(("SKELETON.SYS: Unable to allocate adaptor channel for DMA\n"));	irp->IoStatus.Status = status;	IoCompleteRequest(irp, IO_NO_INCREMENT);	return;    }}/* *---------------------------------------------------------------------- * TransferDPC -- * *	This routine is called at DISPATCH_LEVEL by the system at the *	ServiceInterrupt(). * *	This routine is protected against interrupts since it was queued *	by an interrupt, and the next DMA related interrupt won't occur *	until something else happens. * *	This routine is called when a DMA transfer has not been completed. *	It sets everything up to continue the tranfer. *---------------------------------------------------------------------- */static VOIDTransferDPC(IN PKDPC Dpc, IN PVOID Context, IN PVOID Arg1, IN PVOID Arg2){    PDEVICE_OBJECT devObj = Context;    PSKELETON_DEVICE skelDev = devObj->DeviceExtension;    PIRP irp;    BOOLEAN writeOp;    KdPrint(("SKELETON.SYS(TransferDPC): Finished irp %p\n",	     devObj->CurrentIrp));    CancelTransferTimeout(devObj);    irp = devObj->CurrentIrp;    writeOp = (skelDev->OperationType == IRP_MJ_WRITE) ? TRUE : FALSE;    IoFlushAdapterBuffers(NULL, irp->MdlAddress,			  skelDev->MapRegisterBase,			  skelDev->VirtualAddress, skelDev->IrpBufLen, writeOp);    IoFreeMapRegisters(skelDev->AdaptorObj, skelDev->MapRegisterBase, 		       skelDev->DmaMapRegisters);    if (skelDev->OperationType == IRP_MJ_READ) {	KeFlushIoBuffers(irp->MdlAddress, TRUE, TRUE);    }    irp->IoStatus.Status = skelDev->IrpStatus;    if (skelDev->IrpStatus == STATUS_SUCCESS) {	irp->IoStatus.Information = skelDev->IrpBytesTransferred;    }    IoCompleteRequest(irp, IO_VIDEO_INCREMENT);    IoStartNextPacket(devObj, TRUE);    skelDev->DpcRequested = FALSE;    return;}/* *---------------------------------------------------------------------- * ServiceTimeoutUtil -- * *	Utility routine for ServiceTimeout.  Runs code that is  *	sensitive to interrupts. *---------------------------------------------------------------------- */static BOOLEANServiceTimeoutUtil(IN PCONTEXT Context){    PSKELETON_DEVICE skelDev = (PSKELETON_DEVICE) Context;    return TRUE;}/* *---------------------------------------------------------------------- * ServiceTimeout -- * *	Service a timeout.  Is this a routine to check on the board *	if nothing happens after a little while?  If so, *	ddk/src/multimedia/soundlib/wave.c does something similar. * * Results: *	None *---------------------------------------------------------------------- */voidServiceTimeout(PDEVICE_OBJECT devObj){    PSKELETON_DEVICE skelDev = devObj->DeviceExtension;    KeSynchronizeExecution(skelDev->KIntrObj, ServiceTimeoutUtil, skelDev);    skelDev->IrpStatus = STATUS_UNSUCCESSFUL;    skelDev->IrpBytesTransferred = 0L;    skelDev->RequestDpc = TRUE;    KdPrint(("SKELETON.SYS: ServiceTimeout calling TransferDPC\n"));    TransferDPC(NULL, devObj, NULL, NULL);}/* *---------------------------------------------------------------------- * TimeoutDPC -- * *	This routine gets called when a timeout occurs.  We then *	need to check plxDev->TransferDone to see if the transfer *	finished before this timer went off.  If is did, then we *	can just ignore this DPC call.  If not, we need to clear *	everything up, fail the request, and move on. * * Results: *	None *---------------------------------------------------------------------- */static VOIDTimeoutDPC(IN PKDPC Dpc, IN PVOID Context, IN PVOID Param1, IN PVOID Param2){    PDEVICE_OBJECT devObj = Context;    PSKELETON_DEVICE skelDev = devObj->DeviceExtension;    skelDev->TimerStarted = FALSE;    if (! skelDev->TransferDone) {	/*	 * XXX: Clean up the hardware here if necessary.	 */	ServiceTimeout(devObj);    }}/* *---------------------------------------------------------------------- * OpenDevice -- * *	Open the device.  We will allow multiple opens to the device. * * Results: *	A standard NT result *---------------------------------------------------------------------- */static NTSTATUSOpenDevice(IN PDEVICE_OBJECT devObj, IN PFILE_OBJECT fileObj){    PSKELETON_DEVICE skelDev;    KdPrint(("SKELETON.SYS: OpenDevice called\n"));    skelDev = devObj->DeviceExtension;    ++nopens;			/* inc global open */    return STATUS_SUCCESS;}/* *---------------------------------------------------------------------- * CloseDevice -- * *	Close up device and free resources allocated by OpenDevice * * Results: *	A standard NT result *---------------------------------------------------------------------- */static NTSTATUSCloseDevice(IN PDEVICE_OBJECT devObj, IN PFILE_OBJECT fileObj){    PSKELETON_DEVICE skelDev;    skelDev = devObj->DeviceExtension;    nopens--;			/* decrement global open */    return STATUS_SUCCESS;}/* *---------------------------------------------------------------------- * MapMemory -- * *	Given a physical address, maps this address into a user mode *	process's address space * * Arguments: *	devObj		pointer to a device object *	ioBuf		pointer to the I/O buffer *	inBufLen	input buffer length *	outBufLen	output buffer length * * Results: *	STATUS_SUCCESS *	STATUS_UNSUCCESSFUL *	STATUS_BUFFER_TOO_SMALL, *	(other STATUS_* as returned by kernel APIs) *---------------------------------------------------------------------- */static NTSTATUSMapMemory(IN PDEVICE_OBJECT devObj, IN OUT PVOID ioBuf,	  IN ULONG inBufLen, IN ULONG outBufLen){    INTERFACE_TYPE     interfaceType;    ULONG              busNumber;    PHYSICAL_ADDRESS   physicalAddr;    ULONG              len;    UNICODE_STRING     physicalMemUniStr;    OBJECT_ATTRIBUTES  objAttrs;    HANDLE             physicalMemHandle  = NULL;    PVOID              physicalMemSection = NULL;    ULONG              inIoSpace, inIoSpace2;    NTSTATUS           status;    PHYSICAL_ADDRESS   physicalAddrBase;    PHYSICAL_ADDRESS   physicalAddrEnd;    PHYSICAL_ADDRESS   viewBase;    PHYSICAL_ADDRESS   mappedLen;    BOOLEAN            xlateBaseAddr;    BOOLEAN            xlateEndAddr;    PVOID              virtualAddr;    PSKELETON_DEVICE   skelDev;    skelDev = devObj->DeviceExtension;    if (outBufLen < sizeof(PVOID)) {	KdPrint(("SKELETON.SYS(MapMemory): Insufficient output buffer\n"));	status = STATUS_BUFFER_TOO_SMALL;	goto done;    }    /*     * Get a pointer to physical memory...     *     * - Create the name     * - Initialize the data to find the object     * - Open a handle to the oject and check the status     * - Get a pointer to the object     * - Free the handle     */    RtlInitUnicodeString(&physicalMemUniStr, L"\\Device\\PhysicalMemory");    InitializeObjectAttributes(&objAttrs, &physicalMemUniStr,			       OBJ_CASE_INSENSITIVE, (HANDLE) NULL,			       (PSECURITY_DESCRIPTOR) NULL);    status = ZwOpenSection(&physicalMemHandle, SECTION_ALL_ACCESS, &objAttrs);    if (!NT_SUCCESS(status)) {        KdPrint(("SKELETON.SYS: ZwOpenSection failed\n"));        goto done;    }    status =	ObReferenceObjectByHandle(physicalMemHandle, SECTION_ALL_ACCESS,				       (POBJECT_TYPE) NULL, KernelMode,				       &physicalMemSection,				       (POBJECT_HANDLE_INFORMATION) NULL);    if (!NT_SUCCESS(status)) {        KdPrint(("SKELETON.SYS: ObReferenceObjectByHandle failed\n"));        goto close_handle;    }    interfaceType = PCIBus;    busNumber     = skelDev->BusId;    physicalAddr  = skelDev->MemStart;    len           = skelDev->MemLength;    inIoSpace     = skelDev->FrameMemType;    inIoSpace2    = skelDev->FrameMemType;    /*     * Initialize the physical addresses that will be translated     */    physicalAddrEnd = RtlLargeIntegerAdd(physicalAddr,					 RtlConvertUlongToLargeInteger(len));    /*     * Translate the physical addresses.     */    xlateBaseAddr = HalTranslateBusAddress(interfaceType, busNumber,					   physicalAddr, &inIoSpace,					   &physicalAddrBase);    xlateEndAddr = HalTranslateBusAddress(interfaceType, busNumber,					  physicalAddrEnd, &inIoSpace2,    					  &physicalAddrEnd);    if (!(xlateBaseAddr && xlateEndAddr)) {        KdPrint(("SKELETON.SYS: HalTranslatephysicalAddress failed\n"));        status = STATUS_UNSUCCESSFUL;        goto close_handle;    }    /*     * Calculate the length of the memory to be mapped     */    mappedLen = RtlLargeIntegerSubtract(physicalAddrEnd, physicalAddrBase);    /*     * If the mappedlen is zero, somthing very weird happened in the HAL     * since the Length was checked against zero.     */    if (mappedLen.LowPart == 0) {        KdPrint(("SKELETON.SYS: mappedLen.LowPart == 0\n"));        status = STATUS_UNSUCCESSFUL;        goto close_handle;    }    len = mappedLen.LowPart;    /*     * If the address is in io space, just return the address, otherwise     * go through the mapping mechanism     */    if (inIoSpace) {        *((PVOID *) ioBuf) = (PVOID) physicalAddrBase.LowPart;    } else {        /*         * initialize view base that will receive the physical mapped         * address after the MapViewOfSection call.         */        viewBase = physicalAddrBase;        /*         * Let ZwMapViewOfSection pick an address         */        virtualAddr = NULL;        /*         * Map the section         */        status =	    ZwMapViewOfSection(physicalMemHandle, (HANDLE) -1, &virtualAddr,			       0L, len, &viewBase, &len, ViewShare, 0,			       PAGE_READWRITE | PAGE_NOCACHE);        if (!NT_SUCCESS(status)) {            KdPrint(("SKELETON.SYS: ZwMapViewOfSection failed\n"));            goto close_handle;        }        /*         * Mapping the section above rounded the physical address down to the         * nearest 64 K boundary. Now return a virtual address that sits where         * we want by adding in the offset from the beginning of the section.         */        (ULONG) virtualAddr += (ULONG)physicalAddrBase.LowPart -                                  (ULONG)viewBase.LowPart;        *((PVOID *) ioBuf) = virtualAddr;    }    status = STATUS_SUCCESS;close_handle:    ZwClose(physicalMemHandle);done:    return status;}/* *---------------------------------------------------------------------- * UnmapMemory -- * *	Unmaps board's memory from the process's address space. * * Results: *	STATUS_SUCCESS *	STATUS_BUFFER_TOO_SMALL, *---------------------------------------------------------------------- */static NTSTATUS

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷精品大在线视频 | 自拍偷在线精品自拍偷无码专区 | 国产成人综合在线观看| 久久综合色婷婷| 韩国女主播成人在线| 久久久久久久久久久99999| 国产精品亚洲一区二区三区妖精| 久久精品亚洲国产奇米99| 成人黄色国产精品网站大全在线免费观看 | 国产精品国模大尺度视频| 99在线精品视频| 亚洲午夜久久久久久久久电影院| 在线电影国产精品| 韩国理伦片一区二区三区在线播放| 久久久久久久电影| 91日韩在线专区| 日韩av电影天堂| 久久蜜臀精品av| 色欧美片视频在线观看| 日本麻豆一区二区三区视频| 26uuu国产一区二区三区| 99久久婷婷国产综合精品电影| 一区二区三区精品在线| 精品粉嫩超白一线天av| 色综合中文综合网| 成人精品在线视频观看| 国产精品久久久久一区| 成人的网站免费观看| 日韩一区二区在线观看| 韩国一区二区在线观看| 在线电影院国产精品| 亚洲午夜久久久久中文字幕久| 老司机精品视频在线| 欧美日本一区二区| 亚洲精品日日夜夜| 成人97人人超碰人人99| 久久影院视频免费| 日韩欧美在线观看一区二区三区| 色哟哟欧美精品| 日本美女一区二区三区视频| 综合色天天鬼久久鬼色| 日韩欧美不卡在线观看视频| 色综合色综合色综合色综合色综合| 免费欧美在线视频| 一区二区三区自拍| 欧美国产一区二区在线观看| 欧美丰满嫩嫩电影| 色天使色偷偷av一区二区| 国产高清不卡二三区| 日韩avvvv在线播放| 亚洲视频在线一区| 久久色在线观看| 91超碰这里只有精品国产| 91香蕉视频黄| 成人涩涩免费视频| 国产一区二区看久久| 天使萌一区二区三区免费观看| 中文字幕亚洲电影| 国产嫩草影院久久久久| 欧美zozozo| 日韩一区二区免费高清| 欧美私人免费视频| 色菇凉天天综合网| 色综合久久久久综合体| 成人av影院在线| 成人国产精品视频| 成人性视频免费网站| 国内精品免费在线观看| 亚洲一二三区在线观看| 久久精品国产秦先生| 国产日韩欧美激情| 欧美午夜精品免费| 麻豆91在线观看| 国产精品久久99| 5858s免费视频成人| 欧洲生活片亚洲生活在线观看| 亚洲特黄一级片| 欧美日本一区二区三区四区| 91久久精品国产91性色tv| 精品一区二区三区香蕉蜜桃| 国产精品激情偷乱一区二区∴| 国产精品青草久久| 中文字幕永久在线不卡| 国产精品网站导航| 亚洲欧洲无码一区二区三区| 亚洲欧美日韩综合aⅴ视频| 一区二区免费在线| 亚洲成人一区在线| 日本欧美在线看| 美女尤物国产一区| 国产一区二区三区日韩| 国产经典欧美精品| 91视频精品在这里| 欧美老肥妇做.爰bbww| 日韩精品一区二区三区视频| 久久久五月婷婷| 一区二区中文视频| 亚洲午夜免费视频| 久久精品国产99国产精品| 日韩欧美国产1| 久久婷婷成人综合色| 国产精品九色蝌蚪自拍| 亚洲成人av资源| 久久精品国产亚洲5555| 不卡视频一二三| 欧美性生活久久| 久久夜色精品国产噜噜av| 国产精品二三区| 无吗不卡中文字幕| 国产精品一区二区在线观看不卡| 91色乱码一区二区三区| 91麻豆精品国产91久久久使用方法 | 99久久国产综合精品色伊| 欧美色图12p| 国产偷国产偷精品高清尤物| 亚洲午夜免费福利视频| 国产毛片精品国产一区二区三区| 91视频你懂的| 久久综合九色欧美综合狠狠 | 色欧美乱欧美15图片| 日韩精品一区二区三区三区免费| 国产欧美1区2区3区| 亚洲成av人片一区二区| 国产精品一区二区在线播放| 欧美日韩精品一区二区三区四区 | 亚洲精品中文在线影院| 老司机免费视频一区二区 | 亚洲国产日韩综合久久精品| 韩国女主播成人在线观看| 欧美性视频一区二区三区| 中文字幕免费不卡在线| 日韩二区三区在线观看| 99久久精品国产观看| 久久综合色婷婷| 婷婷成人综合网| 日本乱人伦一区| 国产日韩欧美一区二区三区乱码| 日韩av高清在线观看| 91久久国产综合久久| 欧美精彩视频一区二区三区| 日本aⅴ精品一区二区三区| 91亚洲男人天堂| 久久草av在线| 欧美日韩一区二区三区四区五区 | 精品福利一二区| 日韩在线一二三区| 色妹子一区二区| 日本一区二区成人| 精品一二三四区| 日韩欧美久久久| 免费黄网站欧美| 欧美日韩国产电影| 亚洲国产日韩一级| 色网站国产精品| 亚洲色图在线视频| 成人午夜电影网站| 国产喷白浆一区二区三区| 久久国产尿小便嘘嘘| 欧美一区二区三区男人的天堂| 成人av先锋影音| 亚洲男人的天堂网| 91九色最新地址| 日韩激情在线观看| 精品国产一区二区三区久久久蜜月| 日韩国产高清影视| 久久久久亚洲蜜桃| 成人h精品动漫一区二区三区| 国产精品入口麻豆原神| 色香蕉久久蜜桃| 紧缚奴在线一区二区三区| 久久久久久久精| 在线视频观看一区| 麻豆国产一区二区| 一区二区三区91| www国产成人免费观看视频 深夜成人网| 精品一区二区三区av| 亚洲天堂2014| 欧美国产日韩一二三区| 7777精品久久久大香线蕉| 国产综合久久久久久久久久久久| 国产乱子轮精品视频| 一区二区三区丝袜| 日韩欧美国产综合| 欧美一区二区观看视频| 91污片在线观看| 国产精品美女久久久久久2018| 精品一区二区av| 蜜臀av亚洲一区中文字幕| 秋霞电影网一区二区| 国产精品中文字幕日韩精品 | 91精品国产一区二区三区| 日韩黄色免费电影| 欧美mv日韩mv| 成人国产精品免费| 一区二区不卡在线播放| 欧美日本一区二区在线观看| 国产曰批免费观看久久久| 中文字幕欧美日本乱码一线二线 | 99精品视频一区二区三区| 日韩精品五月天|