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

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

?? rwusb.c

?? HomePNA的Usb網(wǎng)卡驅動
?? C
?? 第 1 頁 / 共 5 頁
字號:
    DEBUGMSG(DBG_ERR, ("  +ResetPipe()\n"));

    // Allocate URB for RESET_PIPE request
    //
    urb = MemAlloc( sizeof(struct _URB_PIPE_REQUEST));

    if (urb != NULL)
    {
#if 0
        NdisZeroMemory( urb, sizeof (struct _URB_PIPE_REQUEST) );

        DEBUGMSG(DBG_ERR, ("  ResetPipe before ABORT PIPE \n"));

        // Initialize ABORT_PIPE request URB
        //
        urb->UrbHeader.Length   = sizeof (struct _URB_PIPE_REQUEST);
        urb->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE;
        urb->UrbPipeRequest.PipeHandle = Pipe;

        ntStatus = CallUSBD(Device, urb);

        DEBUGCOND(DBG_ERR, !NT_SUCCESS(ntStatus),  ("  ResetPipe ABORT PIPE FAILED \n"));


        DEBUGMSG(DBG_ERR, ("  ResetPipe  before RESET_PIPE \n"));
#endif
        
        NdisZeroMemory( urb, sizeof (struct _URB_PIPE_REQUEST) );

        // Initialize RESET_PIPE request URB
        //
        urb->UrbHeader.Length   = sizeof (struct _URB_PIPE_REQUEST);
        urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE;
        urb->UrbPipeRequest.PipeHandle = (USBD_PIPE_HANDLE) Pipe;

        // Submit RESET_PIPE request URB
        //
        ntStatus = CallUSBD(Device, urb);

        DEBUGCOND(DBG_ERR, !NT_SUCCESS(ntStatus),  ("  ResetPipe RESET PIPE FAILED \n"));
        DEBUGCOND(DBG_ERR, NT_SUCCESS(ntStatus),  ("  ResetPipe RESET PIPE SUCCEEDED \n"));
        // Done with URB for RESET_PIPE request, free urb
        //
        ExFreePool(urb);
    }
    else
    {
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

    DEBUGMSG(DBG_ERR, ("  -ResetPipe %08X\n", ntStatus));
    
	return ntStatus;
}

NTSTATUS MyKeWaitForSingleObject(
    IN  PUSB_DEVICE     Device,
    IN  PVOID          EventWaitingFor,
    IN  OUT PIRP       IrpWaitingFor,
    LONGLONG           timeout100ns
)
/*++

Routine Description:

    Wait with a timeout in a loop
    so we will never hang if we are asked to halt/reset the driver while
    pollingthread is waiting for something.
    If input IRP is not null, also cancel it on timeout.

    NOTE: THIS FUNCTION MUST BE RE-ENTERABLE!

Return Value:

    NT status code
--*/
{
    NTSTATUS status = STATUS_SUCCESS;
    LARGE_INTEGER Timeout;
    BOOLEAN cancelResult;

    if ( timeout100ns )
	{   //if a non-zero timeout was passed in, use it
        Timeout.QuadPart = - ( timeout100ns );

    }
	else
	{
        Timeout.QuadPart = -10000 * 1000 * 3; // default to 3 second relative delay
    }


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


    status = KeWaitForSingleObject( //keep this as standard wait
               EventWaitingFor,
               Executive,//Suspended?Executive
               KernelMode,
               FALSE,
               &Timeout);

    if ( IrpWaitingFor && (status != STATUS_SUCCESS))
    {
        // if we get here we timed out and we were passed a PIRP to cancel
        cancelResult = IoCancelIrp( IrpWaitingFor );

        DEBUGCOND( DBG_FUNC, cancelResult,(" MyKeWaitForSingleObject successfully cancelled IRP (%x),cancelResult = %x\n",IrpWaitingFor, cancelResult));
        DEBUGCOND( DBG_ERR, !cancelResult,(" MyKeWaitForSingleObject FAILED to cancel IRP (%x),cancelResult = %x\n",IrpWaitingFor, cancelResult));
    }


    DEBUGCOND( DBG_OUT,( STATUS_TIMEOUT == status ),(" MyKeWaitForSingleObject TIMED OUT\n"));
    DEBUGCOND( DBG_OUT,( STATUS_ALERTED == status ),(" MyKeWaitForSingleObject ALERTED\n"));
    DEBUGCOND( DBG_OUT,( STATUS_USER_APC == status ),(" MyKeWaitForSingleObject USER APC\n"));

    DEBUGMSG( DBG_FUNC,(" -MyKeWaitForSingleObject  (%x)\n", status));
    return status;
}


/*****************************************************************************
*
*  Function:   PassiveLevelThread
*
*  Synopsis:   Thread running at IRQL PASSIVE_LEVEL.
*
*  Arguments:
*
*  Returns:
*
*
*
*  Any work item that can be called must be serialized.
*  i.e. when USBReset is called, NDIS will not make any other
*       requests of the miniport until NdisMResetComplete is called.
*
*****************************************************************************/

VOID
PassiveLevelThread(
            IN OUT PVOID Context
            )
{
    NTSTATUS    ntStatus;
    LARGE_INTEGER Timeout;
    int i;
    PUSB_WORK_ITEM pWorkItem;

    // every parameter used here is passed via Device.
    PUSB_DEVICE    Device = (PUSB_DEVICE) Context;

    DEBUGMSG(DBG_WARN, ("+PassiveLevelThread\n"));  // change to FUNC later?

    KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);

    Timeout.QuadPart = -10000 * 1000 * 3; // 3 second relative delay
    //notify this assert
	ASSERT(KeGetCurrentIrql()==PASSIVE_LEVEL);
    
	while ( !Device->fKillPassiveLevelThread )
    {

        //
        // The eventPassiveThread is an auto-clearing event, so
        // we don't need to reset the event.
        //

        ntStatus = KeWaitForSingleObject( //keep this as standard wait
                   &Device->EventPassiveThread,
                   Suspended,
                   KernelMode,
                   FALSE,
                   &Timeout);


        for (i = 0; i < NUM_WORK_ITEMS; i++ )
        {
            if ( Device->WorkItems[i].fInUse ) {

                Device->WorkItems[i].Callback(&(Device->WorkItems[i]));
            }
        }


    } // while !fKill

    DEBUGMSG(DBG_ERR, ("    PassiveLevelThread: HALT\n"));

    Device->hPassiveThread = NULL;

    DEBUGMSG(DBG_WARN, (" -PassiveLevelThread\n")); // change to FUNC later?
    PsTerminateSystemThread(STATUS_SUCCESS);

}

void DumpStatsEverySec( PUSB_DEVICE Device, UINT NumSeconds )
{

#if DBG  //disable unless really need it
    
    static LARGE_INTEGER LastStatTime = { 0 };
    LARGE_INTEGER        Now;
    LARGE_INTEGER         Elapsed;

    if ( 0 == LastStatTime.QuadPart ) {
        NdisGetCurrentSystemTime( &LastStatTime ); // init
    }

    NdisGetCurrentSystemTime( &Now );

    Elapsed = RtlLargeIntegerSubtract( Now, LastStatTime );

    if ( Elapsed.QuadPart >= ( NumSeconds * USB_100ns_PER_SEC ) ) {

        NdisGetCurrentSystemTime( &LastStatTime );


        DEBUGMSG( DBG_WARN,("\n   ****Dumping statistics every %d seconds\n",NumSeconds));
        DEBUGMSG( DBG_WARN,("    Total  packetsReceived = decimal %d\n",Device->packetsReceived));
        DEBUGMSG( DBG_WARN,("    packetsReceivedDropped = decimal %d\n",Device->packetsReceivedDropped));
        DEBUGMSG( DBG_WARN,("    packetsReceivedOverflow = decimal %d\n",Device->packetsReceivedOverflow));
        DEBUGMSG( DBG_WARN,("    packetsSent = decimal %d\n",Device->packetsSent));
        DEBUGMSG( DBG_WARN,("    packetsSentDropped = decimal %d\n",Device->packetsSentDropped));
        //DEBUGMSG( DBG_WARN,("    packetsHeldByProtocol = decimal %d\n",Device->packetsHeldByProtocol));
//        DEBUGMSG( DBG_WARN,("    MaxPacketsHeldByProtocol = decimal %d\n",Device->MaxPacketsHeldByProtocol));
//        DEBUGMSG( DBG_WARN,("    MaxLenSendList ever attained = decimal %d\n",Device->MaxLenSendList));
//        DEBUGMSG( DBG_WARN,("    NumTimesRcvListMaxedOut = decimal %d\n",Device->NumTimesRcvListMaxedOut));
//        DEBUGMSG( DBG_WARN,("    NumSendPacketsRejected = decimal %d\n",Device->NumSendPacketsRejected));
//        DEBUGMSG( DBG_WARN,("    #Times SendList que > 1 = decimal %d\n",Device->NumTimesLongerThan1));
//        DEBUGMSG( DBG_WARN,("    Total packet data errors = decimal %d\n",Device->NumDataErrors));
//        DEBUGMSG( DBG_WARN,("    Total bytes sent  = decimal %d\n",Device->TotalBytesSent ));
//        DEBUGMSG( DBG_WARN,("    Total bytes received  = decimal %d\n",Device->TotalBytesReceived ));
//        DEBUGMSG( DBG_WARN,("    NumYesQueryMediaBusyOids = decimal %d\n",Device->NumYesQueryMediaBusyOids));
//        DEBUGMSG( DBG_WARN,("    NumNoQueryMediaBusyOids = decimal %d\n",Device->NumNoQueryMediaBusyOids));
//        DEBUGMSG( DBG_WARN,("    NumSetMediaBusyOids = decimal %d\n",Device->NumSetMediaBusyOids));
//        DEBUGMSG( DBG_WARN,("    NumMediaBusyUsbHeaders = decimal %d\n",Device->NumMediaBusyUsbHeaders));
//        DEBUGMSG( DBG_WARN,("    NumMediaNotBusyUsbHeaders = decimal %d\n",Device->NumMediaNotBusyUsbHeaders));
//        DEBUGMSG( DBG_WARN,("    NumMediaBusyIndications = decimal %d\n",Device->NumMediaBusyIndications));
//        DEBUGMSG( DBG_WARN,("    NumPacketsSentRequiringTurnaroundTime = decimal %d\n",Device->NumPacketsSentRequiringTurnaroundTime));
//        DEBUGMSG( DBG_WARN,("    NumPacketsSentNotRequiringTurnaroundTime = decimal %d\n",Device->NumPacketsSentNotRequiringTurnaroundTime));

    }

#endif // DBG
}



/*****************************************************************************
*
*  Function:   PollingThread
*
*  Synopsis:   Thread running at IRQL PASSIVE_LEVEL.
*
*  Arguments: Device Extension
*
*  Returns:
*
*  Algorithm:  Call USBD for input data;
*
*  History:    dd-mm-yyyy   Author    Comment
* *
*  Notes:
*
*  USB reads are by nature 'Blocking', and when in a read, the device looks like it's
*  in a 'stall' condition, so we deliberately time out every second if we've gotten no data
*
*****************************************************************************/

VOID
PollingThread(
    IN PVOID Context
    )
{
    // every parameter used here is passed via device.
    PUSB_DEVICE    device = (PUSB_DEVICE) Context;
    NTSTATUS    Status;
    DEBUGMSG(DBG_WARN, (" +PollingThread\n"));  // change to FUNC later?


    while(!device->fKillPollingThread  )
    {
        if ( device->fReceiving )//Receivebuffer has been initialized

        {

            NTSTATUS ntStatus;
//在UsbCompleteRead中將device->pCurrentRcvBuf=pRcvBuf
            ntStatus = StartUsbRead(device);

            if ( NULL != device->pCurrentRcvBuf)
			{    // flag we were successful    
                 ProcessData(
                            device,
                            device->pCurrentRcvBuf
                            );  // BUGBUG EXPERIMENT?

                device->pCurrentRcvBuf = NULL;
            }

        } // end if

    } // end while

    DEBUGMSG(DBG_WARN, (" -PollingThread\n"));  // change to FUNC later?

    device->hPollingThread = NULL;
    // this thread will finish here
    // if the terminate flag is TRUE
    PsTerminateSystemThread(0);
}

BOOLEAN
InitWdmStuff(
            IN OUT PUSB_DEVICE Device
            )
{

    BOOLEAN fRes = TRUE;
    ULONGLONG thisContext;  //make ptr arithmetic 64-bit compatible
    PUSB_CONTEXT pCont;
    int i;

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

	ASSERT(KeGetCurrentIrql()==PASSIVE_LEVEL);
    //
    // Initialize a notification event for signalling PassiveLevelThread.
    //

    KeInitializeEvent(
                &Device->EventPassiveThread,
                SynchronizationEvent, // auto-clearing event
                FALSE                 // event initially non-signalled
                );


    KeInitializeEvent(
                &Device->EventUrb,
                NotificationEvent,    // non-auto-clearing event
                FALSE                 // event initially non-signalled
                );

    KeInitializeEvent(
                &Device->EventIoCtl,
                NotificationEvent,    // non-auto-clearing event
                FALSE                 // event initially non-signalled
                );
   
    ((PUSB_INFO) Device->pUsbInfo)->IrpSubmitUrb               = NULL;

    // set urblen to max possible urb size
    Device->UrbLen = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
    //Device->UrbLen = MAX( Device->UrbLen, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
    Device->UrbLen = MAX( Device->UrbLen, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST ));
    Device->UrbLen = MAX( Device->UrbLen, sizeof(struct _URB_SELECT_CONFIGURATION));

    // allocate our send context structs

    Device->pSendContexts = MemAlloc( NUM_SEND_CONTEXTS * sizeof( USB_CONTEXT ) );

    if ( NULL == Device->pSendContexts ) {

        fRes = FALSE;
        goto done;

    }
    
	NdisZeroMemory( Device->pSendContexts, NUM_SEND_CONTEXTS * sizeof( USB_CONTEXT ) );

    thisContext = (ULONGLONG) Device->pSendContexts;

    for ( i= 0; i < NUM_SEND_CONTEXTS; i++ ) //
	{
        pCont = (PUSB_CONTEXT) thisContext;

        pCont->DeviceObject = Device;

        pCont->Urb = MemAlloc(Device->UrbLen );

        if ( NULL == pCont->Urb )
        {
            DEBUGMSG(DBG_ERR, ("InitWdmStuff failed to alloc urb\n"));
            fRes = FALSE;
            goto done;
        }

        NdisZeroMemory( pCont->Urb, Device->UrbLen );

        pCont->fInUse = FALSE;

        pCont->Buffer = MemAlloc(MAX_PACKET_SIZE);                   

        if ( NULL == pCont->Buffer )
        {
            DEBUGMSG(DBG_ERR, ("InitWdmStuff failed to alloc info buf\n"));

            fRes = FALSE;
            goto done;
        }

        thisContext +=  sizeof(USB_CONTEXT );

    } // for

done:
    DEBUGMSG(DBG_FUNC, (" -InitWdmStuff\n"));
    
    return fRes;
}


VOID
FreeWdmStuff(
            IN OUT PUSB_DEVICE Device
            )
{
    ULONGLONG thisContext;  //make ptr arithmetic 64-bit compatible
    PUSB_CONTEXT pCont;

    int i;

    DEBUGMSG(DBG_FUNC, (" +

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩国产精品久久久久久亚洲| 91视频一区二区三区| 国产成人亚洲综合色影视| 一本色道亚洲精品aⅴ| 欧美一级淫片007| 综合久久给合久久狠狠狠97色 | 欧美96一区二区免费视频| 国产a区久久久| 欧美一级搡bbbb搡bbbb| 亚洲三级在线免费| 国产精品一二三四| 国产午夜精品美女毛片视频| 亚洲综合999| 91免费看视频| 国产精品视频一二三| 日本不卡123| 欧美体内she精高潮| 亚洲精品自拍动漫在线| 国产成人av影院| 精品精品欲导航| 日韩精品视频网| 欧美午夜寂寞影院| 亚洲精品伦理在线| 91亚洲精品一区二区乱码| 久久久99久久| 国产在线视视频有精品| 91精品国产一区二区三区蜜臀| 亚洲综合男人的天堂| 在线观看网站黄不卡| 亚洲欧美另类小说视频| 成人网页在线观看| 欧美国产精品一区二区三区| 国产精品1024| 国产精品女主播在线观看| 成人午夜伦理影院| 欧美激情一区二区三区全黄| 成人性生交大片免费看中文| 中文字幕av一区二区三区高| 成人不卡免费av| 国产精品久久久久久久久免费丝袜 | 国产精品一二三在| 国产丝袜欧美中文另类| 国产成都精品91一区二区三 | 欧美一区二区播放| 美女网站在线免费欧美精品| 欧美一区二区三区在线| 精品亚洲国内自在自线福利| 精品国产乱码久久久久久闺蜜| 激情图片小说一区| 国产精品无人区| 色久优优欧美色久优优| 亚洲伊人伊色伊影伊综合网| 欧美日韩在线不卡| 美女网站一区二区| 欧美激情在线观看视频免费| 91毛片在线观看| 日韩综合在线视频| 久久精品欧美一区二区三区不卡| 国产乱码精品一区二区三| 国产精品麻豆网站| 欧美丝袜自拍制服另类| 蜜芽一区二区三区| 亚洲国产精品激情在线观看| 欧美亚洲国产一区二区三区va| 日韩激情视频在线观看| 国产日韩视频一区二区三区| 99久久精品国产麻豆演员表| 丝袜亚洲精品中文字幕一区| 亚洲一区二区3| 欧美一区二区三区婷婷月色| 国产成人av一区二区三区在线观看| 亚洲欧美精品午睡沙发| 日韩亚洲欧美综合| av成人免费在线观看| 日韩中文字幕区一区有砖一区| 久久在线观看免费| 精品污污网站免费看| 丰满白嫩尤物一区二区| 午夜视频在线观看一区| 中文字幕不卡一区| 日韩一区二区中文字幕| 91丨九色丨国产丨porny| 久久精品噜噜噜成人88aⅴ| 亚洲欧美另类久久久精品| 精品日韩欧美一区二区| 欧美又粗又大又爽| 盗摄精品av一区二区三区| 蜜臀精品一区二区三区在线观看| 亚洲视频每日更新| 久久人人爽爽爽人久久久| 欧美日韩午夜在线| 91丝袜呻吟高潮美腿白嫩在线观看| 美女诱惑一区二区| 天天综合天天做天天综合| 一区二区三区四区精品在线视频| 久久精品视频一区二区三区| 91精品国产欧美一区二区| 欧美制服丝袜第一页| 不卡大黄网站免费看| 国产成人啪午夜精品网站男同| 日韩精品五月天| 午夜精品久久久久久不卡8050| 综合亚洲深深色噜噜狠狠网站| 国产欧美日韩麻豆91| 久久综合色综合88| 日韩欧美精品在线视频| 在线综合亚洲欧美在线视频| 欧美日韩aaaaaa| 色婷婷av一区二区三区大白胸| 成人国产精品免费| 国产福利精品导航| 国产成人综合在线观看| 国产精品一二三区| 国产福利精品导航| 丁香一区二区三区| 成人福利电影精品一区二区在线观看| 国产一区视频在线看| 激情欧美一区二区| 国产精品一区二区在线观看不卡 | av资源站一区| 国产suv精品一区二区三区| 丰满少妇久久久久久久| 不卡的av网站| 91国偷自产一区二区使用方法| 欧美天堂亚洲电影院在线播放| 欧亚洲嫩模精品一区三区| 欧美日韩夫妻久久| 日韩视频在线一区二区| 精品免费国产二区三区| 久久久精品影视| 中文字幕不卡一区| 一区二区三区成人在线视频| 亚洲成人av资源| 美腿丝袜亚洲三区| 成人综合激情网| 91久久人澡人人添人人爽欧美| 欧美精三区欧美精三区| 欧美电视剧在线看免费| 国产亚洲一区字幕| 亚洲美女淫视频| 免费成人深夜小野草| 国产成人福利片| 色狠狠色狠狠综合| 日韩午夜av电影| 国产精品不卡一区二区三区| 亚洲va韩国va欧美va| 精久久久久久久久久久| 99这里都是精品| 日韩免费观看高清完整版 | 亚洲另类一区二区| 日日骚欧美日韩| www.亚洲色图.com| 91精品免费在线| 国产精品福利av| 日本女优在线视频一区二区| 国产精品77777竹菊影视小说| 色呦呦一区二区三区| 日韩欧美在线网站| 最新国产成人在线观看| 五月激情综合网| 成人综合在线网站| 91精品国产高清一区二区三区蜜臀| 久久精品网站免费观看| 亚洲成av人片一区二区| av亚洲精华国产精华| 日韩天堂在线观看| 亚洲精选视频免费看| 国产成人免费9x9x人网站视频| 欧美电影在哪看比较好| 国产精品久久精品日日| 九九久久精品视频| 欧美日韩国产小视频在线观看| 国产精品三级电影| 久久精品国产99| 欧美区在线观看| 亚洲精品高清在线观看| 成人午夜在线视频| www成人在线观看| 日韩综合在线视频| 欧美三级在线看| 一区二区三区免费看视频| 成人开心网精品视频| 久久久久久夜精品精品免费| 秋霞国产午夜精品免费视频| 欧美性一级生活| 国产精品高潮呻吟| 暴力调教一区二区三区| 欧美国产禁国产网站cc| 精品一区二区在线播放| 欧美一区二区私人影院日本| 亚洲一区中文在线| 91福利视频网站| 亚洲在线视频一区| 欧美在线免费观看亚洲| 亚洲精品久久7777| 欧美性极品少妇| 亚洲成人激情av| 3d成人h动漫网站入口| 日韩国产欧美三级| 日韩欧美国产三级|