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

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

?? isostrm.c

?? ARM2410的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;

}







?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜久久久影院| 国产精品理论片在线观看| 精品欧美乱码久久久久久| 久久噜噜亚洲综合| 亚洲免费在线播放| 青青草原综合久久大伊人精品优势| 国精品**一区二区三区在线蜜桃| 成人aaaa免费全部观看| 欧美性猛交xxxx黑人交| 精品国产一区二区精华| **性色生活片久久毛片| 日韩二区在线观看| jlzzjlzz亚洲女人18| 欧美日韩在线综合| 久久蜜桃香蕉精品一区二区三区| 亚洲乱码国产乱码精品精98午夜| 日韩av一区二区在线影视| 成人午夜av影视| 欧美精品1区2区3区| 欧美激情在线看| 亚洲成av人影院在线观看网| 国产美女精品一区二区三区| 在线看国产一区二区| www一区二区| 亚洲网友自拍偷拍| 国产69精品久久久久毛片| 欧美日韩一卡二卡| 亚洲国产成人私人影院tom| 五月婷婷色综合| 99久久久精品免费观看国产蜜| 日韩你懂的在线播放| 亚洲男人都懂的| 国产精品资源在线| 6080国产精品一区二区| 日韩毛片视频在线看| 国产一区二区三区免费| 欧美日韩国产一二三| 国产精品视频一区二区三区不卡| 日本中文字幕一区二区有限公司| 91亚洲永久精品| 久久综合国产精品| 蜜桃一区二区三区在线观看| 91久久免费观看| 日本一区二区三区免费乱视频| 日本成人超碰在线观看| 日本精品裸体写真集在线观看 | 亚洲国产视频一区二区| 成人久久久精品乱码一区二区三区| 正在播放亚洲一区| 亚洲成人资源网| 色美美综合视频| 国产精品护士白丝一区av| 国产一区二区精品久久99| 欧美电影影音先锋| 亚洲国产婷婷综合在线精品| 91在线国内视频| 国产精品美女久久久久久| 精品一区二区三区免费观看| 欧美大白屁股肥臀xxxxxx| 日本在线不卡视频一二三区| 理论电影国产精品| 99精品久久免费看蜜臀剧情介绍| 精品国产sm最大网站免费看| 亚洲大尺度视频在线观看| 成人不卡免费av| 欧美一级理论片| 日韩精品亚洲一区二区三区免费| 欧美综合天天夜夜久久| 亚洲品质自拍视频| 91亚洲精品久久久蜜桃| 中文字幕亚洲视频| www.一区二区| 日韩一区在线免费观看| 99九九99九九九视频精品| 中文字幕日本乱码精品影院| av在线播放不卡| 亚洲视频在线观看三级| 在线亚洲一区二区| 亚洲综合丝袜美腿| 欧美性色欧美a在线播放| 亚洲国产一二三| 在线播放91灌醉迷j高跟美女| 日韩不卡一区二区三区| 日韩精品中文字幕在线一区| 精品一区二区精品| 久久久久久久久蜜桃| 国产91色综合久久免费分享| 中文字幕二三区不卡| 99综合影院在线| 亚洲视频1区2区| 欧美色图免费看| 日韩电影在线一区二区三区| 精品国产一区二区三区久久影院| 国产精品69毛片高清亚洲| 国产精品无遮挡| 在线精品视频一区二区| 欧美aaaaa成人免费观看视频| 久久亚洲精品国产精品紫薇| 成年人国产精品| 亚洲国产精品欧美一二99| 日韩视频国产视频| 国产夫妻精品视频| 亚洲青青青在线视频| 欧美日精品一区视频| 免费成人深夜小野草| 国产精品污网站| 欧美日韩一级二级| 国产美女在线观看一区| 亚洲美女免费在线| 欧美一区二区三区色| 成人国产视频在线观看| 亚洲v精品v日韩v欧美v专区| 欧美精品一区二区在线播放| 成人a免费在线看| 午夜久久久久久| 国产欧美一区二区在线| 欧美性xxxxx极品少妇| 久久精品国产99国产精品| 亚洲欧洲www| 日韩视频永久免费| 一本一道波多野结衣一区二区| 五月综合激情网| 国产精品免费网站在线观看| 欧美男人的天堂一二区| 国产91色综合久久免费分享| 五月天丁香久久| 中文字幕在线一区| 日韩一区二区三区电影在线观看| 成人三级在线视频| 日本网站在线观看一区二区三区| 亚洲国产高清在线观看视频| 欧美一区二区日韩一区二区| youjizz国产精品| 极品瑜伽女神91| 亚洲成人自拍网| 成人欧美一区二区三区白人| 日韩欧美一区二区免费| 在线一区二区三区四区五区 | 日韩一级大片在线观看| 91在线免费看| 国产精品一区二区在线观看网站| 一区二区三区精品| 国产精品欧美精品| 精品久久久久久无| 欧美精品日韩一区| 99国内精品久久| 国产又黄又大久久| 天堂久久一区二区三区| 日韩码欧中文字| 欧美国产一区二区| 欧美剧情电影在线观看完整版免费励志电影| 国产成人综合亚洲91猫咪| 日本色综合中文字幕| 一区二区三区中文字幕在线观看| 中文无字幕一区二区三区| 欧美大片拔萝卜| 欧美浪妇xxxx高跟鞋交| 91老司机福利 在线| 成人一区二区三区| 精品无码三级在线观看视频| 日本视频免费一区| 性欧美疯狂xxxxbbbb| 亚洲精品国产高清久久伦理二区| 欧美经典一区二区三区| 精品国产制服丝袜高跟| 日韩一区二区高清| 91.麻豆视频| 欧美日韩精品欧美日韩精品一| 欧美亚洲日本国产| 在线视频观看一区| 欧洲生活片亚洲生活在线观看| 91在线视频免费91| 99久久精品国产网站| 北条麻妃一区二区三区| 99热这里都是精品| 91在线播放网址| 91污在线观看| 91蝌蚪国产九色| 色综合天天综合网国产成人综合天 | 色欧美日韩亚洲| 欧美在线观看一区二区| 91福利区一区二区三区| 在线亚洲人成电影网站色www| 在线视频一区二区三区| 欧美日韩一区二区在线观看| 欧美视频日韩视频| 欧美日韩免费不卡视频一区二区三区| 在线观看成人小视频| 欧美裸体bbwbbwbbw| 欧美一区二区三区在线观看| 91精品久久久久久久99蜜桃 | 久久精品人人做人人爽97| 久久九九影视网| 久久香蕉国产线看观看99| 国产日本亚洲高清| 国产午夜精品美女毛片视频| 久久久亚洲欧洲日产国码αv| 欧美成人三级在线| 精品999久久久| 久久久夜色精品亚洲|