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

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

?? rwusb.c

?? HomePNA的Usb網(wǎng)卡驅(qū)動(dòng)
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
/*++

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)

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久中文综合久久97| 欧美一级一区二区| 欧美一区二区在线视频| 中文字幕第一区综合| 亚洲mv在线观看| 97se亚洲国产综合自在线| 3atv在线一区二区三区| 一区二区高清视频在线观看| 国产一区二区h| 91精品国产综合久久久久久| 欧美国产乱子伦| 精品一二三四区| 欧美日韩精品二区第二页| 亚洲精品乱码久久久久久日本蜜臀| 久久99精品久久久| 91精品福利在线一区二区三区| 亚洲精品大片www| 99麻豆久久久国产精品免费优播| 久久免费的精品国产v∧| 青青草国产成人av片免费| 欧美视频一区在线| 亚洲亚洲人成综合网络| 91国产丝袜在线播放| 亚洲美女电影在线| 色哟哟亚洲精品| 自拍偷拍亚洲激情| av毛片久久久久**hd| 亚洲欧洲日韩在线| 成人高清在线视频| ...av二区三区久久精品| 亚洲免费观看高清完整版在线观看熊| 久久99在线观看| 国产精品1区2区| 欧美亚洲丝袜传媒另类| 最新日韩在线视频| 99久久精品国产精品久久| 国产精品丝袜久久久久久app| 国产一区在线观看视频| 国产亚洲制服色| 国产精品系列在线播放| 国产亚洲欧美日韩在线一区| 国产真实乱对白精彩久久| 国产亚洲欧洲997久久综合| 国产精品一区二区不卡| 欧美激情一区二区三区在线| 东方aⅴ免费观看久久av| 中文字幕欧美激情一区| 日本韩国一区二区| 奇米精品一区二区三区在线观看| 精品少妇一区二区三区日产乱码| 国产成人鲁色资源国产91色综| 日本一区二区电影| 色综合av在线| 日本不卡一区二区三区| 久久久久久97三级| 一本久久a久久免费精品不卡| 亚洲国产毛片aaaaa无费看| 91精品国产综合久久久久久漫画| 国产一区欧美日韩| 亚洲欧洲精品天堂一级| 欧美三级电影网| 国产一区二区三区视频在线播放| 国产精品嫩草久久久久| 欧美色精品在线视频| 狠狠v欧美v日韩v亚洲ⅴ| 中文字幕在线不卡视频| 欧美高清一级片在线| 国产精品亚洲人在线观看| 亚洲欧美区自拍先锋| 精品女同一区二区| 91看片淫黄大片一级在线观看| 亚洲成人1区2区| 国产精品欧美经典| 欧美巨大另类极品videosbest | 中文字幕的久久| 欧亚一区二区三区| 国产精品一线二线三线精华| 亚洲国产欧美另类丝袜| 国产精品美女久久福利网站| 欧美一区二区啪啪| 91免费精品国自产拍在线不卡| 奇米888四色在线精品| 亚洲欧美日韩国产中文在线| 久久久久久久综合| 日韩一级免费观看| 在线精品视频小说1| 国产91色综合久久免费分享| 日本欧美一区二区三区乱码| 依依成人精品视频| 国产精品你懂的在线欣赏| 欧美一区二区成人| 欧美天堂一区二区三区| 99久久综合色| 国产91色综合久久免费分享| 久久91精品久久久久久秒播| 午夜精品影院在线观看| 亚洲精品国产成人久久av盗摄| 精品动漫一区二区三区在线观看| 欧美日韩国产综合草草| 91国偷自产一区二区三区成为亚洲经典| 激情五月激情综合网| 美日韩一区二区三区| 亚洲成a人片在线不卡一二三区 | 不卡av在线免费观看| 国产美女视频一区| 奇米影视7777精品一区二区| 天天综合日日夜夜精品| 亚洲成人tv网| 天天影视色香欲综合网老头| 亚洲不卡av一区二区三区| 玉米视频成人免费看| 亚洲丝袜制服诱惑| 自拍视频在线观看一区二区| 亚洲欧洲日本在线| 亚洲精品一二三区| 亚洲国产一区二区三区青草影视 | 94-欧美-setu| 99久久99久久精品国产片果冻 | 麻豆成人久久精品二区三区红| 婷婷六月综合亚洲| 蜜桃一区二区三区在线观看| 蜜臂av日日欢夜夜爽一区| 另类欧美日韩国产在线| 精品一区二区影视| 国产乱码一区二区三区| 大桥未久av一区二区三区中文| 成人av免费网站| 色综合久久66| 欧美疯狂做受xxxx富婆| 欧美成人三级在线| 国产精品免费久久久久| 亚洲天堂网中文字| 亚洲高清免费观看| 裸体歌舞表演一区二区| 国产电影一区二区三区| 91麻豆.com| 91精品国产综合久久香蕉的特点 | 国产精品乱码一区二三区小蝌蚪| 欧美激情一二三区| 一区二区三区鲁丝不卡| 美女脱光内衣内裤视频久久影院| 黄页视频在线91| 91在线视频网址| 日韩欧美精品在线视频| 欧美激情在线看| 日韩影院精彩在线| 国产成人午夜片在线观看高清观看| 91视频免费看| 日韩亚洲欧美在线| 亚洲欧洲精品一区二区三区不卡| 丝袜亚洲另类欧美| 国产91在线|亚洲| 欧美日韩大陆一区二区| 久久亚洲精精品中文字幕早川悠里 | 亚洲成人资源在线| 国产成人综合精品三级| 精品视频123区在线观看| 26uuu精品一区二区三区四区在线| 亚洲天天做日日做天天谢日日欢 | 欧美一级久久久久久久大片| 国产精品妹子av| 奇米四色…亚洲| 色综合久久久久综合| 久久综合丝袜日本网| 亚洲电影在线播放| fc2成人免费人成在线观看播放| 欧美一级黄色录像| 亚洲精品日韩一| 国产成人在线看| 欧美一区二区美女| 伊人婷婷欧美激情| 成人高清在线视频| 26uuu亚洲综合色| 亚洲成人av在线电影| 色婷婷综合久色| 国产精品久久久爽爽爽麻豆色哟哟| 日韩不卡在线观看日韩不卡视频| 99久久免费国产| 国产三级欧美三级日产三级99| 日韩国产欧美一区二区三区| 91日韩在线专区| 国产精品美女久久久久久久| 久久不见久久见免费视频7| 欧美日韩一区在线观看| 亚洲欧美一区二区三区久本道91| 精品制服美女久久| 日韩女优电影在线观看| 亚洲成人一区二区在线观看| 欧美在线视频不卡| 一区二区三区四区五区视频在线观看| 国产美女精品人人做人人爽| 欧美mv和日韩mv国产网站| 免费人成网站在线观看欧美高清| 欧美写真视频网站| 一区二区在线观看不卡| 91麻豆成人久久精品二区三区| 国产精品女同一区二区三区| 成人18视频在线播放| 国产精品白丝在线| 91在线国产观看|