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

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

?? enum.cpp

?? It permits simultaneous use of multiple USB Serial protocols.
?? CPP
?? 第 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.
//

#include "ufnmdd.h"

#define GET_DESCRIPTOR_TYPE(x)          HIBYTE(x)
#define GET_DESCRIPTOR_INDEX(x)         LOBYTE(x)

#define USB_REQUEST_RECIPIENT_MASK      0x1F
#define GET_REQUESET_RECIPIENT(x)       ((x) & USB_REQUEST_RECIPIENT_MASK)


enum CONTROL_RESPONSE {
    CR_SUCCESS = 0,
    CR_SUCCESS_SEND_CONTROL_HANDSHAKE, // Use if no data stage
    CR_STALL_DEFAULT_PIPE,
    CR_UNHANDLED_REQUEST,
};

#ifdef DEBUG

static const LPCTSTR g_rgpszDeviceStates[] = {
    _T("detached"),
    _T("attached"),
    _T("powered"),
    _T("default"),
    _T("addressed"), 
    _T("configured"),
    _T("suspended"), 
};

// Get a textual name of a device state.
LPCTSTR
GetDeviceStateName(
    DEVICE_STATE ds
    )
{
    DEBUGCHK(ds < dim(g_rgpszDeviceStates));
    LPCTSTR psz = g_rgpszDeviceStates[ds];
    return psz;
}

#endif


// Return the configuration tree structure for the given speed.
static
PUFN_CONFIGURATION
GetConfig(
    PUFN_MDD_CONTEXT pContext,
    UFN_BUS_SPEED    Speed
    )
{
    DEBUGCHK(pContext);
    DEBUGCHK( (Speed == BS_FULL_SPEED) || (Speed == BS_HIGH_SPEED) );
    PUFN_CONFIGURATION pConfig;

    if (Speed == BS_HIGH_SPEED) {
        pConfig = &pContext->HighSpeedConfig;
    }
    else {
        pConfig = &pContext->FullSpeedConfig;
    }

    return pConfig;
}


DWORD
static
WINAPI 
EnumTransferComplete(
    PVOID pvNotifyParameter
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();

    PUFN_MDD_CONTEXT pContext = (PUFN_MDD_CONTEXT) pvNotifyParameter;    

    UFN_TRANSFER hTransfer = pContext->hEnumTransfer;
	pContext->hEnumTransfer = NULL;
    DWORD dwUsbError;
    DWORD cbTransferred;

    PREFAST_DEBUGCHK(hTransfer);

    DWORD dwErr = UfnMdd_GetTransferStatus(pContext, hTransfer, &cbTransferred, 
        &dwUsbError);
    DEBUGCHK(dwErr == ERROR_SUCCESS);

    dwErr = UfnMdd_CloseTransfer(pContext, hTransfer);
    DEBUGCHK(dwErr == ERROR_SUCCESS);

    DEBUGMSG(ZONE_USB_EVENTS, (_T("%s %u bytes written\r\n"), pszFname, 
        cbTransferred));

    if (dwUsbError == UFN_NO_ERROR) {
        PCPipe pPipe = &pContext->pPipes[0];
        pPipe->SendControlStatusHandshake();
    }

    FUNCTION_LEAVE_MSG();
    
    return ERROR_SUCCESS;
}


// Setup for a transfer.
static
VOID
SetupTx(
    PUFN_MDD_CONTEXT pContext,
    PVOID  pvBuffer,
    DWORD  cbBuffer,
    DWORD  cbRequested
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();

    ValidateContext(pContext);
    DEBUGCHK(pvBuffer);

    DWORD cbToSend = min(cbRequested, cbBuffer);
    
    DEBUGMSG(ZONE_SEND, (_T("%s Asked to send %u of %u bytes. Sending %u bytes.\r\n"),
        pszFname, cbRequested, cbBuffer, cbToSend));

    PCPipe pPipeEndpoint0 = &pContext->pPipes[0];
    
    DEBUGCHK(pContext->hEnumTransfer == NULL);
    DWORD dwErr = UfnMdd_IssueTransfer(pContext, pPipeEndpoint0, 
        &EnumTransferComplete, pContext, USB_IN_TRANSFER, cbToSend,
        pvBuffer, 0, NULL, &pContext->hEnumTransfer);

    FUNCTION_LEAVE_MSG();
}


// Handle a Get Descriptor request.
static
CONTROL_RESPONSE
ProcessGetDescriptor(
    PUFN_MDD_CONTEXT pContext,
    USB_DEVICE_REQUEST udr,
    DWORD dwMsg
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();
    
    ValidateContext(pContext);
    DEBUGCHK( (pContext->Speed == BS_HIGH_SPEED) || 
        (pContext->Speed == BS_FULL_SPEED) );

    CONTROL_RESPONSE response = CR_SUCCESS;

    if (dwMsg == UFN_MSG_PREPROCESSED_SETUP_PACKET) {
        // Nothing to do.
        goto EXIT;
    }

    DWORD dwType = GET_DESCRIPTOR_TYPE(udr.wValue);
    DWORD dwIndex = GET_DESCRIPTOR_INDEX(udr.wValue);

    PVOID pvBuffer = NULL;
    DWORD cbBuffer;

    if ( (dwType != USB_STRING_DESCRIPTOR_TYPE) && (udr.wIndex != 0) ) {
        DEBUGMSG(ZONE_ERROR, (_T("%s Invalid wIndex value %u\r\n"), 
            pszFname, udr.wIndex));
        response = CR_STALL_DEFAULT_PIPE;
    }
    else if ( (dwType == USB_DEVICE_DESCRIPTOR_TYPE) && (dwIndex == 0) ) {
        DEBUGMSG(ZONE_USB_EVENTS, (_T("%s Get device descriptor request.\r\n"),
            pszFname));

        if (pContext->Speed == BS_HIGH_SPEED) {
            pvBuffer = &pContext->HighSpeedDeviceDesc;
        }
        else {
            pvBuffer = &pContext->FullSpeedDeviceDesc;
        }
        
        cbBuffer = sizeof(USB_DEVICE_DESCRIPTOR);
    }
    else if ( (dwType == USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE) && (dwIndex == 0) ) {
        DEBUGMSG(ZONE_USB_EVENTS, (_T("%s Get device qualifier descriptor request.\r\n"),
            pszFname));
        PUSB_DEVICE_DESCRIPTOR pDeviceDesc = NULL;

        if (pContext->Speed == BS_HIGH_SPEED) {
            pDeviceDesc = &pContext->FullSpeedDeviceDesc;
        }
        else {            
            if (PddSupportsHighSpeed(pContext)) {
                pDeviceDesc = &pContext->HighSpeedDeviceDesc;
            }
        }

        if (pDeviceDesc) {
            cbBuffer = sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR);
            memcpy(&pContext->DeviceQualifierDescToSend, pDeviceDesc, cbBuffer);

            // Copy over the values that do match
            pContext->DeviceQualifierDescToSend.bLength = 
                sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR);
            pContext->DeviceQualifierDescToSend.bDescriptorType = (BYTE) dwType;
            pContext->DeviceQualifierDescToSend.bNumConfigurations = 
                pDeviceDesc->bNumConfigurations;
            pContext->DeviceQualifierDescToSend.bReserved = 0;

            pvBuffer = &pContext->DeviceQualifierDescToSend;
        }
        else {
            // We are connected at full speed and there is no support 
            // for high speed.
            response = CR_STALL_DEFAULT_PIPE;
        }
    }
    else if ( (dwType == USB_CONFIGURATION_DESCRIPTOR_TYPE) || 
              (dwType == USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE) ||
              (dwType == USB_OTG_CONFIGURATION_DESCRIPTOR_TYPE)) {
        if (dwIndex == 0) {
            DEBUGMSG(ZONE_USB_EVENTS, (_T("%s Get dwType=%d configuration descriptor request.\r\n"),
                pszFname, dwType  ) );
            
            PUSB_CONFIGURATION_DESCRIPTOR pConfigDesc;

            if (dwType == USB_CONFIGURATION_DESCRIPTOR_TYPE) {
                if (pContext->Speed == BS_HIGH_SPEED) {
                    pConfigDesc = pContext->pHighSpeedConfigDesc;
                }
                else {
                    pConfigDesc = pContext->pFullSpeedConfigDesc;
                }
            }
            else if ( (dwType == USB_OTG_CONFIGURATION_DESCRIPTOR_TYPE)) {
                // Copy over the values that do match
                pContext->USBOTGDescToSend.bLength = sizeof (USB_OTG_DESCRIPTOR);
                pContext->USBOTGDescToSend.bDescriptorType = USB_OTG_CONFIGURATION_DESCRIPTOR_TYPE;
                pContext->USBOTGDescToSend.bmAttributes = ((pContext->uOTGCapabilityBits & USBOTG_DEVICE_ENABLE)!=0?3:0);
                pvBuffer = &pContext->USBOTGDescToSend;
            }
            else {
                DEBUGCHK(dwType == USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE);
                DEBUGCHK(PddSupportsHighSpeed(pContext));
                
                if (pContext->Speed == BS_HIGH_SPEED) {
                    pConfigDesc = pContext->pFullSpeedConfigDesc;
                }
                else {
                    pConfigDesc = pContext->pHighSpeedConfigDesc;
                }
            }

            pConfigDesc->bDescriptorType = (BYTE) dwType;
            pvBuffer = pConfigDesc;
            cbBuffer = pConfigDesc->wTotalLength;
        }
        else {
            DEBUGMSG(ZONE_ERROR, (_T("%s Invalid configuration number %u\r\n"), 
                pszFname, dwIndex));
            response = CR_STALL_DEFAULT_PIPE;
        }
    }
    else if (dwType == USB_STRING_DESCRIPTOR_TYPE) {
        WORD wLang = udr.wIndex;
        DEBUGMSG(ZONE_USB_EVENTS, (_T("%s Get string descriptor request. Lang 0x%04x Idx %u\r\n"),
            pszFname, wLang, dwIndex));

        if (pContext->cStringSets) {
            PUSB_STRING_DESCRIPTOR pStringDesc = (PUSB_STRING_DESCRIPTOR) 
                pContext->rgbStringDesc;
            pStringDesc->bDescriptorType = USB_STRING_DESCRIPTOR_TYPE;
            DWORD cbData;

            if (dwIndex == 0) {
                DEBUGCHK(pContext->cStringSets <= MAX_STRING_DESC_WCHARS);

                DWORD dwLangId;
                for (dwLangId = 0; dwLangId < pContext->cStringSets; ++dwLangId) {
                    pStringDesc->bString[dwLangId] = 
                        pContext->pStringSets[dwLangId].wLangId;
                }

                cbData = pContext->cStringSets * sizeof(WCHAR);
            }
            else {
                DWORD dwLangId;
                PUFN_STRING_SET pStringSet;
                for (dwLangId = 0; dwLangId < pContext->cStringSets; ++dwLangId) {
                    pStringSet = &pContext->pStringSets[dwLangId];
                    if (pStringSet->wLangId == wLang) {
                        break;
                    }
                }

                if (dwLangId == pContext->cStringSets) {
                    // Perhaps the client wishes to process string requests.
                    DEBUGMSG(ZONE_WARNING, (_T("%s Invalid language id 0x%04x\r\n"), 
                        pszFname, wLang));
                    response = CR_UNHANDLED_REQUEST;
                }
                else {
                    --dwIndex;
                    
                    if (dwIndex < pStringSet->cStrings) {
                        LPCWSTR pszString = pStringSet->ppszStrings[dwIndex];
                        DWORD cchString = wcslen(pszString);
                        DEBUGCHK(cchString <= MAX_STRING_DESC_WCHARS);
                        // Do not copy NULL terminator.
                        wcsncpy(pStringDesc->bString, pszString, cchString);
                        cbData = cchString * sizeof(WCHAR);
                    }
                    else {
                        // Perhaps the client wishes to process string requests.
                        DEBUGMSG(ZONE_WARNING, (_T("%s Invalid string index %u\r\n"), 
                            pszFname, dwIndex));
                        response = CR_UNHANDLED_REQUEST;
                    }
                }
            }

            if (response == CR_SUCCESS) {
                pStringDesc->bLength = (UCHAR) (sizeof(USB_STRING_DESCRIPTOR) - 
                    sizeof(pStringDesc->bString) + cbData);
                pvBuffer = pStringDesc;
                cbBuffer = pStringDesc->bLength;
            }
        }
        else {
            // Perhaps the client wishes to process string requests.
            DEBUGMSG(ZONE_WARNING, (_T("%s Request for strings, but MDD has none. Index %u\r\n"), 
                pszFname, dwIndex));
            response = CR_UNHANDLED_REQUEST;
        }
    }
    else {
        DEBUGMSG(ZONE_ERROR, (_T("%s Invalid GetDescriptor request\r\n"),
            pszFname));
        response = CR_STALL_DEFAULT_PIPE;
    }

    if (pvBuffer) {
        DEBUGCHK(response == CR_SUCCESS);
        SetupTx(pContext, (PBYTE) pvBuffer, cbBuffer, udr.wLength);
    }

EXIT:
    FUNCTION_LEAVE_MSG();

    return response;
}


// Handle a Get Configuration request.
static
CONTROL_RESPONSE
ProcessGetConfiguration(
    PUFN_MDD_CONTEXT pContext,
    USB_DEVICE_REQUEST udr,
    DWORD dwMsg
    )
{
    SETFNAME();
    FUNCTION_ENTER_MSG();
    
    ValidateContext(pContext);

    if (dwMsg == UFN_MSG_PREPROCESSED_SETUP_PACKET) {
        // Nothing to do.
        goto EXIT;
    }

    const DWORD dwLength = 1;
    DEBUGCHK(dim(pContext->rgbBuffer) >= dwLength);

    DEBUGMSG(ZONE_USB_EVENTS, (_T("%s Get configuration.\r\n"), pszFname)); 

    PUFN_CONFIGURATION pConfig = GetConfig(pContext, pContext->Speed);
    BYTE bConfigurationValue = pConfig->Descriptor.bConfigurationValue;
    
    DEBUGCHK( 
        ( (pContext->deviceState == DS_ADDRESSED)  && (pContext->dwConfiguration == 0) ) ||
        ( (pContext->deviceState == DS_CONFIGURED) && (pContext->dwConfiguration == bConfigurationValue) )
        );
    
    pContext->rgbBuffer[0] = (BYTE) pContext->dwConfiguration;
    SetupTx(pContext, pContext->rgbBuffer, dwLength, udr.wLength);

    FUNCTION_LEAVE_MSG();

EXIT:
    return CR_SUCCESS;
}


// Handle a Get Interface request.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美激情资源网| 欧美三级在线播放| 久久99精品一区二区三区三区| 国产精品福利av| 国产精品久久久久影视| 国产精品久久久久7777按摩| 2021中文字幕一区亚洲| 日韩你懂的在线播放| 日韩免费高清电影| 欧美精品一区二区三区蜜臀| 欧美一级艳片视频免费观看| 欧美在线free| 欧美日韩精品三区| 91 com成人网| 欧美大片在线观看| 久久综合丝袜日本网| 国产精品电影院| 亚洲欧美日韩人成在线播放| 一区二区三区资源| 亚洲成人先锋电影| 青青青伊人色综合久久| 老司机精品视频在线| 国产一区二区不卡| 99久久综合狠狠综合久久| 97久久精品人人做人人爽50路| 99麻豆久久久国产精品免费| 色94色欧美sute亚洲线路一久 | 日韩福利电影在线| 开心九九激情九九欧美日韩精美视频电影 | 91免费版在线| 欧美三级乱人伦电影| 欧美www视频| 亚洲欧美综合网| 亚洲成人免费在线| 国产精品一区2区| 色噜噜久久综合| 日韩一区二区麻豆国产| 亚洲国产高清不卡| 日韩国产欧美在线视频| 国产美女在线精品| 欧美亚洲国产一区二区三区va| 日韩欧美一二三区| 亚洲精品国产无套在线观| 蜜臀99久久精品久久久久久软件 | 中文字幕一区二区三区不卡在线| 亚洲免费观看高清| 久久精品国产99国产精品| 91社区在线播放| 欧美成va人片在线观看| 一区二区在线观看不卡| 日本aⅴ亚洲精品中文乱码| 9久草视频在线视频精品| 日韩欧美国产小视频| 亚洲欧美日韩电影| 高清不卡在线观看av| 欧美一级片在线看| 一区二区三区高清不卡| 国产成人免费视频网站 | 色94色欧美sute亚洲线路二| 久久久国产精华| 午夜伦欧美伦电影理论片| 99re这里只有精品首页| 欧美精品一区二区三区蜜桃| 日本午夜一本久久久综合| av不卡在线观看| 国产欧美一区二区三区在线老狼| 午夜欧美在线一二页| 91亚洲午夜精品久久久久久| 久久免费看少妇高潮| 美国欧美日韩国产在线播放| 91麻豆精品国产91久久久使用方法 | 国产v综合v亚洲欧| 久久午夜色播影院免费高清| 免费观看日韩av| 在线电影院国产精品| 一区二区三区日韩欧美| 色综合天天性综合| 综合久久久久久| aaa亚洲精品| 亚洲少妇30p| 日本道精品一区二区三区| 亚洲女爱视频在线| 色欲综合视频天天天| 一区二区在线免费观看| 在线观看国产精品网站| 亚洲一区二区偷拍精品| 色噜噜狠狠成人中文综合| 亚洲综合一区在线| 欧美无砖砖区免费| 调教+趴+乳夹+国产+精品| 欧美老肥妇做.爰bbww| 天天亚洲美女在线视频| 欧美日本国产视频| 美女任你摸久久| 久久综合九色综合欧美98 | 欧美激情综合在线| 成人a区在线观看| 亚洲婷婷国产精品电影人久久| 99re8在线精品视频免费播放| 亚洲女人小视频在线观看| 欧美伊人久久大香线蕉综合69| 亚欧色一区w666天堂| 911精品国产一区二区在线| 韩国精品免费视频| 欧美国产激情二区三区| 91传媒视频在线播放| 日本欧美大码aⅴ在线播放| 久久综合九色综合97_久久久| 不卡免费追剧大全电视剧网站| 亚洲人吸女人奶水| 7777精品伊人久久久大香线蕉经典版下载| 人禽交欧美网站| 中文字幕精品一区二区精品绿巨人 | 国产精品欧美综合在线| 91麻豆成人久久精品二区三区| 亚洲国产成人va在线观看天堂| 亚洲精品一区二区三区四区高清 | 国产高清在线精品| 亚洲制服丝袜av| 欧美变态tickling挠脚心| 99久久综合99久久综合网站| 秋霞午夜av一区二区三区| 中文字幕中文字幕在线一区| 91精品福利在线一区二区三区 | 色欧美片视频在线观看| 久久精品二区亚洲w码| 日韩理论片中文av| 2欧美一区二区三区在线观看视频| 91亚洲男人天堂| 国产一区二区日韩精品| 午夜久久久久久久久久一区二区| 欧美国产禁国产网站cc| 欧美sm极限捆绑bd| 欧美日韩国产首页在线观看| 成人手机在线视频| 久久电影国产免费久久电影| 亚洲精品日韩综合观看成人91| 久久综合中文字幕| 日韩一区二区电影网| 欧美日韩一区二区三区不卡| 国产suv精品一区二区三区| 麻豆高清免费国产一区| 亚洲一二三四在线| 亚洲精品日日夜夜| 亚洲视频香蕉人妖| 中日韩av电影| 国产欧美一区二区精品仙草咪| 4438亚洲最大| 7777精品伊人久久久大香线蕉完整版 | 欧美在线免费观看视频| 91在线观看免费视频| 成人一级黄色片| 国产suv精品一区二区883| 国内精品视频666| 激情综合色播五月| 极品瑜伽女神91| 国产成人在线影院 | 中文字幕一区二区日韩精品绯色| 欧美极品少妇xxxxⅹ高跟鞋| 久久婷婷综合激情| 国产欧美视频一区二区| 国产日本亚洲高清| 国产精品久线在线观看| 中文字幕视频一区二区三区久| 中文字幕不卡在线播放| 国产精品白丝在线| 一区二区三区日本| 亚洲成人一二三| 麻豆精品视频在线| 国产一区二区三区久久悠悠色av| 国产在线精品不卡| 大尺度一区二区| 欧美亚男人的天堂| 欧美一级日韩一级| 亚洲国产精华液网站w | 欧美三片在线视频观看| 欧美日韩视频在线第一区| 欧美一区二区视频在线观看2020| 欧美一级片在线| 久久精品一级爱片| 日韩理论电影院| 琪琪久久久久日韩精品| 精品一区二区三区蜜桃| 成人av网站在线| 欧美在线观看视频一区二区三区| 欧美一区欧美二区| 欧美极品少妇xxxxⅹ高跟鞋 | 亚洲三级在线免费| 偷拍自拍另类欧美| 国产成人一级电影| 欧美亚洲日本一区| 欧美精品一区二区三区蜜臀| 国产精品国产三级国产普通话蜜臀| 亚洲黄色小视频| 国内精品久久久久影院一蜜桃| 色婷婷久久久亚洲一区二区三区| 欧美一级高清片在线观看| 国产午夜亚洲精品不卡| 亚洲成a天堂v人片| 成人禁用看黄a在线|