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

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

?? usbclient.c

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? C
?? 第 1 頁 / 共 3 頁
字號:
    }

    if ( pUsbRc && USB_NO_ERROR != *pUsbRc && ERROR_SUCCESS == dwErr) {
        dwErr = ERROR_GEN_FAILURE;
    }

    if ( ERROR_SUCCESS != dwErr ) {
        SetLastError(dwErr);
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("IssueInterruptTransfer ERROR(5, BytesTransferred:%d, Win32Err:%d, UsbError:0x%x)\n"), pBytesTransferred?*pBytesTransferred:-1, dwErr, pUsbRc?*pUsbRc:-1 ));
    }

    return dwErr;
}


/* ++

IssueVendorTransfer: generic USB class specific transfer hanlder.

If NotifyRoutine and NotifyContext are NULL, then the call is made synchronously.

If NotifyRoutine and NotifyContext are not NULL, then the call is made asynchronously
with the following restrictions:

    If dwTimeout not zero, then IssueBulkTransfer waits for either the NotifyContext,
    which is must be an initialized EVENT, or the timeout duration.

    If dwTimeout is zero, then IssueBulkTransfer returns immediately. 
    The Transfer handle is returned in the pUsbError parameter. 
    It is up to the caller to check transfer status, close the transfer handle, etc.

Notes:
    It's up to the caller to determine if the correct number of bytes were transferred.
    It's up to the caller to determine any Win32 or USB error codes.
    It's up to the caller to handle any USB errors.

Return:
    Number of bytes transferred by USB, Win32 error code, and either USB_ERROR or USB_TRANSFER.

-- */
DWORD   
IssueVendorTransfer(
   LPCUSB_FUNCS              pUsbFuncs,
   HANDLE                    hUsbDevice,
   LPTRANSFER_NOTIFY_ROUTINE NotifyRoutine,       // Transfer completion routine.
   PVOID                     NotifyContext,       // Single argument passed to the completion routine
   DWORD                     Flags,               // USB_XXX flags describing the transfer
   PUSB_DEVICE_REQUEST       pControlHeader,      // Request header
   LPVOID                    pBuffer,             // Pointer to transfer buffer
   ULONG                     PhysAddr,            // Specifies the physical address, which may be NULL, of the data buffer
   LPDWORD                   pBytesTransferred,   // Number of bytes transferred by USB
   DWORD                     dwTimeout,           // Timeout in msec
   PUSB_ERROR                pUsbRc			      // Returns USB_ERROR or USB_TRANSFER
   )
{
    USB_TRANSFER hTransfer;
    DWORD  dwErr = ERROR_SUCCESS;
    BOOL   bRc = TRUE;
    DWORD  dwWaitReturn;

    if ( pUsbFuncs && hUsbDevice && pControlHeader && pBytesTransferred && pUsbRc ) {

        *pUsbRc = USB_NO_ERROR;
        *pBytesTransferred = 0;

        if (NotifyContext && NotifyRoutine && dwTimeout) {

            _ResetEvent(NotifyContext); // NotifyContext *must* be an EVENT
        
        }

        hTransfer = pUsbFuncs->lpIssueVendorTransfer( hUsbDevice,
                                                     NotifyRoutine,
                                                     NotifyContext,
                                                     Flags,
                                                     pControlHeader,
                                                     pBuffer,
                                                     PhysAddr );
        if ( hTransfer ) {
            //
            // Asynch call completed.
            // Get transfer status & number of bytes transferred
            //
            if (NotifyContext && NotifyRoutine) {

                if (!dwTimeout) {
                    *pUsbRc = (USB_ERROR)hTransfer;
                    return dwErr;
                }

                //
                // sync the transfer completion / timer
                //
                dwWaitReturn = WaitForSingleObject( NotifyContext,
                                                    dwTimeout );

                switch (dwWaitReturn) {

                   case WAIT_OBJECT_0:
                      //
                      // The completion event was signalled by the callback.
                      // Get transfer status & number of bytes transferred
                      //
                      // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) );

                      GetTransferStatus(pUsbFuncs, hTransfer, pBytesTransferred, pUsbRc);

                      break;

                   case WAIT_TIMEOUT:
                      //
                      // The transfer reqest timed out.
                      // Get transfer status & number of bytes transferred
                      //
                      DEBUGMSG( ZONE_USBCLIENT, (TEXT("%s:WAIT_TIMEOUT on hT:0x%x\n"), (Flags & USB_IN_TRANSFER) ? TEXT("IN") : TEXT("OUT"), hTransfer ));

                      GetTransferStatus(pUsbFuncs, hTransfer, pBytesTransferred, pUsbRc);

                      //
                      // let caller know it timed out
                      //
                      dwErr = ERROR_TIMEOUT;
                      break;
       
                   default:
                      dwErr = ERROR_GEN_FAILURE;
                      DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** Unhandled WaitReason:%d ***\n"), dwWaitReturn ));
                      // ASSERT(0);
                      break;
                }

            } else {
                //
                // Synch call completed.
                // Get transfer status & number of bytes transferred
                //
                // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) );

                GetTransferStatus(pUsbFuncs, hTransfer, pBytesTransferred, pUsbRc);
            }

            CloseTransferHandle(pUsbFuncs, hTransfer);

        } else {
            dwErr = GetLastError();
            DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** IssueVendorTransfer ERROR(3, 0x%x) ***\n"), dwErr ));
        }
    
    } else {
        dwErr = ERROR_INVALID_PARAMETER;
    }

    if ( pUsbRc && ERROR_SUCCESS == dwErr && USB_NO_ERROR != *pUsbRc) {
        dwErr = ERROR_GEN_FAILURE;
    }

    if ( ERROR_SUCCESS != dwErr ) {
        SetLastError(dwErr);
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("IssueVendorTransfer ERROR(5, BytesTransferred:%d, Win32Err:%d, UsbError:0x%x)\n"), pBytesTransferred?*pBytesTransferred:-1, dwErr, pUsbRc?*pUsbRc:-1)); 
    }

    return dwErr;
}


/*++

ResetDefaultEndpoint:

  Tries to reset the default endpoint 0.

Return:
  
    Win32 error code.

Notes:

  In really bad cases you could see something like the following trace:

  CQueuedPipe(Control)::CheckForDoneTransfers - failure on TD 0x1358c0, address = 1, endpoint = 0, errorCounter = 0, status field = 0x22
  CFunction::SetOrClearFeature - recipient = 2, wIndex = 0, set/clear = 0x1, feature = 0x0, FAILED
  CHub(Root tier 0)::HubStatusChangeThread - device on port 1 is connected but has been disabled. Trying to detach & re-attach

The status field is a bitmask (bits 17-22 of the status field defined in the UHCI spec):
    0x01    bitstuff error
    0x02    CRC or timeout error (cannot distinguish the two)
    0x04    NAK (you should not see this bit set in normal operation)
    0x08    babble detected
    0x10    data buffer overrun
    0x20    STALL response from device

--*/
DWORD
ResetDefaultEndpoint(
    LPCUSB_FUNCS   pUsbFuncs,
    HANDLE         hUsbDevice
    )
{
    DWORD dwErr = ERROR_SUCCESS;
    BOOL  bRc, bHalted;

    if ( !pUsbFuncs || !hUsbDevice ) {
        return ERROR_INVALID_PARAMETER;
    }

    //
    // test & reset the default pipe
    //
    bRc = pUsbFuncs->lpIsDefaultPipeHalted(hUsbDevice, &bHalted);

    if ( bRc && bHalted ) {
        //
        // ResetDefaultPipe does a clear feature on endpoint 0.
        //
        if ( !pUsbFuncs->lpResetDefaultPipe(hUsbDevice) ) {
            //
            // We can not reset the port on WCE. However, a device must automatically un-stall 
            // EP0 as soon as another SETUP packet is received on it. Any stall on EP0 is 
            // considered a "protocol STALL" rather than a "functional STALL" (see the USB 
            // spec for details). Calling the USBD function to clear the default pipe's stall 
            // condition really only tweaks a bit in an internal structure; you should be ready 
            // to go again immediately.
            //
            DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** ResetDefaultPipe failure ***\n")));
            // return ERROR in case caller needs protocol recovery.
            dwErr = ERROR_GEN_FAILURE;
        }

    } else if (!bRc) {
        dwErr= GetLastError(); //ERROR_GEN_FAILURE;
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** IsDefaultPipeHalted ERROR:%d ***\n"), dwErr));
    }

    return dwErr;
}


//
// ResetBulkEndpoint: resets the pipe, then checks the endpoint status on the device.
// If the endpoint is halted then send it a clear feature.
//
//  If dwTimeout not zero, then ResetBulkEndpoint waits for either the NotifyContext,
//  which is must be an initialized EVENT, or the timeout duration.
//
// Returns Win32 error
//
DWORD
ResetBulkEndpoint(
    LPCUSB_FUNCS              pUsbFuncs,
    HANDLE                    hUsbDevice,
    USB_PIPE                  hPipe,
    LPTRANSFER_NOTIFY_ROUTINE NotifyRoutine,    // Transfer completion routine.
    PVOID                     NotifyContext,    // Single argument passed to the completion routine
    UCHAR                     bIndex,
    DWORD                     dwTimeout         // Timeout in msec
    )
{
    DWORD dwErr    = ERROR_SUCCESS;
    DWORD dwUsbErr = USB_NO_ERROR;
    WORD  wHalt = 0;

    DWORD dwFlags = (NotifyRoutine && NotifyContext) ? USB_NO_WAIT : 0;

    //
    // reset this pipe
    //
    ResetPipe(pUsbFuncs, hPipe, dwFlags);

    if (NotifyContext && NotifyRoutine && dwTimeout) {

        _ResetEvent(NotifyContext); // NotifyContext *must* be an EVENT

#if GET_ENDPOINT_STATUS
        // GetStatus can take quite some time, and will sometimes hang EP0 on a bad device. 
        // Since we can't recover via port reset then do it blindy.
        dwErr = GetStatus( pUsbFuncs, 
                           hUsbDevice,
                           NotifyRoutine,
                           NotifyContext,
                           USB_SEND_TO_ENDPOINT,
                           bIndex,
                           &wHalt,
                           dwTimeout );
#else
        // just do it
        wHalt = 0x01;
#endif

        // See USB 1.1 Spec, 9.4.5: D0 set. 
        // USBD may return garbage if the device was unpluged.
        if ( ERROR_SUCCESS == dwErr && 0x01 == wHalt ) {
            DEBUGMSG( ZONE_USBCLIENT, (TEXT("Enpoint:0x%x wStatus:0x%x\n"), bIndex, wHalt ));
                            
            dwErr = ClearOrSetFeature(pUsbFuncs, 
                                      hUsbDevice,
                                      NotifyRoutine,
                                      NotifyContext,
                                      USB_SEND_TO_ENDPOINT | dwFlags,
                                      USB_FEATURE_ENDPOINT_STALL,
                                      bIndex,
                                      dwTimeout,
                                      FALSE ); // clear
        }
    }

    if ( ERROR_SUCCESS != dwErr ) {
        SetLastError(dwErr);
    }

    return dwErr;
}


//
// returns Win32 error
//
BOOL
ResetPipe(
    LPCUSB_FUNCS    pUsbFuncs,
    USB_PIPE        hPipe,
    DWORD           dwFlags
    )
{
    BOOL  bHalted;
    BOOL bRc = TRUE;

#if 1
    UNREFERENCED_PARAMETER(dwFlags);
#else
    //
    // Abort any pending transfers on this pipe.
    // This does not guarantee that no more transfers will be completed; 
    // any outstanding transfers will complete even after this function is called. 
    // Any registered completion callbacks will be invoked.
    //
    if (!pUsbFuncs->lpAbortPipeTransfers(hPipe, dwFlags )) {
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** AbortPipeTransfers ERROR:d ***\n"), GetLastError()));
        bRc = FALSE;
    }
#endif
    //
    // test & reset pipe state within the USB stack
    //
    if ( pUsbFuncs->lpIsPipeHalted(hPipe, &bHalted) && bHalted) {
        // reset the pipe
        if (!pUsbFuncs->lpResetPipe(hPipe)) {
            DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** ResetPipe ERROR:%d ***\n"), GetLastError()));
            //ASSERT(0);
            bRc = FALSE;
        }
    }
    
    return bRc;
}


// EOF

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品久久久久秋霞影院| 亚洲女同ⅹxx女同tv| 欧美午夜免费电影| 日本精品裸体写真集在线观看| 国产.精品.日韩.另类.中文.在线.播放| 精品综合久久久久久8888| 免费视频一区二区| 国产最新精品精品你懂的| 国产精品资源在线观看| 精品一区二区在线看| 国产乱色国产精品免费视频| 国产成都精品91一区二区三| 波多野洁衣一区| 91久久精品日日躁夜夜躁欧美| 色婷婷精品久久二区二区蜜臀av| 在线中文字幕一区二区| 91精品国产全国免费观看| 久久久亚洲精品一区二区三区 | 色琪琪一区二区三区亚洲区| 色综合久久综合| 欧美一区二区三区电影| 国产亚洲短视频| 一区二区在线观看av| 午夜激情综合网| 国产99精品在线观看| 色综合天天天天做夜夜夜夜做| 欧美午夜精品一区二区三区| 欧美va亚洲va在线观看蝴蝶网| 国产精品久久久久婷婷| 免费在线成人网| 一本大道av一区二区在线播放| 欧美一卡2卡3卡4卡| 亚洲欧美一区二区在线观看| 日日摸夜夜添夜夜添亚洲女人| 粉嫩av亚洲一区二区图片| 欧美美女黄视频| 亚洲天天做日日做天天谢日日欢| 午夜精品在线看| 91在线免费看| 久久久久9999亚洲精品| 日韩精品久久理论片| 96av麻豆蜜桃一区二区| 久久久久国产精品人| 午夜天堂影视香蕉久久| 99在线精品观看| 精品国产一区二区三区久久影院| 亚洲乱码国产乱码精品精可以看| 久久精品国产精品亚洲精品| 色偷偷久久一区二区三区| 国产日韩欧美高清在线| 老司机免费视频一区二区三区| 9色porny自拍视频一区二区| 日韩欧美一区在线观看| 一区二区三区毛片| 91在线视频在线| 中文字幕不卡在线观看| 麻豆一区二区在线| 制服丝袜亚洲网站| 亚洲国产综合在线| 日本电影欧美片| 一区二区三区欧美| 91欧美一区二区| 中文字幕乱码一区二区免费| 国产毛片精品视频| 精品国精品国产| 精品一区二区三区免费视频| 欧美日本一区二区| 婷婷亚洲久悠悠色悠在线播放| 欧洲色大大久久| 日日夜夜精品视频免费| 91.com视频| 麻豆精品精品国产自在97香蕉| 欧美疯狂做受xxxx富婆| 日韩成人一级片| 欧美一级免费大片| 精品一区二区三区香蕉蜜桃| 精品乱人伦一区二区三区| 久久精品久久综合| 久久综合色鬼综合色| 国产一区欧美日韩| 中文字幕+乱码+中文字幕一区| 丰满岳乱妇一区二区三区| 中文字幕色av一区二区三区| 91麻豆免费观看| 亚洲二区视频在线| 精品国内二区三区| 波多野结衣的一区二区三区| 专区另类欧美日韩| 欧美精品免费视频| 韩国av一区二区三区四区 | 成人ar影院免费观看视频| 国产精品视频观看| 色播五月激情综合网| 亚洲成人综合在线| 欧美成人激情免费网| 成人精品免费网站| 亚洲国产精品精华液网站| 欧美成人艳星乳罩| 99久久er热在这里只有精品15| 性感美女极品91精品| 欧美videos中文字幕| 91视频观看免费| 美女国产一区二区| 亚洲欧美日韩一区二区三区在线观看| 欧美系列在线观看| 成人做爰69片免费看网站| 亚洲一区在线播放| 国产农村妇女精品| 日韩一区二区中文字幕| 不卡区在线中文字幕| 日韩国产精品久久久久久亚洲| 久久老女人爱爱| 欧美喷潮久久久xxxxx| 国产91在线观看丝袜| 日韩av成人高清| 亚洲精品乱码久久久久久久久| 欧美成人a∨高清免费观看| 欧洲一区在线电影| 国产盗摄一区二区三区| 日韩专区中文字幕一区二区| 国产精品热久久久久夜色精品三区| 欧美日韩国产精选| 色吊一区二区三区| 成人一区在线观看| 美女视频黄久久| 一级日本不卡的影视| 欧美激情在线一区二区| 日韩欧美的一区二区| 欧美亚洲综合另类| av资源网一区| 不卡影院免费观看| 国产sm精品调教视频网站| 奇米精品一区二区三区在线观看| 一区二区欧美精品| 亚洲日本va午夜在线电影| 国产精品免费久久久久| 久久久精品免费免费| 精品国产一区久久| 亚洲精品一区二区三区蜜桃下载| 日韩一级视频免费观看在线| 欧美日高清视频| 在线不卡一区二区| 欧美无砖砖区免费| 欧美日韩中文另类| 欧美日韩精品免费| 欧美另类videos死尸| 制服丝袜日韩国产| 日韩欧美国产精品| 日韩视频一区在线观看| 日韩三级伦理片妻子的秘密按摩| 欧美日韩美少妇| 欧美一二三在线| 2023国产精品自拍| 中文字幕巨乱亚洲| 亚洲特级片在线| 亚洲夂夂婷婷色拍ww47| 天天免费综合色| 久久国产视频网| 国产成人精品午夜视频免费| 国产成人精品一区二区三区网站观看| 国产一区二区不卡老阿姨| 国产高清精品在线| 色综合欧美在线视频区| 欧美性色欧美a在线播放| 欧美三级韩国三级日本三斤| 欧美人动与zoxxxx乱| 精品国产电影一区二区| 国产精品水嫩水嫩| 亚洲一区二区三区视频在线| 天天做天天摸天天爽国产一区| 蜜臀久久99精品久久久久宅男 | 成人伦理片在线| 色综合久久久久久久久| 欧美视频一区二区三区四区| 日韩一区二区视频在线观看| 久久久噜噜噜久噜久久综合| 亚洲日本va在线观看| 日本人妖一区二区| 99这里都是精品| 日韩一级片网站| 中文字幕色av一区二区三区| 午夜久久久久久| 国产成人精品免费在线| 色女孩综合影院| wwwwxxxxx欧美| 亚洲国产精品久久人人爱 | 亚洲午夜电影网| 国产一区亚洲一区| 精品视频在线免费观看| 久久影院视频免费| 亚洲一区二区三区美女| 国产精品资源在线看| 欧美乱妇一区二区三区不卡视频| 久久天天做天天爱综合色| 一级做a爱片久久| 丁香六月综合激情| 欧美mv和日韩mv国产网站| 亚洲午夜影视影院在线观看| 成人国产一区二区三区精品| 欧美一级黄色录像|