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

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

?? usbclient.c

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? C
?? 第 1 頁 / 共 3 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++

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.

Module Name: 

    usbclient.c

Abstract:

    Common USB Client Driver Interface

Issues:
    
    No isoch support yet

--*/

#include "usbclient.h"

#if 0
#ifdef DEBUG
DBGPARAM dpCurSettings = {
    TEXT("USBCLIENT"), {
    TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),   TEXT("Undefined")  
    TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),   TEXT("Undefined")  
    TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),   TEXT("Undefined")  
    TEXT("Undefined"), TEXT("Undefined"), TEXT("Undefined"),   TEXT("Undefined")  
    },
     0x0003 // ZONE_WRN|ZONE_ERR
};
#endif  // DEBUG

BOOL 
DllEntry(
   HANDLE hDllHandle, 
   DWORD  dwReason,
   LPVOID lpreserved
   ) 
{
    UNREFERENCED_PARAMETER(lpreserved);
    switch (dwReason) {

      case DLL_PROCESS_ATTACH:
           DEBUGREGISTER((HINSTANCE)hDllHandle);
           break;

      case DLL_PROCESS_DETACH:
           break;

      default:
        break;
    }
    return TRUE;
}
#endif 0

__inline
DWORD
_ResetEvent(
    HANDLE hEvent
    )
{
   DWORD dwErr = ERROR_SUCCESS;

    if ( !ResetEvent(hEvent) ) {
        dwErr = GetLastError();
        DEBUGMSG(ZONE_USBCLIENT, (TEXT("*** ResetEvent ERROR:%d ***\n"), dwErr));
        // ASSERT(0);
        return dwErr;
    }

    return TRUE;
}


BOOL
AbortTransfer(
    LPCUSB_FUNCS   pUsbFuncs,
    USB_TRANSFER   hTransfer,
    DWORD          dwFlags
    )
{
    BOOL bRc = TRUE;

    // AbortTransfer checks if the transfer has already completed
    if ( !pUsbFuncs->lpAbortTransfer(hTransfer, dwFlags) ) {
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** AbortTransfer ERROR:%d ***\n"), GetLastError())); 
        bRc = FALSE;
    }

    return bRc;
}


BOOL
CloseTransferHandle(
    LPCUSB_FUNCS   pUsbFuncs,
    USB_TRANSFER   hTransfer
    )
{
    BOOL bRc = TRUE;

    // This assert may fail on suprise remove,
    // but should pass during normal I/O.
    // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) ); 

    // CloseTransfer aborts any pending transfers
    if ( !pUsbFuncs->lpCloseTransfer(hTransfer) ) {
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** CloseTransfer ERROR:%d ***\n"), GetLastError())); 
        bRc = FALSE;
    }

    return bRc;
}


//
// Returns: 
//  Win32 error
//    
// Note: 
//    a synchronous ClearOrSetFeature call can take quite some time.
//
DWORD
ClearOrSetFeature(
    LPCUSB_FUNCS              pUsbFuncs,
    HANDLE                    hUsbDevice,
    LPTRANSFER_NOTIFY_ROUTINE NotifyRoutine,     // CallbackRoutine: signals a completion event.
    PVOID                     NotifyContext,     // CallbackContext: handle to a BulkXxx Completion Event
    DWORD                     dwFlags,           // see ClearOrSetFeature doc
    WORD                      wFeature,          // one of USB_FEATURE_*
    UCHAR                     bIndex,
    DWORD                     dwTimeout,         // Timeout in msec
    BOOL                      bSet               // TRUE to Set, FALSE to Clear
    )
{
    DWORD dwErr    = ERROR_SUCCESS;
    DWORD dwUsbErr = USB_NO_ERROR;
    DWORD dwWaitReturn;
    
    USB_TRANSFER hTransfer;

    if (NotifyContext && NotifyRoutine && dwTimeout) {

        _ResetEvent(NotifyContext); // NotifyContext *must* be an EVENT
    
    }
  
    //
    // reset endpoint on device
    //
    if (bSet)
        hTransfer = pUsbFuncs->lpSetFeature( hUsbDevice,
                                             NotifyRoutine,                  
                                             NotifyContext,
                                             dwFlags,
                                             wFeature,
                                             bIndex );
    else 
        hTransfer = pUsbFuncs->lpClearFeature( hUsbDevice,
                                               NotifyRoutine,                  
                                               NotifyContext,
                                               dwFlags,
                                               wFeature,
                                               bIndex );

    if ( hTransfer ) {
            //
            // Asynch call completed.
            // Get transfer status & number of bytes transferred
            //
            if (NotifyContext && NotifyRoutine) {

                if (!dwTimeout) {
                    return (DWORD)hTransfer;
                }

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

                switch (dwWaitReturn) {

                   case WAIT_OBJECT_0:
                      //
                      // The completion event was signalled by the callback.
                      // determine if it was actually cleared on the device
                      //
                      // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) );

                      GetTransferStatus(pUsbFuncs, hTransfer, NULL, &dwUsbErr);
                        
                      if ( USB_NO_ERROR != dwUsbErr)
                          dwErr = ERROR_GEN_FAILURE;
                      break;

                    case WAIT_TIMEOUT:
                      //
                      // The transfer reqest timed out.
                      //
                      DEBUGMSG( ZONE_USBCLIENT, (TEXT("ClearOrSetFeature:WAIT_TIMEOUT on bIndex:0x%x\n"), bIndex ));

                      GetTransferStatus(pUsbFuncs, hTransfer, NULL, &dwUsbErr);

                      //
                      // let caller know it timed out
                      //
                      dwErr = ERROR_TIMEOUT;
                      break;

                    default:
                      dwErr = ERROR_GEN_FAILURE;
                      DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** Unhandled WaitReason:%d ***\n"), dwWaitReturn ));
                      break;
                }

            } else {
                //
                // Synch call completed.
                // determine if it was actually cleared on the device
                //
                // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) );

                GetTransferStatus(pUsbFuncs, hTransfer, NULL, &dwUsbErr);

                if ( USB_NO_ERROR != dwUsbErr)
                    dwErr = ERROR_GEN_FAILURE;
            }
        
            CloseTransferHandle(pUsbFuncs, hTransfer);

    } else {
        dwErr = GetLastError();
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** ClearOrSetFeature on endpoint:0x%x ERROR:%d ***\n"), bIndex, dwErr ));
    }

    return dwErr;
}


//
// Generic DefaultTransferComplete callback routine.
// Simply signals the hEvent passed in when USB signals a transfer is done.
// If you prematurely close/abort a transfer then this routine will still run.
//
DWORD
DefaultTransferComplete(
   PVOID    Context
   )
{
   HANDLE hEvent = (HANDLE)Context;
   DWORD  dwErr  = ERROR_SUCCESS;

   if ( hEvent ) {
      //
      // The current operation completed, signal the event
      //
       if ( !SetEvent( hEvent) ) {
          dwErr = GetLastError();
          //SetLastError(dwErr);
          DEBUGMSG(ZONE_USBCLIENT,(TEXT("*** SetEvent ERROR:%d ***\n"), dwErr));
          // ASSERT(0);
       }

   } else {
      dwErr = ERROR_INVALID_HANDLE;
      SetLastError(dwErr);
      DEBUGMSG( ZONE_USBCLIENT,(TEXT("*** DefaultTransferComplete ERROR:%d ***\n"), dwErr));
      // ASSERT(0);
   }

   return dwErr;
}


//
// returns Win32 error
//
// Note: 
//    a synchronous GetStatus call can take quite some time.
//
DWORD
GetStatus(
    LPCUSB_FUNCS              pUsbFuncs,
    HANDLE                    hUsbDevice,
    LPTRANSFER_NOTIFY_ROUTINE NotifyRoutine,     // CallbackRoutine: signals a completion event.
    PVOID                     NotifyContext,     // CallbackContext: handle to a BulkXxx Completion Event
    DWORD                     dwFlags,
    UCHAR                     bIndex,
    LPWORD                    lpwStatus,
    DWORD                     dwTimeout         // Timeout in msec
    )
{
    DWORD dwErr    = ERROR_SUCCESS;
    DWORD dwUsbErr = USB_NO_ERROR;
    DWORD dwWaitReturn;
    DWORD dwBytesTransferred;
    USB_TRANSFER hTransfer;


    if (NotifyContext && NotifyRoutine && dwTimeout) {

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

    }

    hTransfer = pUsbFuncs->lpGetStatus( hUsbDevice,
                                        NotifyRoutine,
                                        NotifyContext,
                                        dwFlags,
                                        bIndex,
                                        lpwStatus );

    if ( hTransfer ) {
            //
            // Asynch call completed.
            // Get transfer status & number of bytes transferred
            //
            if (NotifyContext && NotifyRoutine) {

                if (!dwTimeout) {
                    return (DWORD)hTransfer;
                }

                //
                // 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, &dwBytesTransferred, &dwUsbErr);
                      break;

                    case WAIT_TIMEOUT:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产日日夜夜| 久久久精品免费网站| 一区二区三区四区亚洲| 色先锋资源久久综合| 一区二区三区加勒比av| 欧美色综合影院| 日本三级亚洲精品| 久久综合av免费| 国产成人8x视频一区二区| 国产精品美女久久久久久久久 | 美女性感视频久久| 日韩免费高清av| 国产福利不卡视频| 一区二区免费在线播放| 欧美丰满少妇xxxbbb| 国产一区二区三区在线观看免费| 国产精品拍天天在线| 欧美日韩中文精品| 国产一区二区h| 樱桃视频在线观看一区| 欧美日韩不卡一区二区| 国产成人综合视频| 亚洲一区二区三区爽爽爽爽爽| 欧美一区二区三区免费视频| 国产精品66部| 亚洲成精国产精品女| 欧美一区二区人人喊爽| 不卡视频免费播放| 亚洲mv在线观看| 国产精品麻豆欧美日韩ww| 欧美一区二区三区在| 色欲综合视频天天天| 免费人成精品欧美精品| 亚洲天堂成人网| 欧美va亚洲va在线观看蝴蝶网| 99久久99久久精品免费观看| 精品一区二区在线免费观看| 亚洲黄色性网站| 久久综合资源网| 3751色影院一区二区三区| 成人黄色软件下载| 国产在线视频一区二区三区| 亚洲一区二区欧美| 亚洲欧洲日韩综合一区二区| 日韩欧美国产综合在线一区二区三区| 一本高清dvd不卡在线观看| 国产乱码一区二区三区| 男人操女人的视频在线观看欧美| 亚洲人成影院在线观看| 久久久九九九九| 精品国产不卡一区二区三区| 欧美日韩精品三区| 欧洲一区二区av| 91女厕偷拍女厕偷拍高清| 国产精品影视网| 九色综合国产一区二区三区| 偷拍一区二区三区四区| 亚洲人午夜精品天堂一二香蕉| 久久嫩草精品久久久精品| 日韩午夜在线观看| 欧美精品三级在线观看| 欧美三级蜜桃2在线观看| 92精品国产成人观看免费| 成人美女视频在线看| 国产成人午夜片在线观看高清观看| 麻豆精品在线播放| 日本女人一区二区三区| 日韩成人免费电影| 蜜桃av噜噜一区| 天堂蜜桃91精品| 日韩激情视频网站| 婷婷丁香久久五月婷婷| 偷拍一区二区三区四区| 亚洲成人你懂的| 日本最新不卡在线| 免费亚洲电影在线| 久久99九九99精品| 国产剧情一区在线| 成人午夜免费视频| 成人黄色777网| 97超碰欧美中文字幕| av一本久道久久综合久久鬼色| 风间由美中文字幕在线看视频国产欧美| 美女精品自拍一二三四| 国产伦精一区二区三区| 成人黄页在线观看| 一本大道综合伊人精品热热| 色吧成人激情小说| 欧美日韩国产小视频| 日韩一区二区电影| 国产亚洲精品aa午夜观看| 国产精品美女久久久久久| 亚洲六月丁香色婷婷综合久久| 夜夜嗨av一区二区三区| 天天综合色天天综合| 激情综合五月天| 成人免费va视频| 欧美最猛性xxxxx直播| 制服丝袜亚洲色图| 久久精品日韩一区二区三区| 亚洲人成伊人成综合网小说| 五月激情综合色| 韩国成人精品a∨在线观看| 国产suv精品一区二区三区| 91麻豆.com| 欧美一区二区高清| 中文字幕成人在线观看| 一区二区三区四区乱视频| 人人超碰91尤物精品国产| 国产精品夜夜嗨| 欧美自拍丝袜亚洲| 精品成人私密视频| 亚洲免费av网站| 蜜臀a∨国产成人精品| 99久久精品免费观看| 91精品国产手机| 国产精品久久久99| 日韩av网站免费在线| 成人aa视频在线观看| 91精品国产日韩91久久久久久| 国产欧美日韩视频在线观看| 午夜精品一区二区三区免费视频 | 成人午夜免费视频| 欧美精品自拍偷拍| 自拍偷拍亚洲激情| 久久av老司机精品网站导航| 91小视频在线观看| 久久亚洲综合色| 亚洲国产精品久久久久秋霞影院 | 欧美日韩中文字幕精品| 久久久久成人黄色影片| 天堂在线一区二区| 91浏览器入口在线观看| 久久久久9999亚洲精品| 日本午夜精品视频在线观看| 91小视频免费看| 国产欧美日韩卡一| 免费在线成人网| 91福利在线播放| 中文一区在线播放| 国模少妇一区二区三区| 欧美日韩精品久久久| 亚洲女与黑人做爰| 成人av动漫网站| 国产午夜精品美女毛片视频| 另类小说综合欧美亚洲| 5858s免费视频成人| 亚洲综合无码一区二区| 99久久777色| 国产精品久久久久一区二区三区共| 国产在线视频精品一区| 日韩精品一区二区在线| 日本中文一区二区三区| 欧美日韩一级二级三级| 一区二区三区免费在线观看| aaa国产一区| 国产精品成人免费| 成人一区二区三区视频在线观看 | 成人精品一区二区三区四区 | 91精品国产aⅴ一区二区| 亚洲综合久久久久| 色婷婷亚洲精品| 尤物av一区二区| 欧美视频在线一区| 亚洲成人在线观看视频| 欧美日韩一本到| 午夜av区久久| 欧美一级电影网站| 蜜臀av一区二区三区| 欧美电视剧在线观看完整版| 蜜桃传媒麻豆第一区在线观看| 日韩一区二区三区精品视频| 免费三级欧美电影| 久久影音资源网| 成人av在线资源网| 亚洲免费av观看| 777奇米成人网| 久久av中文字幕片| 国产日本亚洲高清| 91原创在线视频| 亚洲国产综合色| 91精品视频网| 国产精品综合在线视频| 中文字幕一区二区三区在线观看 | 国产精品影视在线观看| 国产精品国产自产拍高清av | 国产一区二区三区在线观看免费 | 国产在线视频一区二区三区| 久久精品视频在线免费观看| 丁香亚洲综合激情啪啪综合| 中文字幕一区二区三区四区| 欧美日韩中文字幕精品| 久久精品国产99| 国产精品家庭影院| 欧美日韩一本到| 国产精品自拍网站| 亚洲精品乱码久久久久久黑人| 欧美精品高清视频| 国产一区二区三区免费播放| 国产精品久久久99|