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

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

?? rwusb.c

?? HomePNA的Usb網卡驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++

Copyright (c) 1999  Microsoft Corporation

Module Name:

   rwusb.c

Abstract:

    USB device driver .
    This module contains code pertaining to IRPS and URBS and USB, but no
    ndis-specific 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) 1999 Microsoft Corporation.  All Rights Reserved.


Revision History:


--*/


#include <ndis.h>
#include <ntdef.h>
#include <windef.h>

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

#include "debug.h"

#include "common.h"
#include "HPNA_2k.h"

/*****************************************************************************
*
*  Function:   InitializeReceive
*
*  Synopsis:   Initialize the receive functionality.
*
*  Arguments:  Deviceice - pointer to current usb device object
*
*  Returns:    NDIS_STATUS_SUCCESS   - if irp is successfully sent to USB
*                                      device object
*              NDIS_STATUS_RESOURCES - if mem can't be alloc'd
*              NDIS_STATUS_FAILURE   - otherwise
*
*  Algorithm:
*              1) Set the receive timeout to READ_INTERVAL_TIMEOUT_MSEC.
*              2) Initialize our rcvInfo and associate info for our
*                 receive state machine.
*              3) Build an IRP_MJ_READ irp to send to the USB device
*                 object, and set the completion(or timeout) routine
*                 to UsbIoCompleteRead.
*  Notes:
*
*  This routine must be called in IRQL PASSIVE_LEVEL.
*
*****************************************************************************/

NTSTATUS
InitializeReceive(
            IN PUSB_DEVICE Device
            )
{
    NTSTATUS        status = STATUS_SUCCESS;

    DEBUGMSG(DBG_FUNC, ("+InitializeReceive\n"));

    //
    // Create a thread to run at IRQL PASSIVE_LEVEL.
    //
    status =  PsCreateSystemThread(
                            &Device->hPassiveThread,
                            (ACCESS_MASK) 0L,
                            NULL,
                            NULL,
                            NULL,
                            PassiveLevelThread,
                            Device
                            );
    if (status != STATUS_SUCCESS)
    {
        DEBUGMSG(DBG_ERROR, ("PsCreateSystemThread PassiveLevelThread failed. Returned 0x%.8x\n", status));
        status = STATUS_INSUFFICIENT_RESOURCES;

        goto done;
    }
    //
    // Create a thread to run at IRQL PASSIVE_LEVEL to be always receiving.

    status =  PsCreateSystemThread(
                    &Device->hPollingThread,
                    (ACCESS_MASK) 0L,
                    NULL,
                    NULL,
                    NULL,
                    PollingThread,
                    Device
                    );

    if (status != STATUS_SUCCESS)
    {
        DEBUGMSG(DBG_ERROR, ("PsCreateSystemThread PollingThread failed. Returned 0x%.8x\n", status));

        status = STATUS_INSUFFICIENT_RESOURCES;
        goto done;

    }


    Device->fReceiving = TRUE;

done:
        return status;
}

NTSTATUS StartUsbRead(IN PUSB_DEVICE Device)
/*++

Routine Description:

    Allocates an irp and calls USBD.

Arguments:

    Device - Current usb device.

Return Value:

    STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver

--*/
{
    ULONG siz;
    ULONG length;
    PURB urb = NULL;
    PDEVICE_OBJECT urbTargetDev;
    PIO_STACK_LOCATION nextStack;
    NTSTATUS timeStat = STATUS_UNSUCCESSFUL;
    PMDL    mdl;
    PRCV_BUFFER pRecBuf;
    UINT Index;


    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

    siz = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
    length = MAX_PACKET_SIZE;

    // Find a free buffer and set the state to PENDING;
    pRecBuf = GetRcvBuf( Device, &Index, STATE_PENDING );
    if ( !pRecBuf)
    {
        //
        // no buffers available; drop it
        //
        timeStat = STATUS_UNSUCCESSFUL;

        goto done;
    }

    if( TRUE == Device->fPendingReadClearStall ) {

        timeStat = STATUS_UNSUCCESSFUL;
        goto done;
    }

    urb =  ((PURB) pRecBuf->Urb);


    // Build our URB for USBD

    NdisZeroMemory(urb, siz);

    ASSERT(Device->BulkInPipeHandle);

    //
    // Now that we have created the urb, we will send a
    // request to the USB device object.
    //

    KeClearEvent(&pRecBuf->Event);

    urbTargetDev = Device->pUsbDevObj;

    ASSERT(urbTargetDev);


    //
    // Now that we have created the urb, we will send a
    // request to the USB device object.
    //

    urbTargetDev = Device->pUsbDevObj;


    // make an irp sending to usbhub
    pRecBuf->Irp = IoAllocateIrp( (CCHAR)(Device->pUsbDevObj->StackSize +1), FALSE );


    if ( NULL == pRecBuf->Irp )
    {
        timeStat = STATUS_INSUFFICIENT_RESOURCES;
        goto done;
    }


    ((PIRP) pRecBuf->Irp)->IoStatus.Status = STATUS_NOT_SUPPORTED;
    ((PIRP) pRecBuf->Irp)->IoStatus.Information = 0;


    // Build our URB for USBD

    urb->UrbBulkOrInterruptTransfer.Hdr.Length = (USHORT) siz;
    urb->UrbBulkOrInterruptTransfer.Hdr.Function =
                URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
    urb->UrbBulkOrInterruptTransfer.PipeHandle =
               Device->BulkInPipeHandle;
    urb->UrbBulkOrInterruptTransfer.TransferFlags =
        USBD_TRANSFER_DIRECTION_IN ;

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

    //
    // not using linked urb's
    //
    urb->UrbBulkOrInterruptTransfer.UrbLink = NULL;

    urb->UrbBulkOrInterruptTransfer.TransferBufferMDL = NULL;

    urb->UrbBulkOrInterruptTransfer.TransferBuffer = pRecBuf->dataBuf;

    urb->UrbBulkOrInterruptTransfer.TransferBufferLength =length;


    //
    // Call the class driver to perform the operation.


    nextStack = IoGetNextIrpStackLocation( (PIRP) pRecBuf->Irp );

    ASSERT(nextStack != NULL);

    //
    // pass the URB to the USB driver stack
    //


    nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    nextStack->Parameters.Others.Argument1 = urb;
    nextStack->Parameters.DeviceIoControl.IoControlCode =
        IOCTL_INTERNAL_USB_SUBMIT_URB;


    IoSetCompletionRoutine(
                ((PIRP) pRecBuf->Irp),     // irp to use
                UsbIoCompleteRead,      // routine to call when irp is done
                pRecBuf,  // context to pass routine is the RCV_BUFFER
                TRUE,                      // call on success
                TRUE,                      // call on error
                TRUE);                     // call on cancel


    //
    // Call IoCallDriver to send the irp to the usb port.
    //
    UsbIncIoCount( Device ) ;
    
    timeStat = IoCallDriver(urbTargetDev, (PIRP) pRecBuf->Irp ); // Start UsbRead()

    DEBUGMSG(DBG_FUNC, (" StartUsbRead() after IoCallDriver () status = 0x%x\n", timeStat));

    ASSERT( STATUS_SUCCESS != timeStat );

    while ( timeStat != STATUS_SUCCESS ) { //we will always get to our completion routine, even if cancelled

        timeStat = MyKeWaitForSingleObject(
                       Device,
                       &pRecBuf->Event, //event to wait on
                       NULL,  //irp to cancel on halt/reset or timeout
                       10000 * 1000 * 1 );//1秒
    }

    ASSERT( NULL == pRecBuf->Irp ); // WIll be nulled by completion routine
done:
    if ( !pRecBuf || ( Device->RcvBuffersInUse >= (NUM_RCV_BUFS -2) ) )
	{
        /*if ( FALSE == Device->fIndicatedMediaBusy ) 
		{

            InterlockedExchange( &Device->fMediaBusy, TRUE );
            InterlockedExchange( &Device->fIndicatedMediaBusy, TRUE );
            IndicateMediaBusy( Device ); // indicate to Ndis  BUGBUG? NOT NEEDED HERE?
        }*/
       IndicateMediaBusy( Device ); // indicate to Ndis  BUGBUG? NOT NEEDED HERE?
	}

    return timeStat;
}



/*****************************************************************************
*
*  Function:   UsbIoCompleteRead
*
*  Synopsis:
*
*  Arguments:  pUsbDevObj - pointer to the  device object which
*                              completed the irp
*              pIrp          - the irp which was completed by the  device
*                              object
*              Context       - dev ext
*
*  Returns:    STATUS_MORE_PROCESSING_REQUIRED - allows the completion routine
*              (IofCompleteRequest) to stop working on the irp.
*
*  Algorithm:
*              This is the completion routine for all pending IRP_MJ_READ irps
*              sent to the  device object.
*
*              If there is a pending halt or reset, we exit the completion
*              routine without sending another irp to the USBl device object.
*
*
*              If the IRP_MJ_READ irp returned either STATUS_SUCCESS or
*              STATUS_TIMEOUT, we must process any data (stripping BOFs, ESC
*              sequences, and EOF) into an NDIS_BUFFER and NDIS_PACKET.
*
*              Another irp is then built (we just re-use the incoming irp) and
*              sent to the USB object with another IRP_MJ_READ
*              request.
*  Notes:
*
*  This routine is called (by the io manager) in IRQL DISPATCH_LEVEL.
*
*****************************************************************************/

NTSTATUS
UsbIoCompleteRead(
            IN PDEVICE_OBJECT pUsbDevObj,
            IN PIRP           pIrp,
            IN PVOID          Context
            )
{
    PUSB_DEVICE  device;
    NTSTATUS    status;
    ULONG_PTR    BytesRead;
    PRCV_BUFFER  pRecBuf;
    LARGE_INTEGER tat;

    DEBUGMSG(DBG_FUNC, ("+UsbIoCompleteRead\n"));

    //
    // The context given to IoSetCompletionRoutine is the receive buffer object
    //

    pRecBuf = (PRCV_BUFFER) Context;

    device = (PUSB_DEVICE) pRecBuf->device;

    ASSERT( pRecBuf->Irp == pIrp );

    ASSERT( NULL != device );



    if ((device->fPendingHalt  == TRUE) ||
        (device->fPendingReset == TRUE))
    {
        //
        // Set the fReceiving boolean so that the halt and reset routines
        // know when it is okay to continue.
        //
                    // change the below back to DBG_FUNC later?
        DEBUGMSG(DBG_FUNC, ("UsbIoCompleteRead  halt or reset pending setting fReceiving FALSE\n"));
        device->fReceiving = FALSE;


    }

    //
    // We have a number of cases:
    //      1) The USB read timed out and we received no data.
    //      2) The USB read timed out and we received some data.
    //      3) The USB read was successful and fully filled our irp buffer.
    //      4) The irp was cancelled.
    //      5) Some other failure from the USB device object.
    //


    status = pIrp->IoStatus.Status;

    //
    // IoCallDriver has been called on this Irp;
    // Set the length based on the TransferBufferLength
    // value in the URB
    //
    pIrp->IoStatus.Information =
         ((PURB) pRecBuf->Urb)->UrbBulkOrInterruptTransfer.TransferBufferLength;

    BytesRead = pIrp->IoStatus.Information;

    device->pCurrentRcvBuf = NULL;


    switch (status)
    {
        case STATUS_SUCCESS:

            if (BytesRead > 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美www视频| 欧美三级乱人伦电影| 欧美精品一区二区三区一线天视频 | 国产大片一区二区| 久久精品日产第一区二区三区高清版 | 9色porny自拍视频一区二区| 国产精品视频你懂的| 99久久精品国产观看| 一区二区三区加勒比av| yourporn久久国产精品| 亚洲欧美偷拍另类a∨色屁股| 91美女在线视频| 亚洲免费伊人电影| 777xxx欧美| 国产成人在线视频免费播放| 中文字幕一区二区不卡| 色综合久久66| 免费成人美女在线观看| 国产日韩欧美高清在线| 日本高清成人免费播放| 天天影视涩香欲综合网| 久久久一区二区三区捆绑**| 99视频有精品| 婷婷激情综合网| 久久精品综合网| 欧美性色黄大片| 韩国三级中文字幕hd久久精品| 国产精品久久久久久亚洲伦| 欧美日韩国产一级片| 国产91在线看| 亚洲一区在线观看网站| 精品国产一区二区亚洲人成毛片 | 最近中文字幕一区二区三区| 欧美日韩免费高清一区色橹橹| 毛片av一区二区| 国产日韩综合av| 欧美精品久久久久久久多人混战 | 欧美精品一区二区三区四区 | 一区二区三区.www| 久久综合一区二区| 欧美日韩一区二区欧美激情| 懂色av中文字幕一区二区三区| 亚洲一区二区三区四区在线观看 | 久久久久久久av麻豆果冻| 91免费观看在线| 九九视频精品免费| 亚洲国产精品久久不卡毛片| 国产日韩av一区二区| 欧美精品在线视频| 99久久精品国产导航| 黄色小说综合网站| 日韩综合小视频| 亚洲欧美电影一区二区| 国产清纯白嫩初高生在线观看91 | 亚洲视频一二区| 精品成人免费观看| 777午夜精品免费视频| 91麻豆国产自产在线观看| 国产在线不卡一区| 蜜臀av在线播放一区二区三区| 亚洲一区在线观看免费观看电影高清| 国产欧美日韩视频在线观看| 亚洲精品在线免费播放| 欧美一级搡bbbb搡bbbb| 欧美亚洲一区二区在线| 一本大道久久a久久综合| 成人激情午夜影院| 国产精品一区二区在线看| 日本aⅴ亚洲精品中文乱码| 亚洲国产精品综合小说图片区| 国产欧美日韩在线看| 久久精品一区二区| 久久久久久久久久久久久夜| 精品国产乱码久久久久久老虎 | 成人免费av在线| 国产一区二区在线视频| 久久国产精品99精品国产| 狂野欧美性猛交blacked| 视频一区二区三区入口| 午夜精品久久久久久久99水蜜桃| 亚洲一区二区三区中文字幕在线| 专区另类欧美日韩| 亚洲女与黑人做爰| 亚洲精品视频在线看| 亚洲欧美成人一区二区三区| 亚洲精品乱码久久久久久黑人| 亚洲图片另类小说| 亚洲精品网站在线观看| 午夜欧美视频在线观看| 日韩电影在线观看一区| 另类的小说在线视频另类成人小视频在线| 日韩国产一二三区| 国产一区在线视频| 福利电影一区二区| 色综合久久久久久久久久久| 在线免费不卡视频| 欧美一区二区三区视频免费| 久久婷婷国产综合精品青草| 欧美激情综合五月色丁香| 成人欧美一区二区三区黑人麻豆 | 国产尤物一区二区在线| 国产精品亚洲一区二区三区在线 | 精品一区中文字幕| 国产99一区视频免费| 91在线免费视频观看| 91久久精品一区二区三| 欧美一区二区三区在| 国产欧美日韩亚州综合| 亚洲国产成人av网| 老司机精品视频一区二区三区| 国产成人激情av| 欧美在线观看一区| 精品毛片乱码1区2区3区| 国产精品久久久久桃色tv| 亚洲成人av电影| 国产精品99久久久久久久vr| 91丨九色丨国产丨porny| 777a∨成人精品桃花网| 亚洲国产精品成人综合色在线婷婷| 一区二区成人在线| 国产美女一区二区| 在线观看国产精品网站| 欧美sm极限捆绑bd| 一区二区三区在线免费播放| 久草这里只有精品视频| 色8久久精品久久久久久蜜 | 在线观看一区日韩| 亚洲精品在线网站| 亚洲成av人**亚洲成av**| 粉嫩av亚洲一区二区图片| 777午夜精品视频在线播放| 中文字幕一区二区在线播放| 青青草成人在线观看| av不卡免费在线观看| 日韩精品一区二区三区视频在线观看| 国产精品国产精品国产专区不蜜| 日日夜夜一区二区| 日本精品一区二区三区高清| 国产午夜精品在线观看| 丝袜美腿亚洲色图| 一本大道久久a久久综合| 日本一区免费视频| 蜜臀精品一区二区三区在线观看| 91黄色激情网站| 国产精品免费av| 国内精品在线播放| 日韩亚洲欧美一区| 亚洲成人先锋电影| 色妹子一区二区| 国产精品久久毛片av大全日韩| 日本女优在线视频一区二区| 欧美一a一片一级一片| 综合色中文字幕| 成人h精品动漫一区二区三区| 精品少妇一区二区| 蜜桃传媒麻豆第一区在线观看| 欧美日韩国产高清一区二区| 一区二区三区在线视频观看58| 91在线观看地址| 亚洲欧洲精品成人久久奇米网| 国内精品伊人久久久久av一坑| 日韩午夜在线影院| 日韩av中文字幕一区二区三区| 欧美日韩免费视频| 亚洲自拍偷拍综合| 一本久久a久久免费精品不卡| 欧美激情中文字幕| 丁香婷婷深情五月亚洲| 国产午夜三级一区二区三| 国内精品久久久久影院一蜜桃| 精品三级在线看| 国产久卡久卡久卡久卡视频精品| 日韩欧美在线观看一区二区三区| 日韩中文字幕一区二区三区| 欧美精品乱码久久久久久| 婷婷亚洲久悠悠色悠在线播放| 欧美日韩一区二区不卡| 亚洲图片欧美色图| 欧美日韩免费视频| 日韩av在线发布| 精品国产免费人成在线观看| 另类小说色综合网站| 久久夜色精品国产噜噜av| 国产精品夜夜嗨| 成人免费一区二区三区在线观看 | 九一九一国产精品| 久久无码av三级| 波波电影院一区二区三区| 亚洲男人的天堂一区二区| 欧美视频一区二| 老色鬼精品视频在线观看播放| 久久嫩草精品久久久精品| 国产成人精品影视| 中文字幕在线不卡一区| 精品视频一区二区三区免费| 亚洲国产精品一区二区久久| 欧美一二三区在线| 处破女av一区二区| 亚洲高清三级视频| 欧美成人a视频|