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

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

?? usbios.c

?? 一個好用的MS的USB驅動編程工具包,希望有用.
?? C
?? 第 1 頁 / 共 2 頁
字號:
        // 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;
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲第一激情av| 日本久久一区二区| 紧缚奴在线一区二区三区| 三级久久三级久久| 六月婷婷色综合| 久久se精品一区二区| 国产一区不卡在线| 国产精品一品二品| 波多野结衣欧美| 91网站最新地址| 欧美午夜精品免费| 日韩欧美在线一区二区三区| 久久综合色一综合色88| 久久精品亚洲国产奇米99| 中文字幕二三区不卡| 中文字幕一区二区三区四区不卡| 亚洲欧洲日韩av| 亚洲一区二区三区在线| 日韩国产欧美在线观看| 美女任你摸久久| 国产成人精品www牛牛影视| 成人黄色777网| 欧美综合在线视频| 欧美一二三四区在线| 国产欧美日韩中文久久| 亚洲人成人一区二区在线观看| 亚洲一区在线视频观看| 美女高潮久久久| av爱爱亚洲一区| 欧美天堂亚洲电影院在线播放 | 久久毛片高清国产| 国产精品蜜臀av| 天天综合色天天| 国产成人小视频| 在线观看免费亚洲| 欧美变态tickle挠乳网站| 国产精品进线69影院| 一区二区三区欧美日| 久久精品久久综合| 99精品偷自拍| 精品欧美一区二区在线观看| 国产精品久久久久一区二区三区| 亚洲丰满少妇videoshd| 国产精品538一区二区在线| 欧洲精品一区二区| 久久嫩草精品久久久久| 亚洲电影中文字幕在线观看| 国产精一区二区三区| 欧美三级三级三级| 国产视频一区二区三区在线观看| 亚洲激情网站免费观看| 国产精品综合一区二区三区| 欧美日韩精品免费| 中文字幕不卡三区| 美女mm1313爽爽久久久蜜臀| 色婷婷久久综合| 久久综合久久综合久久综合| 亚洲mv在线观看| 99久久er热在这里只有精品15 | 国产精品成人免费| 久久精品72免费观看| 一本一道久久a久久精品综合蜜臀| 日韩欧美国产综合| 亚洲国产精品一区二区久久| 成人高清免费观看| 26uuu亚洲综合色| 天堂精品中文字幕在线| 99久久精品免费看国产| 久久精品视频在线免费观看 | 欧美日韩在线电影| 国产精品久久影院| 国产一本一道久久香蕉| 4438成人网| 一区二区三区加勒比av| av亚洲产国偷v产偷v自拍| 欧美成人一区二区三区| 亚洲成人午夜电影| 91蝌蚪国产九色| 国产精品日日摸夜夜摸av| 久久精品国内一区二区三区| 欧美猛男gaygay网站| 亚洲精品ww久久久久久p站 | 国产欧美日韩综合精品一区二区| 爽好久久久欧美精品| 欧洲人成人精品| 亚洲一区二区三区在线看| 99精品久久99久久久久| 国产精品久久久久久久久动漫| 国产一区二区三区不卡在线观看 | 丝袜亚洲另类欧美| 欧美日本不卡视频| 亚洲成av人影院| 欧美三级视频在线| 亚洲小说欧美激情另类| 色屁屁一区二区| 一区二区国产盗摄色噜噜| 成人高清免费在线播放| 国产精品成人免费| 91最新地址在线播放| 亚洲天堂av一区| 99riav一区二区三区| 最新成人av在线| 91欧美一区二区| 一区二区在线观看视频在线观看| 在线看日韩精品电影| 一区二区三区欧美| 欧美日韩aaa| 日本美女视频一区二区| 日韩区在线观看| 极品尤物av久久免费看| 国产亚洲视频系列| 成人免费va视频| 亚洲色图欧美激情| 欧美中文字幕久久| 亚洲国产乱码最新视频| 91精品久久久久久蜜臀| 国产综合色精品一区二区三区| 欧美国产一区二区| 99久久精品国产导航| 亚洲国产综合视频在线观看| 欧美一级夜夜爽| 国产福利一区二区三区| 亚洲欧洲国产日本综合| 欧美日本一区二区| 国精产品一区一区三区mba视频| 国产欧美日韩精品一区| 色婷婷综合久久久久中文| 丝袜美腿高跟呻吟高潮一区| 欧美刺激午夜性久久久久久久| 国产91丝袜在线播放九色| 亚洲色图在线视频| 在线电影一区二区三区| 国产成人一区在线| 亚洲黄色片在线观看| 欧美一级日韩不卡播放免费| 国产一区二区免费看| 亚洲日本免费电影| 日韩欧美的一区| 色综合久久综合中文综合网| 日韩国产在线观看一区| 国产日产欧美精品一区二区三区| 色婷婷久久一区二区三区麻豆| 男人的j进女人的j一区| 中文字幕永久在线不卡| 欧美精品一二三区| 成人午夜私人影院| 午夜欧美电影在线观看| 国产拍揄自揄精品视频麻豆| 欧美色图激情小说| 国产精品亚洲综合一区在线观看| 亚洲猫色日本管| 精品捆绑美女sm三区| 91色.com| 国产成人精品影视| 香港成人在线视频| 亚洲国产精品ⅴa在线观看| 欧美日韩国产综合视频在线观看| 国产成人精品综合在线观看| 视频在线观看一区二区三区| 国产精品色一区二区三区| 日韩写真欧美这视频| 欧美中文字幕一区二区三区| 国产成人av一区| 蜜桃av噜噜一区二区三区小说| 最好看的中文字幕久久| 亚洲精品一区二区三区四区高清| 欧美专区在线观看一区| www.欧美亚洲| 国产一区二三区好的| 日本少妇一区二区| 亚洲自拍欧美精品| 国产精品三级av在线播放| 欧美变态tickling挠脚心| 欧美精品777| 91蜜桃免费观看视频| 高清成人在线观看| 麻豆成人久久精品二区三区红| 亚洲在线一区二区三区| 国产精品乱子久久久久| 26uuu国产在线精品一区二区| 欧美日韩国产一级| 一本大道综合伊人精品热热| 国产黑丝在线一区二区三区| 另类欧美日韩国产在线| 视频一区欧美日韩| 性做久久久久久久久| 亚洲一线二线三线视频| 亚洲黄色小视频| 亚洲另类色综合网站| 欧美激情综合五月色丁香小说| 久久综合狠狠综合久久综合88| 91精品综合久久久久久| 欧美日韩高清不卡| 欧美色图第一页| 欧美三级电影在线看| 欧美日韩精品专区| 欧美日韩在线播放一区| 欧美精品久久99久久在免费线| 欧美日韩专区在线| 欧美视频在线观看一区二区|