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

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

?? isostrm.c

?? 用avr 單片機 用io模擬usb 通信協議的例子
?? C
?? 第 1 頁 / 共 2 頁
字號:
 	}

	IsoUsb_DecrementIoCount(deviceObject); // also deccrement global pending IRP count

    ISOUSB_KdPrint (DBGLVL_MAXIMUM,(" ENTER IsoUsb_IsoIrp_Complete(), streamObject->PendingIrps = dec %d\n", streamObject->PendingIrps));

	// Check the IRP and URB status in the transferObject
    // Here is where a driver for a real device would collect and/or process data in the buffers
    status = IsoUsb_ProcessTransfer(transferObject);

	ISOUSB_KdPrintCond( DBGLVL_MEDIUM,(!NT_SUCCESS(status)), ("IsoUsb_IsoIrp_Complete() BAD transfer status 0x%x\n", status));

	if( !NT_SUCCESS(status) ) {
	    IsoUsb_ResetParentPort( DeviceObject );
    }

	// See if a stop stream has been requested..
	if( streamObject->IsoStreamStarted ) {// this is set FALSE when we get a stop stream ioctl request

		// Last xfer was OK and no stop has been requested;
		// Resubmit the whole thing again and recycle it..
		ISOUSB_KdPrint (DBGLVL_MAXIMUM,("IsoUsb_IsoIrp_Complete() ABOUT TO RECYCLE IRP AND URB!\n"));
		IsoUsb_InitializeStreamUrb(DeviceObject, transferObject);

		nextStack = IoGetNextIrpStackLocation(Irp);
		ASSERT(nextStack != NULL);

		nextStack->Parameters.Others.Argument1 = transferObject->Urb;
		nextStack->Parameters.DeviceIoControl.IoControlCode =
			IOCTL_INTERNAL_USB_SUBMIT_URB;
		nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;


        IoSetCompletionRoutine(Irp,
                IsoUsb_IsoIrp_Complete,
                transferObject, //pass transfer object as Context
                TRUE,  // Invoke on Success
                TRUE,  // Invoke on Error
                TRUE); // Invoke on Cancel


		// increment this stream object's pending irp count
		streamObject->PendingIrps++;
		// increment this stream object's total times recycled count
		streamObject->TimesRecycled++;
		// also increment global pending IRP count
		IsoUsb_IncrementIoCount(deviceObject);

		//
		// Resubmit the request...
        // Note that if the driver has actually done a  fair amount of data processing
        // or copying from packet buffers, you may want to schedule a dpc
        // to resubmit instead of doing it here
		//
		status = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
							  Irp);
	}
	

    ISOUSB_KdPrint (DBGLVL_MAXIMUM,(" EXIT IsoUsb_IsoIrp_Complete(), streamObject->PendingIrps = dec %d\n", streamObject->PendingIrps));

    return STATUS_MORE_PROCESSING_REQUIRED;
}


VOID
IsoUsb_StreamTimeoutDPC(
    IN PKDPC Dpc,
    IN PVOID DeferredContext,
    IN PVOID SystemArgument1,
    IN PVOID SystemArgument2
    )
/*++

Routine Description:

  Check for data capture problems
  Stop stream if problems found

Arguments:

Return Value:

    The function value is the final status from the operation.

--*/
{
    PDEVICE_EXTENSION deviceExtension;
    PDEVICE_OBJECT deviceObject;
    PISOUSB_STREAM_OBJECT streamObject;
    BOOLEAN inQueue;
    LARGE_INTEGER dueTime;

    streamObject = DeferredContext;
    deviceObject = streamObject->DeviceObject;
    deviceExtension = deviceObject->DeviceExtension;

    //



    //
    // schedule next one
    //

    if (streamObject->IsoStreamStarted) {

        KeInitializeTimer(&streamObject->TimeoutTimer);
        KeInitializeDpc(&streamObject->TimeoutDpc,
                        IsoUsb_StreamTimeoutDPC,
                        streamObject);

        dueTime.QuadPart = -10000 * ISOUSB_STREAM_TIMEOUT_INTERVAL;

        inQueue = KeSetTimer(&streamObject->TimeoutTimer,
                             dueTime,
                             &streamObject->TimeoutDpc);

        ASSERT(inQueue == FALSE);  // assert timer not already in system queue

    }
}


NTSTATUS
IsoUsb_StartIsoStream(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:

	Handler for IOCTL_ISOUSB_START_ISO_STREAM

Arguments:

    DeviceObject - pointer to the device extension for this instance of the
                     82930 device.

    Irp -

Return Value:

    NT status code

--*/
{
    ULONG i;
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PIO_STACK_LOCATION irpStack;
    ULONG inputBufferLength;
    ULONG outputBufferLength;
    PULONG_PTR streamObjectHandle;
    PISOUSB_STREAM_OBJECT streamObject;
    LARGE_INTEGER dueTime;
    BOOLEAN inQueue;
	PUSBD_PIPE_INFORMATION PipeInfo;
    PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;

    irpStack = IoGetCurrentIrpStackLocation (Irp);

    streamObjectHandle = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

    if ( outputBufferLength  < sizeof(*streamObjectHandle) ) {

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

        return STATUS_INVALID_PARAMETER;
    }

    streamObject = ExAllocatePool(NonPagedPool, sizeof(ISOUSB_STREAM_OBJECT));

    if (streamObject) {


		RtlZeroMemory( streamObject, sizeof(ISOUSB_STREAM_OBJECT));

		// hard code to 5th pipe; this is the iso in pipe on our test board
		PipeInfo = &(deviceExtension->UsbInterface->Pipes[4]);

		ISOUSB_KdPrint (DBGLVL_MEDIUM,(" ENTER IsoUsb_StartIsoStream()  pipe %x\n", PipeInfo));

		deviceExtension->PipeInfo[4].fPipeOpened = TRUE; // set flag for this pipe opened
		deviceExtension->OpenPipeCount++;

		// try to power up device if its not already in D0
		IsoUsb_SelfSuspendOrActivate( DeviceObject, FALSE );

        streamObject->DeviceObject = DeviceObject;
        streamObject->PipeInfo = PipeInfo;
        streamObject->IsoStreamStarted = TRUE;

		// event to be set when PendingIrps == 0; signals stream can be stopped
		KeInitializeEvent(&streamObject->NoPendingIrpEvent, NotificationEvent, FALSE);

        // This initializes the pair of IRP/URBS that we will keep endlessly recycling
		// until the Iso stream is stoppped; at least one of these pairs will always be in
		// use and one will be available so continuous throughput is maintained.
		for (i=0; i< ISOUSB_MAX_IRP; i++) {

            ntStatus = IsoUsb_StartTransfer(DeviceObject,
                                            streamObject,
                                            i);

            if (!NT_SUCCESS(ntStatus)) {
				ISOUSB_Trap(DBGLVL_MAXIMUM);
                break;
            }

        }

		// We are returning the pointer to our stream object as an untyped handle to the user
        *streamObjectHandle = (ULONG_PTR) streamObject;

        //
        // start the timeout DPC
        //

        KeInitializeTimer(&streamObject->TimeoutTimer);
        KeInitializeDpc(&streamObject->TimeoutDpc,
                        IsoUsb_StreamTimeoutDPC,
                        streamObject);

        dueTime.QuadPart = -10000 * ISOUSB_STREAM_TIMEOUT_INTERVAL;

        inQueue = KeSetTimer(&streamObject->TimeoutTimer,
                             dueTime,
                             &streamObject->TimeoutDpc);


    } else {
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

	// We are returning the size of our stream object pointer to the user
    Irp->IoStatus.Information = sizeof(*streamObjectHandle);
    Irp->IoStatus.Status = ntStatus;

    ISOUSB_KdPrint (DBGLVL_MEDIUM,(" EXIT IsoUsb_StartIsoStream() %x\n", ntStatus));

    return ntStatus;
}


NTSTATUS
IsoUsb_StopIsoStream(
    IN PDEVICE_OBJECT DeviceObject,
    IN PISOUSB_STREAM_OBJECT StreamObject,
    IN PIRP Irp
    )
/*++

Routine Description:

	Handler for IOCTL_ISOUSB_STOP_ISO_STREAM

Arguments:

    DeviceObject - pointer to the device extension for this instance of the
                     82930 device.

    StreamObject - pointer to the ISOUSB_STREAM_OBJECT; We returned this pointer to the user
	  in the return data buffer from their IOCTL_ISOUSB_START_ISO_STREAM call

    Irp - The current IRP for this request

Return Value:

    NT status code

--*/
{
	PUSBD_PIPE_INFORMATION pipe;
	int i;
    PDEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;
    ULONG packetSize, numPackets, maxXferSize;


	// validate the input parm; its DeviceObject member should match our DeviceObject
	ISOUSB_KdPrintCond (DBGLVL_MEDIUM,
						(!StreamObject || (StreamObject->DeviceObject != DeviceObject)),
						("ENTER IsoUsb_StopIsoStream() StreamObject parm INVALID!!!!!\n"));	

	// See if we were called with a bogus or NULL StreamObject parm;
	// This could happen if user calls without ever having successfully started a stream
    if (!StreamObject || (StreamObject->DeviceObject != DeviceObject))
		return STATUS_INVALID_PARAMETER;

	maxXferSize = StreamObject->PipeInfo->MaximumTransferSize;  // We set this
    packetSize = StreamObject->PipeInfo->MaximumPacketSize;	    // USBD sets this
    numPackets = maxXferSize / packetSize;

	// Tell IsoUsb_StreamTimeoutDPC() not to reschedule itself on next timeout
	// This also flags IsoUsb_IsoIrp_Complete() to stop recycling the pair of stream IRP/Urbs
	StreamObject->IsoStreamStarted = FALSE;

    // Wait for any io request pending for this stream object to
    // complete before returning success.
	// This  event is set when streamObject->PendingIrpCount goes to 0
    KeWaitForSingleObject(
                &StreamObject->NoPendingIrpEvent,
                Suspended,
                KernelMode,
                FALSE,
                NULL);


    ISOUSB_KdPrint (DBGLVL_DEFAULT, ("IsoUsb_StopIsoStream() StreamObject->TimesRecycled = decimal %d,  0x%x\n",
		StreamObject->TimesRecycled , StreamObject->TimesRecycled));
    ISOUSB_KdPrint (DBGLVL_DEFAULT, ("IsoUsb_StopIsoStream() Total packets processed = decimal %d\n",
		StreamObject->TotalPacketsProcessed ));
    ISOUSB_KdPrint (DBGLVL_DEFAULT, ("IsoUsb_StopIsoStream() Total stream bytes processed  = decimal %d\n",
		StreamObject->TotalBytesProcessed ));
    ISOUSB_KdPrint (DBGLVL_DEFAULT, ("EXIT IsoUsb_StopIsoStream() Error Packet Count  = decimal %d\n",
		StreamObject->ErrorPacketCount ));


    // Free all the buffers, URBS, and Irps associated with our stream object
	for (i=0; i< ISOUSB_MAX_IRP; i++) {
		PISOUSB_TRANSFER_OBJECT transferObject;

		transferObject = StreamObject->TransferObjectList[i];

		ISOUSB_ASSERT( transferObject );

		ISOUSB_ASSERT( transferObject->Irp );
		IoFreeIrp( transferObject->Irp );

		ISOUSB_ASSERT( transferObject->Urb );
		ExFreePool( transferObject->Urb );

		ISOUSB_ASSERT( transferObject->DataBuffer );
		ExFreePool( transferObject->DataBuffer );

		ExFreePool( transferObject );
    }

	ExFreePool( StreamObject ); // also free the stream object itself


	// Close our Iso input pipe;
	// Hard-code to 5th pipe; this is the iso input pipe on our test board
	pipe = &(deviceExtension->UsbInterface->Pipes[4]);

	deviceExtension->PipeInfo[4].fPipeOpened = FALSE; // set flag for this pipe closed
	deviceExtension->OpenPipeCount--;

	// ISSUE? Not sure why this is neccesary, but it is...
	IsoUsb_ResetParentPort( DeviceObject );

	// try to power down device if we just closed the last open pipe
	IsoUsb_SelfSuspendOrActivate( DeviceObject, TRUE );

	return STATUS_SUCCESS;

}







?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品福利视频网站| 成人免费在线播放视频| 免费观看日韩av| 这里是久久伊人| 日本va欧美va瓶| 精品不卡在线视频| 成人福利在线看| 一区二区免费在线播放| 欧美日本在线一区| 久久99国产精品久久| 国产午夜精品久久| 91精品1区2区| 久热成人在线视频| 国产日产欧美一区二区视频| 99精品久久99久久久久| 亚洲国产精品人人做人人爽| 日韩亚洲欧美中文三级| 国产a久久麻豆| 亚洲在线一区二区三区| 日韩视频一区在线观看| 粉嫩蜜臀av国产精品网站| 亚洲最大成人网4388xx| 日韩一卡二卡三卡四卡| 99久久精品免费精品国产| 亚洲成人一区二区在线观看| 久久在线免费观看| 在线精品视频一区二区| 国产一区福利在线| 亚洲一区二区三区不卡国产欧美| 日韩三级视频在线看| 91免费版在线| 极品销魂美女一区二区三区| 亚洲欧美一区二区不卡| 精品动漫一区二区三区在线观看| www.亚洲激情.com| 久久99国内精品| 亚洲一区欧美一区| 国产精品免费免费| 日韩区在线观看| 欧美亚洲国产一区二区三区va| 国产一区二区伦理片| 亚洲综合精品久久| 国产精品乱人伦中文| 欧美大胆一级视频| 欧美色图一区二区三区| 丰满白嫩尤物一区二区| 蜜臀av性久久久久蜜臀av麻豆| 亚洲理论在线观看| 国产精品天天摸av网| 欧美变态tickling挠脚心| 欧美色网一区二区| 91在线视频播放地址| 国产乱人伦偷精品视频免下载| 亚洲国产va精品久久久不卡综合| 中文字幕视频一区| 久久色.com| 精品国精品国产| 在线播放视频一区| 欧洲av在线精品| 色欧美乱欧美15图片| 成人黄色小视频在线观看| 国产精品一区二区你懂的| 久久99精品国产麻豆婷婷洗澡| 亚洲成a人片综合在线| 亚洲综合视频网| 亚洲精品视频免费观看| 亚洲免费毛片网站| 亚洲色图欧美在线| 中文字幕在线一区免费| 中文字幕乱码日本亚洲一区二区| 精品毛片乱码1区2区3区| 欧美一区日韩一区| 制服丝袜亚洲播放| 欧美一区二区三区在线视频| 欧美三级蜜桃2在线观看| 欧洲人成人精品| 欧美日韩五月天| 在线播放国产精品二区一二区四区 | 久久精品这里都是精品| 国产精品美女久久久久av爽李琼| 日韩一区二区三区视频在线| 日韩视频中午一区| 久久一区二区三区四区| 国产午夜精品一区二区三区嫩草 | 亚洲一本大道在线| 亚洲妇熟xx妇色黄| 日韩电影在线观看电影| 琪琪一区二区三区| 国产尤物一区二区| 亚洲一区二区三区小说| 91网址在线看| 色欧美日韩亚洲| 欧美日韩另类一区| 欧美一区二区三区公司| 日韩三级.com| 欧美国产欧美综合| 亚洲男同1069视频| 奇米影视在线99精品| 国产乱码精品一品二品| 色综合天天狠狠| 88在线观看91蜜桃国自产| 久久伊99综合婷婷久久伊| 国产精品初高中害羞小美女文| 国产精品欧美一级免费| 午夜一区二区三区在线观看| 日本不卡一二三区黄网| 国产成人免费高清| 在线精品观看国产| 亚洲精品在线电影| 亚洲欧美国产高清| 精品一区二区三区在线观看| yourporn久久国产精品| 欧美一区二区三区四区高清| 久久久国产综合精品女国产盗摄| 麻豆视频观看网址久久| 亚洲成人一区在线| 国产一区欧美二区| 一本一本大道香蕉久在线精品| 91精品国产综合久久精品性色| 国产欧美日韩视频一区二区| 亚洲一区在线电影| 国产精品一二三四五| 在线中文字幕不卡| 欧美xxxx老人做受| 亚洲亚洲精品在线观看| 国产精品77777竹菊影视小说| 欧美视频一二三区| 国产精品网友自拍| 紧缚奴在线一区二区三区| 欧美在线观看视频一区二区 | 色偷偷久久人人79超碰人人澡| 日韩欧美国产精品一区| 一区二区三区中文字幕| 国产一区二区三区蝌蚪| 欧美精品久久99| 亚洲欧美日韩国产手机在线| 国产一区啦啦啦在线观看| 欧美日韩一二区| 日韩精品色哟哟| 亚洲色图19p| 一区二区三区在线观看视频| 国产精品丝袜91| 偷拍自拍另类欧美| 色先锋久久av资源部| 国产欧美一区二区精品秋霞影院| 天堂蜜桃一区二区三区| 91久久精品一区二区三| 国产精品国产三级国产普通话三级 | 国产日韩欧美在线一区| 午夜不卡在线视频| 色8久久人人97超碰香蕉987| 精品精品国产高清a毛片牛牛 | 久久国产麻豆精品| 欧美日韩免费观看一区二区三区| 狠狠色综合日日| 欧美日韩另类一区| 亚洲福利视频三区| 欧美日韩三级在线| 亚洲动漫第一页| 欧美日韩精品电影| 亚洲成va人在线观看| 欧美日韩精品欧美日韩精品| 亚洲午夜在线观看视频在线| 91麻豆成人久久精品二区三区| 国产精品毛片无遮挡高清| 高清久久久久久| 国产精品你懂的在线欣赏| 99久久精品国产一区二区三区| 国产精品欧美经典| 91在线观看一区二区| 日韩一区在线看| 色久综合一二码| 亚洲一区二区三区中文字幕| 在线观看亚洲专区| 亚洲国产成人高清精品| 欧美另类z0zxhd电影| 蜜桃久久久久久| 久久久久99精品国产片| 国产成人亚洲综合a∨猫咪 | 国产精品不卡一区二区三区| 97se亚洲国产综合自在线不卡| 中文字幕一区二区不卡 | 亚洲韩国一区二区三区| 欧美日韩视频在线第一区| 蜜臀久久久99精品久久久久久| 日韩一级完整毛片| 国产91丝袜在线播放| 亚洲欧美另类久久久精品| 欧美午夜精品电影| 日韩av一区二| 中文字幕二三区不卡| 在线观看三级视频欧美| 美女诱惑一区二区| 国产午夜精品一区二区| 色综合一区二区三区| 日本色综合中文字幕| 国产精品女上位| 欧美日韩电影一区| 国产69精品久久久久毛片| 亚洲国产欧美日韩另类综合|