亚洲欧美第一页_禁久久精品乱码_粉嫩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久久夜色精品国产网站| 国产日产欧产精品推荐色| 欧美电影免费观看高清完整版在线 | 中文字幕一区在线观看视频| 午夜精品123| 成+人+亚洲+综合天堂| 精品久久久久香蕉网| 亚洲免费av网站| 国产成人无遮挡在线视频| 欧美福利电影网| 一二三区精品视频| 99久久精品一区| 国产日本亚洲高清| 国产一区二区电影| 精品国产电影一区二区| 热久久国产精品| 91麻豆精品国产91久久久资源速度| 亚洲欧美综合色| 成人av在线资源网| 欧美国产日韩a欧美在线观看| 精品在线播放免费| 日韩免费看网站| 免费观看在线综合| 欧美v国产在线一区二区三区| 美女视频一区在线观看| 欧美群妇大交群的观看方式| 夜夜精品视频一区二区 | 捆绑调教美女网站视频一区| 一本高清dvd不卡在线观看 | 日韩色在线观看| 美脚の诱脚舐め脚责91 | 91成人国产精品| 一区二区三区免费| 欧美性猛交一区二区三区精品| 一区二区三区日韩欧美精品| 91视频观看视频| 一区二区三区在线视频观看58| 在线影视一区二区三区| 亚洲国产精品久久人人爱蜜臀| 欧美日韩在线直播| 三级欧美在线一区| 精品国产一区二区国模嫣然| 精品无人区卡一卡二卡三乱码免费卡| 欧美一卡2卡3卡4卡| 狠狠色狠狠色综合| 国产蜜臀97一区二区三区| 成人免费黄色在线| 亚洲制服丝袜一区| 日韩精品一区二| 不卡视频一二三| 一区二区激情视频| 日韩一区二区三区四区| 国产精一品亚洲二区在线视频| 国产精品久久久久久久第一福利| 97国产精品videossex| 五月婷婷激情综合网| 久久一夜天堂av一区二区三区| 成人av在线网| 日本特黄久久久高潮 | 欧美大片免费久久精品三p | 国产精品久久久久一区二区三区共| 91视视频在线观看入口直接观看www | 亚洲欧美日韩国产综合在线| 欧美日韩在线免费视频| 日韩精品1区2区3区| 国产性天天综合网| 91激情五月电影| 国产一区二区三区在线看麻豆| 国产精品色婷婷久久58| 欧美妇女性影城| 99视频一区二区| 蜜臀av性久久久久蜜臀aⅴ| 国产精品三级久久久久三级| 7777女厕盗摄久久久| 精品乱码亚洲一区二区不卡| 99免费精品在线| 久久er99热精品一区二区| 亚洲色图在线播放| 久久久久青草大香线综合精品| 色94色欧美sute亚洲线路一ni | 99久久精品国产观看| 国产一区二区电影| 亚洲欧美日韩国产综合| 久久一留热品黄| 欧美日韩视频专区在线播放| 成人动漫av在线| 麻豆中文一区二区| 香蕉久久夜色精品国产使用方法| 国产亚洲一区二区在线观看| 欧美人牲a欧美精品| 91麻豆免费观看| 成人中文字幕电影| 国产一区在线视频| 麻豆91在线播放| 日韩国产一区二| 亚洲va国产天堂va久久en| 国产精品久久久久久久久快鸭| 精品国产污污免费网站入口| 欧美片网站yy| 欧美性感一区二区三区| 91在线国产福利| 成人免费毛片a| 风流少妇一区二区| 国产91丝袜在线观看| 国产在线国偷精品产拍免费yy| 午夜免费欧美电影| 午夜视频在线观看一区二区三区| 亚洲乱码一区二区三区在线观看| 国产欧美日韩另类一区| 欧美激情一区二区三区蜜桃视频| 26uuuu精品一区二区| 精品国偷自产国产一区| 26uuu精品一区二区三区四区在线| 日韩视频免费观看高清在线视频| 欧美另类z0zxhd电影| 欧美猛男超大videosgay| 538在线一区二区精品国产| 欧美日韩一级二级| 欧美一区日韩一区| 日韩精品一区二区三区四区| 欧美xxx久久| www欧美成人18+| 国产亚洲va综合人人澡精品| 国产午夜亚洲精品午夜鲁丝片| 久久精品一区二区三区不卡牛牛 | 亚洲视频一区二区免费在线观看| 中文字幕精品三区| 亚洲卡通欧美制服中文| 亚洲成人av电影在线| 美女诱惑一区二区| 国产成人av在线影院| 91尤物视频在线观看| 欧美日韩精品一区二区三区蜜桃| 欧美精选在线播放| 久久久青草青青国产亚洲免观| 国产精品毛片久久久久久| 亚洲最大的成人av| 麻豆极品一区二区三区| 成人污视频在线观看| 欧洲精品在线观看| 日韩一级二级三级精品视频| 久久精品99国产精品| 国产一区二区免费在线| 91麻豆免费视频| 日韩午夜精品电影| 国产精品高潮呻吟久久| 亚洲成人午夜电影| 国产精品1区2区3区| 色综合亚洲欧洲| 日韩欧美一二区| 亚洲女同一区二区| 久久精工是国产品牌吗| 91免费在线看| 精品精品欲导航| 亚洲蜜桃精久久久久久久| 久久国产精品72免费观看| 99国产精品视频免费观看| 日韩三级高清在线| 一二三四社区欧美黄| 国产成人丝袜美腿| 日韩一级视频免费观看在线| 亚洲女人的天堂| 国产成人综合在线| 日韩欧美自拍偷拍| 亚洲一级不卡视频| 成人av在线资源| 久久久不卡网国产精品一区| 亚洲国产精品久久久男人的天堂| 成人18精品视频| 精品理论电影在线观看| 丝袜诱惑制服诱惑色一区在线观看| 国产sm精品调教视频网站| 欧美一区二区三区四区五区| 亚洲天堂成人网| 丁香一区二区三区| 久久综合精品国产一区二区三区| 亚洲成av人**亚洲成av**| 成人禁用看黄a在线| 26uuu亚洲综合色欧美| 日本欧美在线看| 欧美日产国产精品| 亚洲国产成人tv| 色嗨嗨av一区二区三区| 亚洲日本电影在线| 暴力调教一区二区三区| 国产日韩精品久久久| 精品亚洲欧美一区| 欧美成人a在线| 日本vs亚洲vs韩国一区三区| 欧美日韩一区三区四区| 亚洲欧美日韩一区| 日本精品视频一区二区三区| 成人欧美一区二区三区视频网页| 国产不卡高清在线观看视频| 久久综合久色欧美综合狠狠| 国产自产2019最新不卡| 欧美精品一区二区三区四区 | 亚洲精品在线一区二区| 久久激五月天综合精品| 精品国产91九色蝌蚪|