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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? usbios.c

?? 來(lái)自微軟的usb2.0開(kāi)發(fā)包,加速USB驅(qū)動(dòng)開(kāi)發(fā)
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
        // 16 times slower than normal.  To deal with this we schedule a DPC 
        // callback that will submit the bulk transfers when bandwidth 
        // reclamation is enabled.
	
        USBLS120_KdPrint( DBGLVL_HIGH,("Queuing Data Xfer DPC\n"));

        // Queue the DPC
        KeInsertQueueDpc(DeviceExtension->TransferDataDpc, Reference, 0 );

    } else {
        USBLS120_KdPrint( DBGLVL_HIGH,("Request completed successfully\n"));

        IoFreeIrp(Irp);
        ExFreePool(Urb);

        // Command phase completed successfully, with no data phase needed.
        // Notify port driver and return.
        IoPacket->Status = IO_STATUS_SUCCESS;
        DeviceExtension->CompleteRequest(IoPacket);
    }

    // All driver-orignated IRPs must return
    // STATUS_MORE_PROCESSING_REQUIRED.
    return STATUS_MORE_PROCESSING_REQUIRED;
}



VOID
USBLS120_TransferDataWorker(
    IN PVOID DeviceObject
    )
/*++
Routine Description:

    Worker function for resetting bulk pipe after stall.

 Arguments:

    DeviceObject - Previous device object.

Return Value:

    None.
--*/

{
    PDEVICE_EXTENSION DeviceExtension;

    USBLS120_KdPrint( DBGLVL_MEDIUM,("enter USBLS120_TransferDataError\n"));

    DeviceExtension = ((PDEVICE_OBJECT)(DeviceObject))->DeviceExtension;

    USBLS120_ResetPipe(
        (PDEVICE_OBJECT)(DeviceObject),
        (DeviceExtension->IoPacket->Flags & IO_FLAGS_DATA_IN) ? 
           &(DeviceExtension->UsbInterface->Pipes[DeviceExtension->DataInPipe]) : 
           &(DeviceExtension->UsbInterface->Pipes[DeviceExtension->DataOutPipe])
        );

    DeviceExtension->IoPacket->Status = IO_STATUS_DEVICE_ERROR;
    DeviceExtension->CompleteRequest(DeviceExtension->IoPacket);
    ExFreePool(DeviceExtension->WorkItem);
}




VOID 
USBLS120_TransferDataDPC(
    PKDPC Dpc,
    PVOID DeferredContext,
    PVOID SystemArgument1,
    PVOID SystemArgument2
    )
/*++
Routine Description:

    DPC handler used to schedule bulk data transfer to/from the device
    after command phase.

 Arguments:

    Dpc - DPC object.
    DeferredContext - N/A
    SystemArgument1 - Points to our Device Object
    SystemArgument2 - N/A

Return Value:

    None.
--*/
{
    PDEVICE_OBJECT DeviceObject;

    USBLS120_KdPrint( DBGLVL_HIGH,("enter USBLS120_TransferDataDPC\n"));

    DeviceObject = (PDEVICE_OBJECT)SystemArgument1;
    USBLS120_TransferData(DeviceObject);

    USBLS120_KdPrint( DBGLVL_HIGH,("exit USBLS120_TransferDataDPC\n"));
}



VOID 
USBLS120_TransferData(
    PDEVICE_OBJECT DeviceObject
    )
/*++
Routine Description:

    Schedules bulk data transfer to/from the device.

 Arguments:

    DeviceObject - FDO for USB storage device.

Return Value:

    None.
--*/
{
    PURB Urb;
    PIRP Irp;
    USBD_PIPE_HANDLE PipeHandle;
    PDEVICE_EXTENSION DeviceExtension;
    NTSTATUS ntStatus;
    BOOLEAN DataIn;
    PVOID DataBuffer;
    ULONG XferLength;
    PIO_STACK_LOCATION NextStack;
    BlockDev_Scatter_Gather * Sgd;

  
    USBLS120_KdPrint( DBGLVL_HIGH,("enter USBLS120_TransferData\n"));

    DeviceExtension = DeviceObject->DeviceExtension;
    Urb = DeviceExtension->Urb;
    Irp = DeviceExtension->Irp;

    // Figure out which direction we're going
    if ((DeviceExtension->IoPacket->Flags) & IO_FLAGS_DATA_IN)
        DataIn = TRUE;
    else
        DataIn = FALSE;


    // Use appropriate bulk pipe
    if (DataIn)
        PipeHandle = DeviceExtension->UsbInterface->Pipes[DeviceExtension->DataInPipe].PipeHandle;
    else
        PipeHandle = DeviceExtension->UsbInterface->Pipes[DeviceExtension->DataOutPipe].PipeHandle;
	

    // If we are doing scatter gather, we will need to find the current
    // SGD element and use its data buffer
    if (DeviceExtension->IoPacket->Flags & IO_FLAGS_SCATTER_GATHER) {

        // Retrieve the SGD list stored in the IoPacket
        Sgd = (BlockDev_Scatter_Gather *)(DeviceExtension->IoPacket->DataBuffer);

        // Extract SGD's data buffer pointer
        DataBuffer = (PVOID)Sgd[DeviceExtension->CurrentSGD].BD_SG_Buffer_Ptr;

        // SGD length is block count, need to convert to byte count
        // and increment the current SGD counter
        XferLength = Sgd[DeviceExtension->CurrentSGD++].BD_SG_Count *
                         DeviceExtension->IoPacket->BlockSize;

        USBLS120_KdPrint( DBGLVL_HIGH,("SGDBuffer=%x, BuffSize=%x\n", DataBuffer, XferLength));
    } else {

        // No SGD, just a flat linear data buffer
        DataBuffer = (PVOID)DeviceExtension->IoPacket->DataBuffer;
        XferLength = DeviceExtension->DataLeft;
    }
	
    // Keep track of how much data we have left to transfer
    DeviceExtension->DataLeft -= XferLength;
	
    // Build a URB for our bulk data transfer
    UsbBuildInterruptOrBulkTransferRequest(
        Urb,
        sizeof (struct _URB_BULK_OR_INTERRUPT_TRANSFER),
        PipeHandle,
        DataBuffer,
        NULL,
        XferLength,
        DataIn ? USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK :
            USBD_TRANSFER_DIRECTION_OUT,
        NULL
        );

    NextStack = IoGetNextIrpStackLocation(Irp);
    
    USBLS120_ASSERT(NextStack != NULL);
    USBLS120_ASSERT(DeviceObject->StackSize>1);

    NextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    NextStack->Parameters.Others.Argument1 = Urb;
    NextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
	
    IoSetCompletionRoutine(
        Irp,
        USBLS120_TransferDataComplete,
        (PVOID)DeviceObject, 
        TRUE,    // invoke on success
        TRUE,    // invoke on error
        TRUE     // invoke on cancellation of the Irp
        );

    USBLS120_IncrementIoCount(DeviceObject);

    // Pass Irp to the USB driver stack without checking status.
    // We don't look at the return status since we will 
    // always complete the IOS request in our
    // completion handler, regardless of status.

    // Call USB driver stack
    IoCallDriver(DeviceExtension->TopOfStackDeviceObject, Irp);
}

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

    Completion handler for bulk data transfer

 Arguments:

    DeviceObject - Previous device object in the stack.
    Irp - Irp being completed.
    Reference - Our device object.

Return Value:

    NTSTATUS value.
--*/

{
    NTSTATUS NtStatus;
    PURB Urb;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_EXTENSION DeviceExtension;

    USBLS120_KdPrint( DBGLVL_HIGH,("enter USBLS120_TransferDataComplete\n"));

    DeviceExtension = ((PDEVICE_OBJECT)(Reference))->DeviceExtension;

    Urb = DeviceExtension->Urb;

    USBLS120_DecrementIoCount((PDEVICE_OBJECT)(Reference));
	    
    USBLS120_KdPrint(
        DBGLVL_HIGH,
        ("TransferLength=%x, Urb Status=%x, Irp Status = %x\n",
        Urb->UrbBulkOrInterruptTransfer.TransferBufferLength,
        Urb->UrbHeader.Status, 
        Irp->IoStatus.Status));

    NtStatus = Irp->IoStatus.Status;

    if (!NT_SUCCESS(NtStatus)) {
        //Device failed Data Transfer

        IoFreeIrp(Irp);
        ExFreePool(Urb);

        // Check if we need to clear stalled pipe
        if (USBD_HALTED(Urb->UrbHeader.Status)) {

            // Reset pipe can only be done at passive level, so we need
            // to schedule a work item to do it.
            DeviceExtension->WorkItem = ExAllocatePool(NonPagedPool, sizeof(WORK_QUEUE_ITEM));
		
            if (DeviceExtension->WorkItem) {
                USBLS120_KdPrint( DBGLVL_HIGH,("Scheduling DPC to reset endpoint\n"));

                // Schedule a work-item to reset the pipe
                ExInitializeWorkItem(
                    DeviceExtension->WorkItem,
                    USBLS120_TransferDataWorker,
                    Reference
                    );

                ExQueueWorkItem(
                    DeviceExtension->WorkItem,
                    DelayedWorkQueue
                    );

                return STATUS_MORE_PROCESSING_REQUIRED;

            } else {
                // Can't reset pipe because we can't allocate work-item
                USBLS120_KdPrint( DBGLVL_MINIMUM,("Failed to allocate work-item to reset pipe!!\n"));
                TRAP();
            }
        }

        USBLS120_KdPrint( DBGLVL_MINIMUM,("Completing IOPACKET with error\n"));

        // Complete request with error
        DeviceExtension->IoPacket->Status = IO_STATUS_DEVICE_ERROR;
        DeviceExtension->CompleteRequest(DeviceExtension->IoPacket);

        return STATUS_MORE_PROCESSING_REQUIRED;
    }

    //
    // Transfer succeeded
    //

    // Do we have more data to transfer?
    if (DeviceExtension->DataLeft) {
        // Transfer the next SGD
        USBLS120_TransferData((PDEVICE_OBJECT)(Reference));
    } else {

        USBLS120_KdPrint( DBGLVL_HIGH,("Completing IOP successfully\n"));

        IoFreeIrp(Irp);
        ExFreePool(Urb);
        DeviceExtension->IoPacket->Status = IO_STATUS_SUCCESS;
        DeviceExtension->CompleteRequest(DeviceExtension->IoPacket);
    }

    return STATUS_MORE_PROCESSING_REQUIRED;
}



?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线日韩欧美| 色综合久久66| 亚洲欧美日韩国产一区二区三区| 欧美中文字幕一二三区视频| 国产一区二区视频在线| 一区二区三区在线播放| 中文字幕二三区不卡| 日韩你懂的电影在线观看| 91九色02白丝porn| 国产91精品一区二区| 日韩中文字幕1| 亚洲女女做受ⅹxx高潮| 久久亚洲免费视频| 91精品国产91久久综合桃花| 欧洲亚洲国产日韩| 成人性生交大片免费看在线播放 | 色久优优欧美色久优优| 久久爱www久久做| 婷婷成人综合网| 亚洲一区二区精品视频| 国产精品久久影院| 欧美激情一区二区三区在线| 欧美成人在线直播| 在线播放/欧美激情| 日本精品免费观看高清观看| 成人av资源下载| 国产高清无密码一区二区三区| 捆绑紧缚一区二区三区视频| 男男视频亚洲欧美| 蜜臀精品久久久久久蜜臀| 不卡在线视频中文字幕| 国产老肥熟一区二区三区| 久久成人久久鬼色| 麻豆精品视频在线观看免费| 日韩avvvv在线播放| 性做久久久久久| 亚洲大片精品永久免费| 性欧美疯狂xxxxbbbb| 亚洲aaa精品| 三级久久三级久久| 日产欧产美韩系列久久99| 偷拍日韩校园综合在线| 日本不卡的三区四区五区| 日韩高清一级片| 久久国产精品99精品国产| 久久精品99国产精品日本| 国产一区二区三区综合| 国产成人精品三级麻豆| 懂色av一区二区三区免费观看| 成人小视频免费在线观看| 成人污污视频在线观看| 色综合久久久久综合体| 欧美三级三级三级爽爽爽| 欧美日本在线看| 日韩欧美国产高清| 国产日韩欧美制服另类| 亚洲国产成人午夜在线一区| 中文字幕日韩欧美一区二区三区| 国产精品对白交换视频| 亚洲福利视频一区| 精品一区二区在线观看| 福利一区福利二区| 一本一道综合狠狠老| 亚洲免费电影在线| 亚洲国产精品麻豆| 日本午夜一区二区| 国产91精品精华液一区二区三区 | 蜜桃免费网站一区二区三区| 国产在线播放一区| 91亚洲精品久久久蜜桃网站 | 亚洲国产视频a| 另类的小说在线视频另类成人小视频在线 | 国产精品乱码妇女bbbb| 一个色综合av| 久草中文综合在线| 91亚洲永久精品| 欧美一级片在线| 国产精品黄色在线观看| 日本中文字幕一区| 不卡视频一二三四| 欧美一区日韩一区| 国产精品视频九色porn| 三级欧美在线一区| 成人午夜激情在线| 欧美一区二区三区人| 亚洲图片你懂的| 美国毛片一区二区| 日本乱码高清不卡字幕| 久久综合九色综合欧美98| 亚洲综合一区二区精品导航| 国产麻豆精品一区二区| 欧美日韩一本到| 亚洲国产经典视频| 免费成人在线影院| 91香蕉国产在线观看软件| 日韩欧美成人午夜| 亚洲自拍欧美精品| 成人av综合在线| 亚洲精品一线二线三线无人区| 一区二区三区不卡视频在线观看| 国产一区二区不卡在线| 欧美日韩一级二级| 亚洲视频中文字幕| 国产麻豆视频一区| 日韩欧美一级在线播放| 夜夜精品视频一区二区| 成人看片黄a免费看在线| 欧美大尺度电影在线| 午夜精彩视频在线观看不卡| 成人黄色a**站在线观看| 精品国产sm最大网站免费看| 亚洲成人动漫av| 欧美最新大片在线看| 国产精品麻豆99久久久久久| 国产又黄又大久久| 欧美大胆人体bbbb| 美女一区二区三区| 欧美日韩国产一二三| 一区二区三区不卡在线观看| 波多野结衣一区二区三区| 国产三级三级三级精品8ⅰ区| 美日韩一级片在线观看| 91麻豆精品久久久久蜜臀| 一卡二卡欧美日韩| 日本电影欧美片| 亚洲欧美日韩在线播放| 91在线观看下载| 中文字幕av一区二区三区免费看| 国产精品一区一区| 久久国产精品99久久久久久老狼| 欧美日韩国产免费一区二区| 亚洲成人激情综合网| 欧洲精品一区二区| 亚洲成人综合视频| 91福利视频网站| 亚洲黄色小视频| 欧洲人成人精品| 亚洲高清视频在线| 91麻豆精品国产91久久久资源速度 | 亚洲大片一区二区三区| 欧美日韩久久一区| 日韩二区在线观看| 精品日韩99亚洲| 国产一区二区久久| 国产精品国产三级国产专播品爱网 | 午夜a成v人精品| 日韩欧美二区三区| 国产成人综合精品三级| 中文av一区特黄| 色吧成人激情小说| 亚洲成av人片在线| 欧美成人乱码一区二区三区| 国产一区二区电影| 中文字幕亚洲一区二区va在线| 91影院在线免费观看| 亚洲成人激情av| 精品美女在线播放| 国产成人av自拍| 一区二区三区免费| 欧美一区二区日韩| 成人小视频在线| 亚洲国产一区二区视频| 日韩一级黄色大片| 国产河南妇女毛片精品久久久 | 性久久久久久久| 久久久久国色av免费看影院| av福利精品导航| 日韩极品在线观看| 国产欧美日韩另类一区| 91成人国产精品| 国产综合久久久久久久久久久久 | 中文字幕日本乱码精品影院| 91色porny| 琪琪一区二区三区| 国产精品久久久久久久久图文区| 欧美在线免费观看亚洲| 久久99久久精品欧美| 中文字幕日本乱码精品影院| 91精选在线观看| 成人av在线资源网站| 日韩电影在线一区二区三区| 日本一区二区免费在线| 欧美日韩不卡视频| 成人av小说网| 美女网站在线免费欧美精品| 中文字幕一区二区三区在线观看| 欧美一区二视频| 一本色道综合亚洲| 久久精品免费看| 一区二区三区四区五区视频在线观看| 精品久久人人做人人爰| 欧美综合一区二区| 国产91精品一区二区麻豆亚洲| 日本丰满少妇一区二区三区| 激情综合色综合久久| 亚洲成人精品影院| 亚洲免费观看视频| 国产精品视频观看| 久久综合资源网| 91.xcao|