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

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

?? ocrw.c

?? C51 USB1.1開發源碼及相關開發工具和文檔
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

   ocrw.c

Abstract:

   read/write io 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) 1996 Microsoft Corporation.  All Rights Reserved.


Revision History:

    5-4-96 : created

--*/

#define DRIVER

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

#include "usbdi.h"
#include "usbdlib.h"
#include "D12.h"
#include "d12irp.h"


//******************************************************************************
//
// D12_CompletionStop()
//
// IO Completion Routine which just stops further completion of the Irp
//
//******************************************************************************

NTSTATUS
D12_CompletionStop (
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp,
    IN PVOID            Context
    )
{
    return STATUS_MORE_PROCESSING_REQUIRED;
}

//******************************************************************************
//
// D12_GetCurrentFrame()
//
//******************************************************************************

ULONG
D12_GetCurrentFrame (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
{
    PDEVICE_EXTENSION           deviceExtension;
    PIO_STACK_LOCATION          nextStack;
    NTSTATUS                    ntStatus;
    struct _URB_GET_CURRENT_FRAME_NUMBER urb;

    deviceExtension   = DeviceObject->DeviceExtension;

    // Initialize the URB
    //
    urb.Hdr.Function = URB_FUNCTION_GET_CURRENT_FRAME_NUMBER;
    urb.Hdr.Length   = sizeof(urb);
    urb.FrameNumber = (ULONG)-1;

    // Set the IRP parameters to pass the URB down the stack
    //
    nextStack = IoGetNextIrpStackLocation(Irp);

    nextStack->Parameters.Others.Argument1 = &urb;

    nextStack->Parameters.DeviceIoControl.IoControlCode = 
        IOCTL_INTERNAL_USB_SUBMIT_URB;                    

    nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;

    // Since this Irp is borrowed for URB_FUNCTION_GET_CURRENT_FRAME_NUMBER
    // before it is passed down later for the real URB request after this
    // routine returns, set a completion routine which stop further completion
    // of the Irp.
    //
    IoSetCompletionRoutine(
        Irp,
        D12_CompletionStop,
        NULL,   // Context
        TRUE,   // InvokeOnSuccess
        TRUE,   // InvokeOnError
        TRUE    // InvokeOnCancel
        );

    // Now pass the Irp down the stack
    //
    ntStatus = IoCallDriver(
                   deviceExtension->TopOfStackDeviceObject, 
                   Irp
                   );

    // Don't need to wait for completion because JD guarantees that
    // URB_FUNCTION_GET_CURRENT_FRAME_NUMBER will never return STATUS_PENDING

    return urb.FrameNumber;
}


//******************************************************************************
//
// D12_BuildIsoRequest()
//
//******************************************************************************

PURB
D12_BuildIsoRequest(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PD12_PIPE PipeHandle,
    IN BOOLEAN Read
    )
/*++

Routine Description:

Arguments:

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

    Irp -

    PipeHandle -

Return Value:

    initialized async urb.

--*/
{
    ULONG siz;
    ULONG length, packetSize, numPackets, i;
    PURB urb = NULL;
    PIO_STACK_LOCATION irpSp;
    LARGE_INTEGER byteOffset;

    irpSp = IoGetCurrentIrpStackLocation(Irp);

    D12_KdPrint (("D12TEST.SYS: handle = 0x%x\n", PipeHandle));

    length = MmGetMdlByteCount(Irp->MdlAddress);

    D12_KdPrint (("D12TEST.SYS: length = 0x%x\n", length));

    byteOffset = irpSp->Parameters.Read.ByteOffset;

    D12_KdPrint (("D12TEST.SYS: offset = 0x%08X.%08X\n",
                     byteOffset.HighPart,
                     byteOffset.LowPart));

    packetSize = PipeHandle->PipeInfo->MaximumPacketSize;
    numPackets = length/packetSize;
    if (numPackets*packetSize < length) {
        numPackets++;
    }

    siz = GET_ISO_URB_SIZE(numPackets);
    urb = ExAllocatePool(NonPagedPool, siz);

    D12_KdPrint (("D12TEST.SYS: siz = 0x%x urb 0x%x\n", siz, urb));

    if (urb) {
        RtlZeroMemory(urb, siz);

        urb->UrbIsochronousTransfer.Hdr.Length = (USHORT) siz;
        urb->UrbIsochronousTransfer.Hdr.Function =
                    URB_FUNCTION_ISOCH_TRANSFER;
        urb->UrbIsochronousTransfer.PipeHandle =
                   PipeHandle->PipeInfo->PipeHandle;
        urb->UrbIsochronousTransfer.TransferFlags =
            Read ? USBD_TRANSFER_DIRECTION_IN : 0;

        urb->UrbIsochronousTransfer.TransferBufferMDL =
            Irp->MdlAddress;
        urb->UrbIsochronousTransfer.TransferBufferLength =
            length;

        if (byteOffset.HighPart)
        {
            urb->UrbIsochronousTransfer.StartFrame =
                D12_GetCurrentFrame(DeviceObject, Irp) +
                byteOffset.LowPart;
        }
        else
        {
            // start sending/receiving right away
            urb->UrbIsochronousTransfer.TransferFlags |=
                USBD_START_ISO_TRANSFER_ASAP;
        }

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

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

        D12_KdPrint (("D12TEST.SYS: Init iso urb Length = 0x%x buf = 0x%x\n",
            urb->UrbIsochronousTransfer.TransferBufferLength,
            urb->UrbIsochronousTransfer.TransferBuffer));
    }

    D12_KdPrint (("D12TEST.SYS: exit D12_BuildIsoRequest\n"));

    return urb;
}


PURB
D12_BuildAsyncRequest(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PD12_PIPE PipeHandle,
    IN BOOLEAN Read
    )
/*++

Routine Description:

Arguments:

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

    Irp -

    PipeHandle -

Return Value:

    initialized async urb.

--*/
{
    ULONG siz;
    ULONG length;
    PURB urb = NULL;

    D12_KdPrint (("D12TEST.SYS: handle = 0x%x\n", PipeHandle));

    length = MmGetMdlByteCount(Irp->MdlAddress);

    D12_KdPrint (("D12TEST.SYS: length = 0x%x\n", length));

    siz = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
    urb = ExAllocatePool(NonPagedPool, siz);

    D12_KdPrint (("D12TEST.SYS: siz = 0x%x urb 0x%x\n", siz, urb));

    if (urb) {
        RtlZeroMemory(urb, siz);

        urb->UrbBulkOrInterruptTransfer.Hdr.Length = (USHORT) siz;
        urb->UrbBulkOrInterruptTransfer.Hdr.Function =
                    URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
        urb->UrbBulkOrInterruptTransfer.PipeHandle =
                   PipeHandle->PipeInfo->PipeHandle;
        urb->UrbBulkOrInterruptTransfer.TransferFlags =
            Read ? USBD_TRANSFER_DIRECTION_IN : 0;

        // short packet is not treated as an error.
        urb->UrbBulkOrInterruptTransfer.TransferFlags |= 
            USBD_SHORT_TRANSFER_OK;            
                
        //
        // no linkage for now
        //

        urb->UrbBulkOrInterruptTransfer.UrbLink = NULL;

        urb->UrbBulkOrInterruptTransfer.TransferBufferMDL =
            Irp->MdlAddress;
        urb->UrbBulkOrInterruptTransfer.TransferBufferLength =
            length;

        D12_KdPrint (("D12TEST.SYS: Init async urb Length = 0x%x buf = 0x%x\n",
            urb->UrbBulkOrInterruptTransfer.TransferBufferLength,
            urb->UrbBulkOrInterruptTransfer.TransferBuffer));
    }

    D12_KdPrint (("D12TEST.SYS: exit D12_BuildAsyncRequest\n"));

    return urb;
}


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

Routine Description:


Arguments:

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

    Irp - Irp completed.

    Context - Driver defined context.

Return Value:

    The function value is the final status from the operation.

--*/
{
    NTSTATUS			ntStatus = STATUS_SUCCESS;
    PURB				urb;
    PD12_RW_CONTEXT  context = Context;
    PD12_PIPE		pipeHandle;
    PFILE_OBJECT		fileObject;
    PIO_STACK_LOCATION	irpStack;
    PDEVICE_OBJECT      deviceObject;

    if (Irp->PendingReturned) {
        IoMarkIrpPending(Irp);
    }

    urb = context->Urb;
    deviceObject = context->DeviceObject;

	D12_RemovePendingIrp(deviceObject, Irp);

    D12_KdPrint (("D12TEST.SYS: Async Completion: Length 0x%08X, Status 0x%08X\n",
                     urb->UrbBulkOrInterruptTransfer.TransferBufferLength,
                     urb->UrbHeader.Status));

    //
    // set the length based on the TransferBufferLength
    // value in the URB
    //
    Irp->IoStatus.Information =
        urb->UrbBulkOrInterruptTransfer.TransferBufferLength;

    irpStack = IoGetCurrentIrpStackLocation (Irp);
    fileObject = irpStack->FileObject;

	// get pipe handle
	pipeHandle = fileObject->FsContext;


    D12_DecrementIoCount(deviceObject);                       

    ExFreePool(context);
    ExFreePool(urb);

    return ntStatus;
}


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

Routine Description:


Arguments:

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

    Irp - Irp completed.

    Context - Driver defined context.

Return Value:

    The function value is the final status from the operation.

--*/
{
    NTSTATUS			ntStatus = STATUS_SUCCESS;
    PURB				urb = Context;
    PD12_PIPE		pipeHandle;
    PFILE_OBJECT		fileObject;
    PIO_STACK_LOCATION	irpStack;
    ULONG               i;

    if (Irp->PendingReturned) {
        IoMarkIrpPending(Irp);
    }

    //
    // BUGBUG check here for interesting iso error conditions
    //
    D12_KdPrint (("D12TEST.SYS: Iso Completion: StartFrame 0x%08X, Status 0x%08X\n",
                     urb->UrbIsochronousTransfer.StartFrame,
                     urb->UrbHeader.Status));

    for (i=0; i< urb->UrbIsochronousTransfer.NumberOfPackets; i++)
    {
        D12_KdPrint (("D12TEST.SYS: [%02d] Length 0x%08X, Status 0x%08X\n",
                         i,
                         urb->UrbIsochronousTransfer.IsoPacket[i].Length,
                         urb->UrbIsochronousTransfer.IsoPacket[i].Status
                        ));
    }

    //
    // set the length based on the TransferBufferLength
    // value in the URB
    //
    Irp->IoStatus.Information =
        urb->UrbBulkOrInterruptTransfer.TransferBufferLength;

    irpStack = IoGetCurrentIrpStackLocation (Irp);
    fileObject = irpStack->FileObject;

	// get pipe handle
	pipeHandle = fileObject->FsContext;

    D12_DecrementIoCount(DeviceObject);                       

    ExFreePool(urb);

    return ntStatus;
}


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

Routine Description:

Arguments:

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


Return Value:

    NT status code

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成av人片www| 成人免费视频在线观看| 99精品桃花视频在线观看| 日韩不卡手机在线v区| 亚洲国产日韩a在线播放| 中文字幕一区二区三区不卡在线 | 成人激情文学综合网| 日本在线不卡视频一二三区| 亚洲午夜久久久久中文字幕久| 国产精品美女久久久久久2018 | 在线成人av网站| 91久久久免费一区二区| eeuss鲁片一区二区三区在线观看| 精品亚洲国产成人av制服丝袜| 久久国产精品色| 国产中文字幕一区| 粉嫩av一区二区三区粉嫩| 成人少妇影院yyyy| 一本大道av一区二区在线播放 | 国产精品久久久久久亚洲伦| 国产片一区二区三区| 国产精品剧情在线亚洲| 亚洲三级视频在线观看| 亚洲美女屁股眼交3| 亚洲国产成人精品视频| 蜜桃视频在线观看一区| 麻豆精品视频在线观看免费| 久久99精品一区二区三区| 国产成人精品在线看| 91麻豆123| 欧美视频中文字幕| 日韩欧美一区在线| 中文在线免费一区三区高中清不卡| 国产精品女人毛片| 亚洲成av人**亚洲成av**| 久久精品久久99精品久久| 国产成人综合精品三级| 不卡的电视剧免费网站有什么| 91小视频在线| 欧美一级日韩免费不卡| 久久久久国产免费免费| 亚洲四区在线观看| 天堂va蜜桃一区二区三区漫画版| 精品一区二区三区在线观看国产| 国产91精品免费| 欧美三级一区二区| 欧美不卡一二三| 国产精品午夜在线| 日韩精品视频网| hitomi一区二区三区精品| 欧美色国产精品| 欧美国产一区二区| 婷婷综合久久一区二区三区| 国产精品一二二区| 欧美精品1区2区3区| 中国av一区二区三区| 婷婷久久综合九色国产成人| 国产mv日韩mv欧美| 91精品国产欧美一区二区| 国产精品久久久久aaaa樱花| 日本一区中文字幕| 日本高清不卡视频| 国产欧美一区二区精品性色| 午夜精品爽啪视频| 色综合久久99| 中文字幕第一区二区| 久久99精品一区二区三区| 欧美日韩精品专区| 亚洲最新在线观看| 成人一级黄色片| 精品久久久久久久久久久久久久久久久 | 亚洲色图欧美在线| 日韩1区2区3区| 97久久超碰国产精品| 久久久久久久久伊人| 奇米一区二区三区av| 欧美系列日韩一区| 亚洲欧美在线视频| 国产一区二区三区| 日韩美女一区二区三区| 午夜欧美视频在线观看| 一本色道亚洲精品aⅴ| 中文一区在线播放| 国产成人免费在线观看| 久久精品一区二区三区四区| 久久99精品久久久久久国产越南| 91精品国产一区二区三区蜜臀 | 色婷婷综合久久久久中文一区二区| 欧美国产一区二区| 成人性色生活片免费看爆迷你毛片| 久久精品一区四区| 国产一区二区三区在线观看精品 | 国产视频911| 国产盗摄一区二区三区| 国产亚洲欧美日韩在线一区| 国产在线麻豆精品观看| 久久久久一区二区三区四区| 国产在线精品一区在线观看麻豆| 精品播放一区二区| 国产成人免费视频一区| 国产欧美一区二区三区鸳鸯浴 | 91极品视觉盛宴| 亚洲一区二区视频在线| 欧美日韩久久不卡| 美女视频黄久久| 精品国产伦一区二区三区免费| 国内一区二区视频| 国产精品毛片久久久久久| caoporm超碰国产精品| 亚洲欧洲综合另类| 欧美一区二区三区公司| 韩国成人在线视频| 国产精品色一区二区三区| 成人午夜短视频| 一区二区国产盗摄色噜噜| 欧美亚洲国产一区二区三区va | 国产一区二区福利| 国产精品免费视频一区| 在线观看不卡一区| 日韩电影一区二区三区| 久久婷婷色综合| 91麻豆精品一区二区三区| 日韩av中文字幕一区二区 | 中文欧美字幕免费| 欧美日韩精品系列| 国产精品一区二区久激情瑜伽| 日韩毛片一二三区| 91精品国产全国免费观看| 成人一道本在线| 天天综合日日夜夜精品| 国产亚洲成av人在线观看导航| 91视频精品在这里| 久久精品国产亚洲高清剧情介绍| 欧美激情一二三区| 日韩一区二区在线观看视频| 成人网在线播放| 日韩精品国产欧美| 中文字幕视频一区二区三区久| 欧美日韩一区二区三区四区五区| 九九**精品视频免费播放| 亚洲人成在线观看一区二区| 日韩欧美123| 欧美日韩在线直播| 丁香亚洲综合激情啪啪综合| 日韩av电影天堂| 亚洲伦理在线精品| 欧美国产乱子伦| 欧美一区二区播放| 欧洲亚洲国产日韩| 成人晚上爱看视频| 国产麻豆视频精品| 视频一区免费在线观看| 亚洲人成精品久久久久| 国产拍欧美日韩视频二区| 日韩西西人体444www| 在线免费观看日本一区| 99久久精品免费| 国产精品羞羞答答xxdd| 人禽交欧美网站| 亚洲v中文字幕| 亚洲1区2区3区视频| 亚洲欧美激情在线| 亚洲欧洲精品天堂一级| 久久精品免视看| 2021中文字幕一区亚洲| 欧美二区在线观看| 欧美影院精品一区| 一本到高清视频免费精品| 99精品视频在线观看免费| 国产不卡在线一区| 成人白浆超碰人人人人| 国产精品99久久久久久宅男| 国产在线精品一区二区三区不卡| 美女视频免费一区| 美国十次综合导航| 蜜桃视频一区二区| 九一九一国产精品| 国产美女久久久久| 国产在线看一区| 国产成人啪午夜精品网站男同| 极品少妇xxxx精品少妇| 久草这里只有精品视频| 国产精品 日产精品 欧美精品| 国产在线一区二区| 懂色av噜噜一区二区三区av| 成人高清视频在线观看| 91在线播放网址| 91久久精品一区二区三区| 欧美日韩aaa| 日韩一级免费观看| 久久新电视剧免费观看| 久久这里只有精品6| 国产欧美日韩精品在线| 亚洲欧美在线视频| 午夜不卡av免费| 久久精品国产精品青草| www.av亚洲| 欧美日韩一区二区在线视频| 欧美一区二区三区日韩视频| 日韩精品一区二区三区四区|