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

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

?? isostrm.c

?? 該代碼是基于S3C2410處理器上USB的驅動程序代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

   IsoStrm.c

Abstract:

    Isochronous USB device driver for Intel 82930 USB test board
    Isochronous stream test code

Environment:

    kernel mode only

Notes:

  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  PURPOSE.

  Copyright (c) 1997-1998 Microsoft Corporation.  All Rights Reserved.


Revision History:

    7/7/98 : created

--*/


#include "wdm.h"
#include "stdarg.h"
#include "stdio.h"

#define DRIVER

#include "usbdi.h"
#include "usbdlib.h"
#include "Iso82930.h"





NTSTATUS
IsoUsb_ProcessTransfer(
    IN PISOUSB_TRANSFER_OBJECT TransferObject
    )
/*++

Routine Description:
	This is where a real driver would process the data from the Iso transfer in some way;
	In this sample all we do is check the IRP status from the OS and the URB status
	from USBD

Arguments:

Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus;
	USBD_STATUS usbdStatus;
    PIRP irp;
	PURB urb;
    PISOUSB_STREAM_OBJECT StreamObject;
    ULONG i;

    irp = TransferObject->Irp;
    StreamObject = TransferObject->StreamObject;
    urb = TransferObject->Urb;
    ntStatus = irp->IoStatus.Status;

    //
    // check the irp
    //

    if (!NT_SUCCESS(ntStatus)) {
        ISOUSB_KdPrint (DBGLVL_MEDIUM,(" IsoUsb_ProcessTransfer() **BAD Iso IRP status = 0x%x\n", ntStatus));

        ISOUSB_Trap(DBGLVL_MAXIMUM);
    }
	else {
        ISOUSB_KdPrint (DBGLVL_MAXIMUM,(" IsoUsb_ProcessTransfer() Good Iso IRP status = 0x%x\n", ntStatus));
	}


    //
    // now check the urb header
    //
	usbdStatus = urb->UrbHeader.Status;

    if (!USBD_SUCCESS(usbdStatus)) {
        ISOUSB_KdPrint (DBGLVL_MEDIUM,(" IsoUsb_ProcessTransfer() **BAD URB  HEADER USBD_STATUS status = 0x%x\n", usbdStatus));

        ISOUSB_Trap(DBGLVL_MAXIMUM);
    }
	else {
        ISOUSB_KdPrint (DBGLVL_MAXIMUM,(" IsoUsb_ProcessTransfer() Good URB HEADER USBD_STATUS status = 0x%x\n", usbdStatus));
	}


    // check the Urb packets
    for (i=0; i< urb->UrbIsochronousTransfer.NumberOfPackets; i++)
    {

        StreamObject->TotalPacketsProcessed++;

        if (!USBD_SUCCESS( urb->UrbIsochronousTransfer.IsoPacket[i].Status)) {

            ISOUSB_KdPrint (  DBGLVL_MEDIUM , (" IsoUsb_ProcessTransfer() BAD PACKET USBD STATUS  [%02d] Length 0x%08X, Status 0x%08X\n",
                             i,
                             urb->UrbIsochronousTransfer.IsoPacket[i].Length,
                             urb->UrbIsochronousTransfer.IsoPacket[i].Status
                            ));
            ntStatus =  STATUS_UNSUCCESSFUL; // set  error return code

            StreamObject->ErrorPacketCount++;
        }
        else {
            // Successfull;
            // Note that here is the place we would  do any data processing/copying to frame
            // buffers, for example , if we were a video capture device, etc ...

            StreamObject->TotalBytesProcessed += urb->UrbIsochronousTransfer.IsoPacket[i].Length;
        }

    }


    return ntStatus;
}


NTSTATUS
IsoUsb_InitializeStreamUrb(
    IN PDEVICE_OBJECT DeviceObject,
    IN PISOUSB_TRANSFER_OBJECT TransferObject
    )
/*++

Routine Description:

Arguments:

Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    ULONG siz;
    ULONG packetSize, numPackets, maxXferSize, i;
    PURB urb;
    PISOUSB_STREAM_OBJECT streamObject = TransferObject->StreamObject;

    urb = TransferObject->Urb;

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

    siz = GET_ISO_URB_SIZE(numPackets);

    ISOUSB_KdPrint (DBGLVL_MAXIMUM,("IsoUsb_InitializeStreamUrb() siz = 0x%x urb 0x%x\n", siz, urb));

    RtlZeroMemory(urb, siz);

    urb->UrbIsochronousTransfer.Hdr.Length = (USHORT) siz;
    urb->UrbIsochronousTransfer.Hdr.Function =
                URB_FUNCTION_ISOCH_TRANSFER;
    urb->UrbIsochronousTransfer.PipeHandle =
               streamObject->PipeInfo->PipeHandle;

	// We are reading from the device
    urb->UrbIsochronousTransfer.TransferFlags = USBD_TRANSFER_DIRECTION_IN;

	// A device will always use either TransferBufferMDL or TransferBuffer, NEVER both
    urb->UrbIsochronousTransfer.TransferBufferMDL = NULL;
    urb->UrbIsochronousTransfer.TransferBuffer = TransferObject->DataBuffer;

    urb->UrbIsochronousTransfer.TransferBufferLength =
        numPackets * packetSize;

    // start sending/receiving right away
    urb->UrbIsochronousTransfer.TransferFlags |=
            USBD_START_ISO_TRANSFER_ASAP;

    urb->UrbIsochronousTransfer.NumberOfPackets = numPackets;
    urb->UrbIsochronousTransfer.UrbLink = 0;

    for (i=0; i< urb->UrbIsochronousTransfer.NumberOfPackets; i++) {
        urb->UrbIsochronousTransfer.IsoPacket[i].Offset
                    = i * packetSize;
    }

    ISOUSB_KdPrint (DBGLVL_MAXIMUM,(" Init Stream iso urb Length = 0x%x buf = 0x%x\n",
        urb->UrbIsochronousTransfer.TransferBufferLength,
        urb->UrbIsochronousTransfer.TransferBuffer));

    return ntStatus;
}


NTSTATUS
IsoUsb_StartTransfer(
    IN PDEVICE_OBJECT DeviceObject,
    IN PISOUSB_STREAM_OBJECT StreamObject,
    IN ULONG Index
    )
/*++

Routine Description:

Arguments:

Return Value:

    nt status code

--*/
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    CCHAR stackSize;
    PDEVICE_EXTENSION deviceExtension;
    PISOUSB_TRANSFER_OBJECT transferObject;
    ULONG packetSize, numPackets, maxXferSize;

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

    ISOUSB_KdPrint (DBGLVL_MEDIUM,(" ENTER IsoUsb_StartTransfer() \n"));

    deviceExtension = DeviceObject->DeviceExtension;

    transferObject = ExAllocatePool(NonPagedPool, sizeof(ISOUSB_TRANSFER_OBJECT));

    if (transferObject) {
        PIRP irp;

        ISOUSB_KdPrint (DBGLVL_MEDIUM,(" TransferObject = %x \n", transferObject));
		RtlZeroMemory( transferObject,sizeof(ISOUSB_TRANSFER_OBJECT));

        StreamObject->TransferObjectList[Index] =
            transferObject;

        transferObject->StreamObject = StreamObject;

        stackSize = (CCHAR)(deviceExtension->TopOfStackDeviceObject->StackSize + 1);

        transferObject->Irp =
            irp = IoAllocateIrp(stackSize,
                                FALSE);

        transferObject->DataBuffer = ExAllocatePool(NonPagedPool,
                                                    numPackets *
                                                    StreamObject->PipeInfo->MaximumPacketSize);

        transferObject->Urb =
            ExAllocatePool(NonPagedPool, GET_ISO_URB_SIZE( numPackets ));

        if (transferObject->Urb && transferObject->DataBuffer) {

            PIO_STACK_LOCATION nextStack;
            NTSTATUS status;

            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

            //
            // submit the request
            //

            StreamObject->PendingIrps++;           // increment this stream's pending irp count
			IsoUsb_IncrementIoCount(DeviceObject); // also increment global pending IRP count

            status = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                                  irp);

        } else {
            ntStatus = STATUS_INSUFFICIENT_RESOURCES;

            if (transferObject->DataBuffer) {
                ExFreePool(transferObject->DataBuffer);
            }

            if (transferObject->Urb) {
                ExFreePool(transferObject->Urb);
            }

        }

    } else {
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

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

    return ntStatus;
}


NTSTATUS
IsoUsb_IsoIrp_Complete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
	IN PVOID Context
    )
/*++

Routine Description:

    This routine is called when the port driver completes an IRP.

Arguments:

    DeviceObject - Pointer to the device object for the class device.

    Irp - Irp completed.

	Context - Driver defined context, points to a transfer extension structure
    	for a pair of parallel iso requests.

Return Value:

    The function value is the final status from the operation.

--*/
{
    NTSTATUS status;
    PDEVICE_EXTENSION deviceExtension;
    PDEVICE_OBJECT deviceObject;
    PISOUSB_TRANSFER_OBJECT transferObject;
    PISOUSB_STREAM_OBJECT streamObject;
    PIO_STACK_LOCATION nextStack;


    transferObject = Context;
    streamObject = transferObject->StreamObject;
    deviceObject = streamObject->DeviceObject;
    deviceExtension = deviceObject->DeviceExtension;

    streamObject->PendingIrps--;           // Decrement this stream's pending irp count
	if ( !streamObject->PendingIrps ) {    // back to 0? signal no pending irps event
        KeSetEvent(&streamObject->NoPendingIrpEvent,
                   1,
                   FALSE);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
捆绑调教一区二区三区| 欧美日韩国产高清一区二区 | 亚洲日本韩国一区| 一区二区三区在线观看网站| 九九视频精品免费| 欧美日韩精品欧美日韩精品| 久久久久综合网| 日韩av一区二区三区| 91视频免费观看| 国产亚洲短视频| 秋霞国产午夜精品免费视频| 91成人在线精品| 中文字幕中文字幕一区二区| 国产自产v一区二区三区c| 欧美日韩国产精品成人| 亚洲乱码国产乱码精品精98午夜| 国产成人在线看| 精品日韩在线一区| 看片网站欧美日韩| 正在播放亚洲一区| 日日噜噜夜夜狠狠视频欧美人| 99精品国产视频| 国产精品免费aⅴ片在线观看| 国产一区二区不卡老阿姨| 91精品国产色综合久久不卡电影| 亚洲国产视频一区二区| 在线亚洲欧美专区二区| 一区二区欧美在线观看| 91蜜桃在线免费视频| 中文字幕视频一区二区三区久| 国产麻豆精品视频| 国产欧美一区二区在线| 粉嫩aⅴ一区二区三区四区五区 | 一本大道久久a久久综合婷婷| 国产日韩精品久久久| 狠狠狠色丁香婷婷综合久久五月| 日韩欧美在线一区二区三区| 日韩福利视频网| 日韩欧美在线网站| 韩国v欧美v亚洲v日本v| 国产人成亚洲第一网站在线播放| 粉嫩aⅴ一区二区三区四区五区| 中文字幕乱码亚洲精品一区 | 日本va欧美va欧美va精品| 在线播放视频一区| 老司机午夜精品99久久| 国产视频一区二区在线观看| 成人天堂资源www在线| 亚洲人成小说网站色在线| 欧美午夜在线观看| 久久99久久99小草精品免视看| 久久美女艺术照精彩视频福利播放| 国产精品69久久久久水密桃| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | www.日韩精品| 亚洲午夜久久久久| 一区二区三区在线播放| 欧美性一区二区| 日本91福利区| 国产精品日韩成人| 欧美日韩精品一区二区天天拍小说 | 日韩综合一区二区| 欧美精品一区二区三区很污很色的 | 色综合色狠狠综合色| 青青草国产精品97视觉盛宴| 国产色综合久久| 精品婷婷伊人一区三区三| 狠狠色丁香久久婷婷综合丁香| 亚洲人成影院在线观看| 欧美不卡一区二区三区| 91麻豆精东视频| 久久99这里只有精品| 日韩一区日韩二区| 日韩美女一区二区三区四区| 91视视频在线直接观看在线看网页在线看| 一区二区三区四区视频精品免费| 精品国产一二三区| 欧美体内she精高潮| 国产乱码精品一区二区三区忘忧草| 亚洲欧美另类综合偷拍| 精品毛片乱码1区2区3区| 日本韩国欧美在线| 成人小视频免费在线观看| 日本午夜一区二区| 亚洲男人的天堂在线观看| 久久久精品2019中文字幕之3| 欧美精品v国产精品v日韩精品| gogo大胆日本视频一区| 久久国产精品一区二区| 亚洲国产一区二区三区青草影视| 中文一区一区三区高中清不卡| 日韩精品中午字幕| 69堂成人精品免费视频| 91丨国产丨九色丨pron| 国产成人精品www牛牛影视| 美女视频第一区二区三区免费观看网站| 亚洲美女电影在线| 国产精品欧美一级免费| 26uuu精品一区二区三区四区在线| 欧美日韩在线不卡| 精品视频在线看| 在线免费观看视频一区| 日本韩国精品一区二区在线观看| 成人综合在线观看| 国产.精品.日韩.另类.中文.在线.播放 | 亚洲天堂2014| 国产精品网站导航| 亚洲国产高清在线| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美tk—视频vk| 日韩一级片在线观看| 91精品麻豆日日躁夜夜躁| 欧美日韩亚洲不卡| 欧美日韩精品欧美日韩精品一综合| 日本韩国一区二区三区视频| 91香蕉视频污在线| 99国产欧美另类久久久精品| 成人av免费在线| eeuss鲁片一区二区三区| www.综合网.com| 色综合久久久久网| 欧洲精品在线观看| 在线电影欧美成精品| 欧美一区二区三区视频免费播放| 51久久夜色精品国产麻豆| 51精品秘密在线观看| 欧美电影免费观看高清完整版| 日韩三级在线观看| 国产欧美日韩精品在线| 亚洲欧美日韩国产综合在线| 一区二区三区中文字幕精品精品| 亚洲国产精品嫩草影院| 天使萌一区二区三区免费观看| 麻豆国产欧美日韩综合精品二区| 狠狠色丁香九九婷婷综合五月 | 婷婷六月综合亚洲| 精品一区二区在线观看| 欧美成人精品3d动漫h| 欧美一卡二卡三卡四卡| 久久免费看少妇高潮| 亚洲摸摸操操av| 欧美a级理论片| 成人午夜视频福利| 欧美最新大片在线看| 日韩欧美一级二级三级久久久| 国产亚洲精品aa午夜观看| 亚洲伦理在线精品| 免费成人美女在线观看.| 国产高清不卡一区二区| 色悠久久久久综合欧美99| 日韩视频在线一区二区| 欧美激情一区二区三区全黄| 一片黄亚洲嫩模| 国产精品资源网| 欧美日韩国产不卡| 国产欧美日产一区| 日韩中文欧美在线| 成人污视频在线观看| 91精品国产一区二区人妖| 国产精品久久夜| 精一区二区三区| 91国偷自产一区二区三区观看| 精品福利一二区| 亚洲福利视频一区二区| 国产91精品久久久久久久网曝门| 欧美日韩极品在线观看一区| 国产精品麻豆网站| 久久99国产乱子伦精品免费| 欧美丝袜自拍制服另类| 国产精品美女久久久久aⅴ | 亚洲精品欧美专区| 国产成人综合亚洲网站| 91精品国产高清一区二区三区 | 欧美激情一区二区三区在线| 日韩av一区二区三区| 色av成人天堂桃色av| 国产欧美日韩卡一| 精品一区二区三区免费观看| 欧美视频在线一区| 亚洲你懂的在线视频| 高清久久久久久| 久久亚洲精品国产精品紫薇| 日韩国产一二三区| 欧美中文字幕久久 | 久久精品人人爽人人爽| 免费成人av资源网| 在线播放/欧美激情| 亚洲午夜在线电影| 在线观看成人免费视频| 最新高清无码专区| 高清久久久久久| 欧美国产精品v| 顶级嫩模精品视频在线看| 久久久久久久网| 国产成人三级在线观看| 久久久不卡网国产精品二区| 国产一区二区三区综合| 26uuu色噜噜精品一区| 国产一区二区福利| 久久久99精品久久|