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

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

?? usbclient.c

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? C
?? 第 1 頁 / 共 3 頁
字號:
                      //
                      // The transfer reqest timed out.
                      // Get transfer status & number of bytes transferred
                      //
                      DEBUGMSG( ZONE_USBCLIENT, (TEXT("GetStatus:WAIT_TIMEOUT on bIndex:0x%x\n"), bIndex ));

                      GetTransferStatus(pUsbFuncs, hTransfer, &dwBytesTransferred, &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.
                // Get transfer status & number of bytes transferred
                //
                // ASSERT( pUsbFuncs->lpIsTransferComplete(hTransfer) );

                GetTransferStatus(pUsbFuncs, hTransfer, &dwBytesTransferred, &dwUsbErr);
                // ASSERT( USB_NO_ERROR == dwUsbErr);
            }

            CloseTransferHandle(pUsbFuncs, hTransfer);

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

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

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

    return dwErr;
}


// returns TRUE if successful
BOOL
GetTransferStatus(
    LPCUSB_FUNCS   pUsbFuncs,
    USB_TRANSFER   hTransfer,
    LPDWORD        pBytesTransferred, // OPTIONAL returns number of bytes transferred
    PUSB_ERROR     pUsbError          // returns USB error code
    )
{
    BOOL bRc = TRUE;

    if ( pUsbFuncs->lpGetTransferStatus(hTransfer, pBytesTransferred, pUsbError) ) {
        if ( USB_NO_ERROR != *pUsbError ) {
            DEBUGMSG( ZONE_USBCLIENT, (TEXT("GetTransferStatus (BytesTransferred:%d, UsbError:0x%x)\n"), pBytesTransferred?*pBytesTransferred:-1, pUsbError?*pUsbError:-1 )); 
        }
    } else {
        DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** GetTransferStatus ERROR:%d ***\n"), GetLastError())); 
        *pUsbError = USB_CANCELED_ERROR;
        bRc = FALSE;
    }

    return bRc;
}


/* ++

IssueBulkTransfer: generic USB bulk transfer handler.

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
IssueBulkTransfer( 
   LPCUSB_FUNCS              pUsbFuncs,
   USB_PIPE                  hPipe,
   LPTRANSFER_NOTIFY_ROUTINE NotifyRoutine,     // Transfer completion routine.
   PVOID                     NotifyContext,     // Single argument passed to the completion routine
   DWORD                     Flags,             // USB_XXX flags describing the transfer
   LPVOID                    pBuffer,           // Pointer to transfer buffer
   ULONG                     PhysAddr,          // Specifies the physical address, which may be NULL, of the data buffer
   DWORD                     BufferLength,      // Length of transfer buffer in bytes
   LPDWORD                   pBytesTransferred, // Returns number of bytes transferred by USB
   DWORD                     dwTimeout,         // Timeout in msec
   PUSB_ERROR				 pUsbRc				// Returns USB_ERROR or USB_TRANSFER
   )
{
    USB_TRANSFER hTransfer = NULL;
    DWORD dwWaitReturn = 0;
    BOOL  bRc = FALSE;
    DWORD dwErr = ERROR_SUCCESS;

    if ( pUsbFuncs && hPipe && pBytesTransferred && pUsbRc ) {

        *pBytesTransferred = 0;
        *pUsbRc = USB_NO_ERROR;

        if (NotifyContext && NotifyRoutine && dwTimeout) {

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

        hTransfer = pUsbFuncs->lpIssueBulkTransfer( hPipe,
                                                   NotifyRoutine,
                                                   NotifyContext,
                                                   Flags,
                                                   BufferLength,
                                                   pBuffer,
                                                   PhysAddr );

        if ( hTransfer ) {
            //
            // Asynch call succeeded.
            // 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, hTransfer ));
                      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("*** IssueBulkTransfer ERROR(3, %d) ***\n"), dwErr ));
        }
   
    } else {
        dwErr = ERROR_INVALID_PARAMETER;
    }

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

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

    return dwErr;
}


/* ++

  IssueInterruptTransfer: generic USB interrupt transfer handler.

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
IssueInterruptTransfer( 
   LPCUSB_FUNCS              pUsbFuncs,
   USB_PIPE                  hPipe,
   LPTRANSFER_NOTIFY_ROUTINE NotifyRoutine,     // Transfer completion routine.
   PVOID                     NotifyContext,     // Single argument passed to the completion routine
   DWORD                     Flags,             // USB_XXX flags describing the transfer
   LPVOID                    pBuffer,           // Ppointer to transfer buffer
   ULONG                     PhysAddr,          // Specifies the physical address, which may be NULL, of the data buffer
   DWORD                     BufferLength,      // Length of transfer buffer in bytes
   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 = NULL;
    DWORD dwWaitReturn = 0;
    BOOL  bRc = FALSE;
    DWORD dwErr = ERROR_SUCCESS;

    if ( pUsbFuncs && hPipe && pBytesTransferred && pUsbRc ) {

        *pBytesTransferred = 0;
        *pUsbRc = USB_NO_ERROR;

        if (NotifyContext && NotifyRoutine && dwTimeout) {

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

        hTransfer = pUsbFuncs->lpIssueInterruptTransfer( hPipe,
                                                         NotifyRoutine,
                                                         NotifyContext,
                                                         Flags,
                                                         BufferLength,
                                                         pBuffer,
                                                         PhysAddr );
        if ( hTransfer ) {
            //
            // Asynch call succeeded.
            // 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, hTransfer ));
                      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 = ERROR_GEN_FAILURE;
            DEBUGMSG( ZONE_USBCLIENT, (TEXT("*** IssueInterruptTransfer ERROR(3, %d) ***\n"), dwErr ));
        }
   
    } else {
        dwErr = ERROR_INVALID_PARAMETER;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲人成精品久久久久久| 欧美绝品在线观看成人午夜影视| 麻豆精品一区二区| 夜夜揉揉日日人人青青一国产精品| 久久在线免费观看| 日韩一区二区在线观看| 欧美日韩精品二区第二页| 国产午夜精品久久久久久免费视 | 一区二区三区色| 久久久亚洲国产美女国产盗摄| 91麻豆精品国产自产在线| 欧美系列一区二区| 欧美日韩一区精品| 在线观看视频一区二区欧美日韩| 99精品欧美一区| www.66久久| 99re热视频这里只精品| 成人免费av在线| 不卡大黄网站免费看| 懂色av噜噜一区二区三区av| 国产不卡视频一区| 国产sm精品调教视频网站| 国产精品456露脸| 成人综合在线视频| 不卡视频在线看| 色av成人天堂桃色av| 99国产精品久久久久久久久久久| 成人激情免费网站| 国产精品99精品久久免费| 大陆成人av片| 精品一区二区综合| 精品一区二区日韩| 国产一区二区三区在线观看免费 | 欧美日韩国产精选| 欧美精品在线一区二区| 欧美人体做爰大胆视频| 日韩一区二区三| 亚洲精品一区二区精华| 国产婷婷色一区二区三区四区| 久久综合中文字幕| 欧美激情一区二区三区在线| 国产精品三级视频| 亚洲日本免费电影| 亚洲成人免费视| 免费观看日韩av| 国产v日产∨综合v精品视频| av午夜精品一区二区三区| 91福利国产成人精品照片| 欧美亚一区二区| 日韩欧美国产三级| 欧美成人精品福利| 国产精品久久久久久户外露出 | 国产麻豆成人传媒免费观看| 成人免费视频免费观看| 色综合激情五月| 欧美一级二级三级蜜桃| 色狠狠综合天天综合综合| 欧美日本在线看| 亚洲国产精品国自产拍av| 波多野结衣一区二区三区 | 国产精品日日摸夜夜摸av| 国产精品第一页第二页第三页| 亚洲一区二区五区| 精品午夜一区二区三区在线观看| 91麻豆精品国产91久久久久久 | 久久女同性恋中文字幕| 亚洲综合男人的天堂| 粗大黑人巨茎大战欧美成人| 欧美一级高清大全免费观看| 亚洲精品日产精品乱码不卡| 国产麻豆精品在线观看| 91精品免费观看| 亚洲黄一区二区三区| 国产高清精品久久久久| 91精品国产色综合久久不卡电影| 亚洲欧美在线另类| 韩国成人精品a∨在线观看| 91精品国产一区二区人妖| 亚洲激情六月丁香| 91免费看视频| 中文字幕av一区二区三区免费看| 久久国产综合精品| 日韩欧美国产麻豆| 免费在线观看成人| 91精品国产一区二区人妖| 亚洲曰韩产成在线| 91视频在线看| 国产精品毛片高清在线完整版| 国产麻豆视频精品| 久久亚洲综合色一区二区三区| 日韩成人一区二区| 3d动漫精品啪啪1区2区免费| 亚洲一区二区三区视频在线| 95精品视频在线| 国产精品日韩精品欧美在线| 福利电影一区二区三区| 久久色在线观看| 精品在线观看免费| 2020国产精品| 国产成人综合亚洲网站| 久久只精品国产| 国产成人亚洲综合色影视| 国产日韩成人精品| 成人av小说网| 亚洲欧美日本在线| 一本一道久久a久久精品| 一区二区激情视频| 欧美三级视频在线播放| 五月激情综合网| 日韩免费电影网站| 国产揄拍国内精品对白| 久久青草国产手机看片福利盒子 | 欧美大尺度电影在线| 久久99久久99小草精品免视看| 精品国产伦一区二区三区免费 | 欧美精品丝袜中出| 美国一区二区三区在线播放| 日韩精品中文字幕在线不卡尤物 | 久久成人久久鬼色| 久久午夜色播影院免费高清| 国产精品123区| 国产精品久久久久永久免费观看| 精品一区免费av| 欧美曰成人黄网| 日韩精品视频网站| 精品国产欧美一区二区| 国产成人一区在线| 一区二区三区在线观看视频| 欧美日韩国产小视频在线观看| 免费视频最近日韩| 国产欧美日韩精品在线| 91视频免费观看| 亚洲一区二区三区四区五区黄| 欧美日韩精品一区二区三区四区 | 五月天激情小说综合| 亚洲精品一区二区三区在线观看 | 欧美日韩亚洲综合一区二区三区| 日韩综合在线视频| 欧美激情中文字幕一区二区| 91亚洲大成网污www| 日韩av网站免费在线| 国产欧美一区二区精品性色| 91九色02白丝porn| 九九热在线视频观看这里只有精品 | 日韩免费成人网| www.亚洲免费av| 奇米精品一区二区三区在线观看| 国产色91在线| 欧美精品在线观看播放| 国产成人av自拍| 日韩精品免费专区| 国产精品理论片| 欧美一区二区三区免费大片| 波波电影院一区二区三区| 日本视频免费一区| 亚洲特黄一级片| 久久久蜜桃精品| 欧美日韩黄色影视| a级高清视频欧美日韩| 奇米777欧美一区二区| 亚洲人妖av一区二区| 欧美刺激午夜性久久久久久久| 色综合中文字幕| 国产成人av电影在线| 乱中年女人伦av一区二区| 亚洲乱码国产乱码精品精的特点| 精品少妇一区二区三区免费观看| 91蜜桃视频在线| 国产999精品久久久久久绿帽| 日韩精品91亚洲二区在线观看| 亚洲视频一区在线观看| 久久精品人人爽人人爽| 91精品国产91久久久久久最新毛片| 99这里只有精品| 国产精品一品二品| 蜜桃av一区二区| 亚洲电影欧美电影有声小说| 18欧美乱大交hd1984| 久久综合色鬼综合色| 91精品国产91久久综合桃花| 在线国产电影不卡| 91无套直看片红桃| 成人午夜免费视频| 国产精品乡下勾搭老头1| 美女精品一区二区| 日韩和欧美一区二区| 亚洲成在人线免费| 一区二区三区波多野结衣在线观看| 国产精品视频看| 不卡一区二区三区四区| 精品午夜一区二区三区在线观看| 日韩精品国产欧美| 亚洲成人午夜影院| 亚洲一区二区三区中文字幕| 亚洲视频你懂的| 亚洲精品久久7777| 亚洲精品免费在线播放| 1000部国产精品成人观看| 国产精品免费久久久久| 国产精品每日更新|