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

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

?? intrwr.c

?? 在PC上通過USB與C8051通信
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
    
    //
    // make sure that the selective suspend request has been completed.
    //

    if(deviceExtension->SSEnable) {

        KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, 
                              Executive, 
                              KernelMode, 
                              FALSE, 
                              NULL);
    }

    if(fileObject && fileObject->FsContext) {

        pipeInformation = fileObject->FsContext;

        if(UsbdPipeTypeInterrupt != pipeInformation->PipeType) {
            
            KdPrint( ("Usbd pipe type is not int\n"));

            ntStatus = STATUS_INVALID_HANDLE;
            goto IntUsb_DispatchReadWrite_Exit;
        }
    }
    else {

        KdPrint( ("Invalid handle\n"));

        ntStatus = STATUS_INVALID_HANDLE;
        goto IntUsb_DispatchReadWrite_Exit;
    }

    rwContext = (PINTUSB_RW_CONTEXT)
                ExAllocatePool(NonPagedPool,
                               sizeof(INTUSB_RW_CONTEXT));

    if(rwContext == NULL) {
        
        KdPrint( ("Failed to alloc mem for rwContext\n"));

        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
        goto IntUsb_DispatchReadWrite_Exit;
    }

	// Get the length from the current Write Request
    if(Irp->AssociatedIrp.SystemBuffer) {

        Length = IrpStack->Parameters.Write.Length;
    }

    if(Length != INTUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE) {

        KdPrint( ("Transfer length > buffer\n"));

        ntStatus = STATUS_INVALID_PARAMETER;

        ExFreePool(rwContext);

        goto IntUsb_DispatchReadWrite_Exit;
    }

    urbFlags |= USBD_TRANSFER_DIRECTION_OUT;
    KdPrint( ("Write operation\n"));
    

    
    
    urb = ExAllocatePool(NonPagedPool,
                         sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));

    if(urb == NULL) {

        KdPrint( ("Failed to alloc mem for urb\n"));

        ntStatus = STATUS_INSUFFICIENT_RESOURCES;

        ExFreePool(rwContext);
        
        goto IntUsb_DispatchReadWrite_Exit;
    }

    UsbBuildInterruptOrBulkTransferRequest(
                            urb,
                            sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
                            pipeInformation->PipeHandle,
                            Irp->AssociatedIrp.SystemBuffer,
                            NULL,
                            Length,
                            urbFlags,
                            NULL);

    //
    // set INTUSB_RW_CONTEXT parameters.
    //
    
    rwContext->Urb             = urb;
    rwContext->Length          = Length;
    rwContext->Numxfer         = 0;
    rwContext->DeviceExtension = deviceExtension;

    //
    // use the original read/write irp as an internal device control irp
    //

    nextStack = IoGetNextIrpStackLocation(Irp);
    nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    nextStack->Parameters.Others.Argument1 = (PVOID) urb;
    nextStack->Parameters.DeviceIoControl.IoControlCode = 
                                             IOCTL_INTERNAL_USB_SUBMIT_URB;

    IoSetCompletionRoutine(Irp, 
                           (PIO_COMPLETION_ROUTINE)IntUsb_WriteCompletion,
                           rwContext,
                           TRUE,
                           TRUE,
                           TRUE);

    //
    // since we return STATUS_PENDING call IoMarkIrpPending.
    //

    IoMarkIrpPending(Irp);

    KdPrint( ("IntUsb_DispatchReadWrite::"));
    IntUsb_IoIncrement(deviceExtension);

    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                            Irp);

    if(!NT_SUCCESS(ntStatus)) {

        KdPrint( ("IoCallDriver fails with status %X\n", ntStatus));

        //
        // if the device was removed, then the pipeInformation 
        // field is invalid.
        // similarly if the request was cancelled, then we need not
        // invoked reset pipe/device.
        //
        if((ntStatus != STATUS_CANCELLED) && 
           (ntStatus != STATUS_DEVICE_NOT_CONNECTED)) {
            
            ntStatus = IntUsb_ResetPipe(DeviceObject,
                                     pipeInformation);
    
            if(!NT_SUCCESS(ntStatus)) {

                KdPrint( ("IntUsb_ResetPipe failed\n"));

                ntStatus = IntUsb_ResetDevice(DeviceObject);
            }
        }
        else {

            KdPrint( ("ntStatus is STATUS_CANCELLED or "
                                 "STATUS_DEVICE_NOT_CONNECTED\n"));
        }
    }

    //
    // we return STATUS_PENDING and not the status returned by the lower layer.
    //
    return STATUS_PENDING;

IntUsb_DispatchReadWrite_Exit:

    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    KdPrint( ("IntUsb_DispatchReadWrite - ends\n"));

    return ntStatus;
}

NTSTATUS
IntUsb_WriteCompletion(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp,
    IN PVOID          Context
    )
/*++
 
Routine Description:

    This is the completion routine for writes
    
Arguments:

    DeviceObject - pointer to device object
    Irp - I/O request packet
    Context - context passed to the completion routine.

Return Value:

    NT status value

--*/
{
    ULONG               stageLength;
    NTSTATUS            ntStatus;
    PIO_STACK_LOCATION  nextStack;
    PINTUSB_RW_CONTEXT rwContext;

    //
    // initialize variables
    //
    rwContext = (PINTUSB_RW_CONTEXT) Context;
    ntStatus = Irp->IoStatus.Status;

    UNREFERENCED_PARAMETER(DeviceObject);
    KdPrint( ("IntUsb_ReadWriteCompletion - begins\n"));

	//
    // successfully performed a transfer.
    //
    if(NT_SUCCESS(ntStatus)) 
		Irp->IoStatus.Information = rwContext->Urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
	else
		KdPrint( ("ReadWriteCompletion - failed with status = %X\n", 
							ntStatus));
        
    if(rwContext) {

        //
        // dump rwContext
        //
        KdPrint( ("rwContext->Urb             = %X\n", 
                             rwContext->Urb));
        KdPrint( ("rwContext->Mdl             = %X\n", 
                             rwContext->Mdl));
        KdPrint( ("rwContext->Length          = %d\n", 
                             rwContext->Length));
        KdPrint( ("rwContext->Numxfer         = %d\n", 
                             rwContext->Numxfer));
        KdPrint( ("rwContext->DeviceExtension = %X\n", 
                             rwContext->DeviceExtension));

        KdPrint( ("IntUsb_ReadWriteCompletion::"));
        IntUsb_IoDecrement(rwContext->DeviceExtension);

        ExFreePool(rwContext->Urb);
        ExFreePool(rwContext);
    }

    KdPrint( ("IntUsb_WriteCompletion - ends\n"));

    return ntStatus;
}

NTSTATUS
IntUsb_DispatchRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++
 
Routine Description:

    Dispatch routine for read requests.
    The write is performed in a single 8 byte transfer.

Arguments:

    DeviceObject - pointer to device object
    Irp - I/O request packet

Return Value:

    NT status value

--*/
{
	NTSTATUS				ntStatus;
	PDEVICE_EXTENSION       deviceExtension;
	UCHAR					localBuffer[12];

	KdPrint( ("IntUsb_DispatchRead - begins\n"));

	deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

	IntUsb_IoIncrement(deviceExtension);


	// If an interrupt request is already outstanding, use that interrupt to service
	// this IRP instead of waiting for another interrupt.
	// The deviceExtension variable numintsIN tracks the number of interrupts 
	// which have occurred but not been serviced.

	if (InterlockedDecrement(&deviceExtension->numintsIN) >= 0)
	{					
		// Exchange data between the Polling URB and this Servicing Control IRP
		RtlCopyMemory(&(localBuffer[8]), &deviceExtension->numintsIN,4);
		RtlCopyMemory(&localBuffer, &deviceExtension->intdataIN,8);
		RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&localBuffer,12);
		Irp->IoStatus.Information  = 12;  // Length is always 12 bytes when successful
		       		
		ntStatus = STATUS_SUCCESS;
	}					
	else		// Pend this Read Request until an interrupt occurs
	{
		InterlockedIncrement(&deviceExtension->numintsIN); 
		ntStatus = CacheReadRequest(deviceExtension, Irp, &deviceExtension->InterruptIrp);
	}
	
	IoCompleteRequest(Irp, IO_NO_INCREMENT);

    KdPrint( ("IntUsb_DispatchRead - ends\n"));
    IntUsb_IoDecrement(deviceExtension);


    return ntStatus;
}


PIRP UncacheReadRequest(
	PDEVICE_EXTENSION DeviceExtension, 
	PIRP* pIrp
	)
/*++
 
Routine Description:

    This routine will return a pointer to a Cached Read Request
	if such a request has been cached.

Arguments:

    deviceExtension - Pointer to the device Extension
    pIrp - Where to save pointer to uncached IRP
Return Value:

    None

--*/
{
	KIRQL oldirql;
	PIRP Irp;
	KeAcquireSpinLock(&(DeviceExtension->Cachelock), &oldirql);
	Irp = (PIRP) InterlockedExchangePointer(pIrp, NULL);
	if(Irp)
	{
		// If an IRP has been cached then a Cancel routine
		// has already been set, and this call to IoSetCancelRoutine
		// will return that Cancel routine. 
		if(IoSetCancelRoutine(Irp, NULL))
		{
			// Since we now know we have a Cached IRP we can
			// now retrieve it.
			RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
		}
		else
			Irp = NULL;
	}
	KeReleaseSpinLock(&(DeviceExtension->Cachelock), oldirql);
	return Irp;
}


NTSTATUS CacheReadRequest(
	PDEVICE_EXTENSION DeviceExtension, 
	PIRP Irp, 
	PIRP* pIrp
	)
/*++
 
Routine Description:

    This routine will cache a Read Request until it can
	be serviced by an interrupt in the OnInterruptIN routine.

Arguments:

    deviceExtension - Pointer to the device Extension
	Irp - IRP to cache
    pIrp - Where to save pointer to cached IRP

Return Value:

    NTSTATUS value.

--*/
{						
	KIRQL oldirql;
	NTSTATUS status;
	PIO_STACK_LOCATION stack;
	PFILE_OBJECT fileObject;


	
	ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);

	// Make sure there's an extra stack location for us to use

	if (Irp->CurrentLocation <= 1)
		return STATUS_INVALID_PARAMETER;	// no stack for us

	// Acquire a lock on cache access.

	KeAcquireSpinLock(&(DeviceExtension->Cachelock), &oldirql);

	
	if (*pIrp)
		status = STATUS_UNSUCCESSFUL;	// something already cached here
	else
		{						// try to cache IRP

		// Install a cancel routine

		IoSetCancelRoutine(Irp, OnCancelReadRequest);
		
		// Check to see if this Irp has already been cancelled

		if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL))
			status = STATUS_CANCELLED;	// already cancelled

		// Cache this IRP in our list of Pending Read Requests. 

		else
			{					// cache it
			IoMarkIrpPending(Irp);
			status = STATUS_PENDING;

			stack = IoGetCurrentIrpStackLocation(Irp);
			stack->Parameters.Others.Argument1 = (PVOID) pIrp;
			
			//Install a completion routine to nullify the cache pointer.

			IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) OnCompleteReadRequest, (PVOID) DeviceExtension, TRUE, TRUE, TRUE);
			IoSetNextIrpStackLocation(Irp);	// so our completion routine will get called
			fileObject = stack->FileObject;
			stack = IoGetCurrentIrpStackLocation(Irp);
			stack->DeviceObject = DeviceExtension->FunctionalDeviceObject;	// so CancelIrp can give us right ptr
			stack->FileObject = fileObject;	// for cleanup
			*pIrp = Irp;

			// Add this request to our list of Read Requests
			InsertTailList(&DeviceExtension->Pending_IOCTL_READINT_List, &Irp->Tail.Overlay.ListEntry);
			}					// cache it
		}						// try to cache IRP
	
	KeReleaseSpinLock(&(DeviceExtension->Cachelock), oldirql);

	return status;
}							


//////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

NTSTATUS OnCompleteReadRequest(
	PDEVICE_OBJECT DeviceObject, 
	PIRP Irp, 
	PDEVICE_EXTENSION DeviceExtension
	)
/*++
 
Routine Description:

	This routine is called upon completion of an IRP associated
	with a Read Request.

Arguments:

    DeviceObject - pointer to device object
    Irp - IRP which has finished
    deviceExtension - Pointer to the device Extension
	
Return Value:

    NTSTATUS value.

--*/
{							
	KIRQL oldirql;
	PIRP* pIrp;

	KeAcquireSpinLock(&DeviceExtension->Cachelock, &oldirql);
	pIrp = (PIRP*) IoGetCurrentIrpStackLocation(Irp)->Parameters.Others.Argument1;
	if (*pIrp == Irp)
		*pIrp = NULL;
	KeReleaseSpinLock(&DeviceExtension->Cachelock, oldirql);
	return STATUS_SUCCESS;
}							



///////////////////////////////////////////////////////////////////////////////

#pragma LOCKEDCODE

VOID OnCancelReadRequest(
	PDEVICE_OBJECT DeviceObject, 
	PIRP Irp
	)
/*++
 
Routine Description:

	This routine is called upon cancellation of an IRP associated
	with a Read Request.

Arguments:

    DeviceObject - pointer to device object
    Irp - IRP which has been cancelled
    	
Return Value:

    NTSTATUS value.

--*/
{							
	PDEVICE_EXTENSION deviceExtension;
	KIRQL oldirql;
	
	oldirql= Irp->CancelIrql;
	IoReleaseCancelSpinLock(DISPATCH_LEVEL);

	deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

	// Remove this request to our list of Read Requests

	KeAcquireSpinLockAtDpcLevel(&deviceExtension->Cachelock);
	RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
	KeReleaseSpinLock(&deviceExtension->Cachelock, oldirql);

	// Complete the IRP

	Irp->IoStatus.Status = STATUS_CANCELLED;
	IoCompleteRequest(Irp, IO_NO_INCREMENT);
}				

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成a人亚洲精| 欧美xfplay| 日本韩国欧美在线| 91一区一区三区| jvid福利写真一区二区三区| 国产盗摄一区二区三区| 韩国三级在线一区| 狠狠色狠狠色综合系列| 日本亚洲免费观看| 久久99国产精品久久99| 日韩高清在线观看| 久久精品99国产精品日本| 美女网站一区二区| 国产伦精品一区二区三区免费| 国产乱子轮精品视频| 风间由美一区二区av101| 波波电影院一区二区三区| 风间由美性色一区二区三区| 国产精品一线二线三线精华| 国产a久久麻豆| 国产传媒欧美日韩成人| 成人黄色一级视频| 在线视频一区二区三| 欧美日韩中文另类| 91精品国产麻豆国产自产在线| 欧美日韩免费电影| 欧美电影免费观看高清完整版在线观看 | 午夜电影一区二区| 蜜桃视频免费观看一区| 韩国女主播一区| 成人综合在线视频| 欧美日韩久久久一区| 精品国产乱码久久久久久免费| 国产成人免费网站| 91视频91自| 欧美日韩国产精品自在自线| 欧美大度的电影原声| 日本一区二区三区视频视频| 亚洲精品第1页| 男女性色大片免费观看一区二区| 国产精品1区2区3区| 99精品视频在线观看| 欧美日韩国产一级| 久久久亚洲国产美女国产盗摄| 18成人在线观看| 午夜电影网一区| 成人影视亚洲图片在线| 91在线视频观看| 日韩精品中文字幕在线不卡尤物| 亚洲精品在线电影| 日韩欧美国产wwwww| 欧美肥大bbwbbw高潮| 欧美日韩一区二区欧美激情| 欧美亚洲免费在线一区| 777xxx欧美| 国产精品污网站| 亚洲第一精品在线| 国产一区二区三区高清播放| 91国偷自产一区二区开放时间 | 国内精品伊人久久久久av一坑| 国产精品18久久久久久久网站| 99国产精品久| 7777女厕盗摄久久久| 国产精品久久久99| 蜜桃视频在线观看一区| 成人av在线影院| 欧美一区二区三区四区在线观看| 久久久久久久免费视频了| 亚洲一区二区三区自拍| 狠狠色丁香久久婷婷综| 91麻豆蜜桃一区二区三区| 精品日韩欧美一区二区| 国产精品色哟哟网站| 亚洲国产成人av好男人在线观看| 国产麻豆视频精品| 欧美自拍偷拍一区| 亚洲精品一区二区三区在线观看 | 国产精品丝袜在线| 亚洲影院久久精品| 国产精品一区二区在线观看网站| 欧美性xxxxx极品少妇| 国产午夜亚洲精品理论片色戒| 亚洲视频一区二区在线观看| 九色综合国产一区二区三区| 欧美体内she精高潮| 国产清纯白嫩初高生在线观看91 | 亚洲尤物视频在线| 国产一区二区三区久久悠悠色av| 99国产一区二区三精品乱码| 久久人人爽爽爽人久久久| 一区二区三区四区蜜桃| 成人成人成人在线视频| 日韩欧美一级特黄在线播放| 国产v综合v亚洲欧| 久久综合国产精品| 精品一区二区三区香蕉蜜桃| 日韩欧美国产综合在线一区二区三区| 亚洲综合在线视频| 91久久精品一区二区三区| 国产精品成人一区二区艾草 | 欧美影院一区二区三区| 亚洲人成伊人成综合网小说| 国产激情视频一区二区三区欧美 | 国产色综合一区| 久久99久久99精品免视看婷婷| 日韩精品影音先锋| 精品一区二区三区免费| 日韩一级视频免费观看在线| 免费在线观看日韩欧美| 日韩一区二区免费在线电影| 日本欧美肥老太交大片| 日韩欧美国产三级电影视频| 日韩黄色一级片| 欧美mv日韩mv亚洲| 国产福利一区在线观看| 国产精品久久久久9999吃药| 91一区一区三区| 午夜影院久久久| 欧美日韩国产影片| 久久99久久精品欧美| 久久婷婷一区二区三区| 成人高清视频在线观看| 亚洲欧美一区二区三区孕妇| 欧洲精品一区二区三区在线观看| 午夜精品在线看| 精品不卡在线视频| a美女胸又www黄视频久久| 亚洲午夜精品17c| 欧美tk—视频vk| 不卡影院免费观看| 亚洲h在线观看| 精品99一区二区三区| www.亚洲激情.com| 婷婷亚洲久悠悠色悠在线播放| 欧美哺乳videos| www.在线成人| 日韩av网站免费在线| 久久精品人人做人人爽97 | 中文字幕日韩一区二区| 欧美午夜视频网站| 美腿丝袜亚洲色图| 1000部国产精品成人观看| 欧美私人免费视频| 国产在线不卡视频| 一区二区高清免费观看影视大全| 精品国产青草久久久久福利| 99久久精品99国产精品| 午夜电影久久久| 日本一区二区高清| 欧美精品一二三| 不卡一二三区首页| 秋霞影院一区二区| 亚洲免费观看高清完整| 欧美va亚洲va在线观看蝴蝶网| av高清不卡在线| 日本欧洲一区二区| 成人免费视频在线观看| 日韩精品一区二区三区在线播放| 99免费精品在线观看| 日韩av一级片| 亚洲精品久久久蜜桃| 青青草国产成人av片免费| 日本一区二区不卡视频| 欧美一区二区三区性视频| 972aa.com艺术欧美| 狠狠色丁香久久婷婷综合丁香| 一区二区三区日本| 国产欧美一区二区精品婷婷 | 精品久久久久久久人人人人传媒| 97精品超碰一区二区三区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲电影中文字幕在线观看| 国产亚洲一区二区在线观看| 4438x成人网最大色成网站| 色婷婷亚洲综合| 国产一区二区久久| 视频一区二区不卡| 精品国产乱码91久久久久久网站| 91香蕉视频在线| 成人美女视频在线观看| 精品一区二区三区欧美| 亚洲一区二区视频在线观看| 亚洲国产精品ⅴa在线观看| 欧美大黄免费观看| 欧美一级久久久久久久大片| 91久久精品一区二区三区| av不卡在线播放| 成人av网站免费| 国产高清精品网站| 美女视频网站久久| 日韩高清电影一区| 亚洲高清免费一级二级三级| 欧美激情中文字幕| xnxx国产精品| 精品人在线二区三区| 日韩欧美国产系列| 日韩欧美亚洲另类制服综合在线| 制服丝袜av成人在线看| 在线观看日韩毛片| 在线亚洲人成电影网站色www|