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

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

?? cdevice.hpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? HPP
?? 第 1 頁 / 共 2 頁
字號:
//
// 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:  
//     CPipe.hpp
// 
// Abstract: Implements classes for managing USB devices
//
//                  CDevice (ADT)
//                /               \
//            CFunction        CHub (ADT)
//                            /          \
//                        CRootHub   CExternalHub
// 
// Notes: 
// 

#ifndef __CDEVICE_HPP__
#define __CDEVICE_HPP__

#include <globals.hpp>
#include <sync.hpp>
#include <pipeabs.hpp>

class CHcd;
class CDevice;
class CFunction;
class CHub;
class CRootHub;
class CExternalHub;


class CHcd;

class CDeviceGlobal {
public:
    CDeviceGlobal();
    ~CDeviceGlobal();
    BOOL Initialize(IN PVOID pHcd );
    void DeInitialize( void );
    BOOL ReserveAddress( OUT UCHAR& rAddress );
    void  FreeAddress( IN const UCHAR address );
    // Address 0 function 
    CritSec_Status Addr0LockEntry(ULONG ulTimeout) { return m_csAddress0Lock.EnterCritSec_Ex(ulTimeout); };
    void Addr0LockPrepareDelete() { m_csAddress0Lock.PrepareDeleteCritSec_Ex ();};
    void Addr0LockLeave() { m_csAddress0Lock.LeaveCritSec_Ex ();};
    //Object Countdown
    BOOL ObjCountdownInc () {return  m_objCountdown.IncrCountdown (); };
    void ObjCountdownDec () { m_objCountdown.DecrCountdown ();};
public:
    LPUSBD_ATTACH_PROC GetpUSBDAttachProc() { return m_pUSBDAttachProc; };
    LPUSBD_DETACH_PROC GetpUSBDDetachProc() { return m_pUSBDDetachProc; };
    LPVOID             GetpHcdContext() { return m_pvHcdContext ;};
private:
    PVOID m_pHcd;
    CRITICAL_SECTION     m_csFreeAddressArrayLock;
    DWORD                m_dwFreeAddressArray[4];
    CritSec_Ex           m_csAddress0Lock; // critical section when using address 0
    Countdown            m_objCountdown;   // counts stray detach threads
    // USBD.dll related variables
    HINSTANCE            m_hUSBDInstance;
    // this procedure is called when new USB devices (functions) are attached
    LPUSBD_ATTACH_PROC   m_pUSBDAttachProc;
    // this procedure is called when USB devices (functions) are detached
    LPUSBD_DETACH_PROC   m_pUSBDDetachProc;
    // OUT param for lpHcdAttachProc call
    LPVOID               m_pvHcdContext;

#ifdef DEBUG
    BOOL g_fAlreadyCalled;
#endif // DEBUG
       
};
// abstract base class for devices
class CDevice
{
public:
    // ****************************************************
    // Public Functions for CDevice
    // ****************************************************

    CDevice();

    CDevice( IN const UCHAR address,
             IN const USB_DEVICE_INFO& rDeviceInfo,
             IN const BOOL fIsLowSpeed,
             IN const UCHAR tierNumber,
             IN CDeviceGlobal * const pDeviceGlobal);

    virtual ~CDevice();
    virtual BOOL EnterOperationalState( IN CPipeAbs* const pEndpoint0Pipe ) = 0;

    virtual HCD_REQUEST_STATUS OpenPipe( IN const UINT address,
                                         IN LPCUSB_ENDPOINT_DESCRIPTOR const lpEndpointDescriptor,
                                         OUT LPUINT const lpPipeIndex ) = 0;
    
    virtual HCD_REQUEST_STATUS ClosePipe( IN const UINT address,
                                          IN const UINT pipeIndex ) = 0;

    virtual HCD_REQUEST_STATUS IssueTransfer( 
                                    IN const UINT address,
                                    IN const UINT pipeIndex,
                                    IN LPTRANSFER_NOTIFY_ROUTINE const lpStartAddress,
                                    IN LPVOID const lpvNotifyParameter,
                                    IN const DWORD dwFlags,
                                    IN LPCVOID const lpvControlHeader,
                                    IN const DWORD dwStartingFrame,
                                    IN const DWORD dwFrames,
                                    IN LPCDWORD const aLengths,
                                    IN const DWORD dwBufferSize,     
                                    IN_OUT LPVOID const lpvBuffer,
                                    IN const ULONG paBuffer,
                                    IN LPCVOID const lpvCancelId,
                                    OUT LPDWORD const adwIsochErrors,
                                    OUT LPDWORD const adwIsochLengths,
                                    OUT LPBOOL const lpfComplete,
                                    OUT LPDWORD const lpdwBytesTransfered,
                                    OUT LPDWORD const lpdwError ) = 0;

    virtual HCD_REQUEST_STATUS AbortTransfer( 
                                    IN const UINT address,
                                    IN const UINT pipeIndex,
                                    IN LPTRANSFER_NOTIFY_ROUTINE const lpCancelAddress,
                                    IN LPVOID const lpvNotifyParameter,
                                    IN LPCVOID const lpvCancelId ) = 0;


    virtual HCD_REQUEST_STATUS IsPipeHalted( IN const UINT address,
                                             IN const UINT pipeIndex,
                                             OUT LPBOOL const lpbHalted ) = 0;
    
    virtual HCD_REQUEST_STATUS ResetPipe( IN const UINT address,
                                          IN const UINT pipeIndex ) = 0;
    
    virtual void HandleDetach( void ) = 0;

#ifdef DEBUG
    void DumpDeviceDescriptor( IN const PUSB_DEVICE_DESCRIPTOR pDescriptor )const;
    void DumpConfigDescriptor( IN const PUSB_CONFIGURATION_DESCRIPTOR pDescriptor )const;
    void DumpInterfaceDescriptor( IN const PUSB_INTERFACE_DESCRIPTOR pDescriptor )const;
    void DumpEndpointDescriptor( IN const PUSB_ENDPOINT_DESCRIPTOR pDescriptor )const;
    void DumpExtendedBytes( IN const PBYTE pByteArray, IN const DWORD dwSize )const;
#endif // DEBUG

    // ****************************************************
    // Public Variables for CDevice
    // ****************************************************

private:
    // ****************************************************
    // Private Functions for CDevice
    // ****************************************************

public:
    // utility functions for managing NON_CONST_USB_CONFIGURATION structures
    BOOL CreateUsbConfigurationStructure( IN NON_CONST_USB_CONFIGURATION& rConfig, IN const PUCHAR pDataBuffer, IN const UINT dataBufferLen )const;
    void DeleteUsbConfigurationStructure( IN NON_CONST_USB_CONFIGURATION& rConfig ) const;
    // ****************************************************
    // Private Variables for CDevice
    // ****************************************************

protected:
    // ****************************************************
    // Protected Functions for CDevice
    // ****************************************************
    static DWORD CALLBACK TransferDoneCallbackSetEvent( PVOID context );
    BOOL AllocatePipeArray( void );

#ifdef DEBUG
    virtual const TCHAR* GetDeviceType( void ) const = 0;
#endif // DEBUG

    // ****************************************************
    // Protected Variables for CDevice
    // ****************************************************

    CRITICAL_SECTION            m_csDeviceLock; // critical section for device

    const UCHAR                 m_address;      // address/deviceIndex of this device
    USB_DEVICE_INFO             m_deviceInfo;   // holds device's USB descriptors
    const BOOL                  m_fIsLowSpeed;  // indicates if device is low speed
    const UCHAR                 m_tierNumber;   // indicates tier # of device (i.e. how far
                                                // it is from the root hub) See the USB spec
                                                // 1.1, section 4.1.1
    CDeviceGlobal * const       m_pDeviceGlobal;
    UCHAR                       m_maxNumPipes;      // size of m_apCPipe array
#define ENDPOINT0_CONTROL_PIPE          UCHAR(0)    // control pipe is at m_ppCPipe[ 0 ]
#define STATUS_CHANGE_INTERRUPT_PIPE    UCHAR(1)    // for hubs, status change pipe is m_ppCPipe[ 1 ]
    CPipeAbs**                     m_ppCPipe;          // array of pipes for this device
public:
    BOOL ReserveAddress( OUT UCHAR& rAddress ) { return m_pDeviceGlobal->ReserveAddress(rAddress); };
    void  FreeAddress( IN const UCHAR address ) { m_pDeviceGlobal->FreeAddress(address); };

};

// this enum is used in AttachNewDevice
enum DEVICE_CONFIG_STATUS
{
    //
    // KEEP THIS ARRAY IN SYNC WITH cszCfgStateStrings array below!
    //

    // these steps are common for both hubs and functions
    DEVICE_CONFIG_STATUS_OPENING_ENDPOINT0_PIPE,
    DEVICE_CONFIG_STATUS_USING_ADDRESS0,
    DEVICE_CONFIG_STATUS_RESET_AND_ENABLE_PORT,
    DEVICE_CONFIG_STATUS_SCHEDULING_SET_ADDRESS,
    DEVICE_CONFIG_STATUS_LEAVE_ADDRESS0,
    DEVICE_CONFIG_STATUS_SCHEDULING_GET_INITIAL_DEVICE_DESCRIPTOR,
    DEVICE_CONFIG_STATUS_SCHEDULING_GET_DEVICE_DESCRIPTOR,
    DEVICE_CONFIG_STATUS_SETUP_CONFIGURATION_DESCRIPTOR_ARRAY,
    DEVICE_CONFIG_STATUS_SCHEDULING_GET_INITIAL_CONFIG_DESCRIPTOR,
    DEVICE_CONFIG_STATUS_SCHEDULING_GET_CONFIG_DESCRIPTOR,
    DEVICE_CONFIG_STATUS_DETERMINE_CONFIG_TO_CHOOSE,
    DEVICE_CONFIG_STATUS_SCHEDULING_SET_CONFIG,
    // if ( device is a hub ) {
    DEVICE_CONFIG_STATUS_SCHEDULING_GET_INITIAL_HUB_DESCRIPTOR,
    DEVICE_CONFIG_STATUS_SCHEDULING_GET_HUB_DESCRIPTOR,
    DEVICE_CONFIG_STATUS_CREATE_NEW_HUB,
    // } else {
    DEVICE_CONFIG_STATUS_CREATE_NEW_FUNCTION,
    // }
    DEVICE_CONFIG_STATUS_INSERT_NEW_DEVICE_INTO_UPSTREAM_HUB_PORT_ARRAY,
    DEVICE_CONFIG_STATUS_SIGNAL_NEW_DEVICE_ENTER_OPERATIONAL_STATE,
    DEVICE_CONFIG_STATUS_FAILED,
    DEVICE_CONFIG_STATUS_DONE,

    DEVICE_CONFIG_STATUS_INVALID // must be last item in list
};
#ifdef DEBUG
static const TCHAR *cszCfgStateStrings[] =
{
    //
    // KEEP THIS ARRAY IN SYNC WITH DEVICE_CONFIG_STATUS enum above!
    //
    TEXT("DEVICE_CONFIG_STATUS_OPENING_ENDPOINT0_PIPE"),
    TEXT("DEVICE_CONFIG_STATUS_USING_ADDRESS0"),
    TEXT("DEVICE_CONFIG_STATUS_RESET_AND_ENABLE_PORT"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_SET_ADDRESS"),
    TEXT("DEVICE_CONFIG_STATUS_LEAVE_ADDRESS0"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_GET_INITIAL_DEVICE_DESCRIPTOR"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_GET_DEVICE_DESCRIPTOR"),
    TEXT("DEVICE_CONFIG_STATUS_SETUP_CONFIGURATION_DESCRIPTOR_ARRAY"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_GET_INITIAL_CONFIG_DESCRIPTOR"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_GET_CONFIG_DESCRIPTOR"),
    TEXT("DEVICE_CONFIG_STATUS_DETERMINE_CONFIG_TO_CHOOSE"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_SET_CONFIG"),
    // if ( device is a hub ) {
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_GET_INITIAL_HUB_DESCRIPTOR"),
    TEXT("DEVICE_CONFIG_STATUS_SCHEDULING_GET_HUB_DESCRIPTOR"),
    TEXT("DEVICE_CONFIG_STATUS_CREATE_NEW_HUB"),
    // } else {
    TEXT("DEVICE_CONFIG_STATUS_CREATE_NEW_FUNCTION"),
    // }
    TEXT("DEVICE_CONFIG_STATUS_INSERT_NEW_DEVICE_INTO_UPSTREAM_HUB_PORT_ARRAY"),
    TEXT("DEVICE_CONFIG_STATUS_SIGNAL_NEW_DEVICE_ENTER_OPERATIONAL_STATE"),
    TEXT("DEVICE_CONFIG_STATUS_FAILED"),
    TEXT("DEVICE_CONFIG_STATUS_DONE"),

    TEXT("DEVICE_CONFIG_STATUS_INVALID")
};
#define STATUS_TO_STRING(status)  (( (status) < DEVICE_CONFIG_STATUS_INVALID) ? \
                           cszCfgStateStrings[ (status) ] : TEXT("Invalid"))
#endif // DEBUG

// abstract base class for hubs
class CHub : public CDevice
{
public:
    // ****************************************************
    // Public Functions for CHub
    // ****************************************************

    CHub( IN const UCHAR address,
          IN const USB_DEVICE_INFO& rDeviceInfo,
          IN const BOOL fIsLowSpeed,
          IN const UCHAR tierNumber,
          IN const USB_HUB_DESCRIPTOR& rUsbHubDescriptor,
          IN CHcd * const pCHcd  );

    virtual ~CHub();

    void HandleDetach( void );

    HCD_REQUEST_STATUS OpenPipe( IN const UINT address,
                                 IN LPCUSB_ENDPOINT_DESCRIPTOR const lpEndpointDescriptor,
                                 OUT LPUINT const lpPipeIndex );

    HCD_REQUEST_STATUS ClosePipe( IN const UINT address,
                                  IN const UINT pipeIndex );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩亚洲综合在线| 国产精品美女视频| 久久这里只精品最新地址| 国产精品国产自产拍在线| 日本中文字幕不卡| 99国产精品国产精品久久| 91精品国产色综合久久不卡蜜臀| 国产精品拍天天在线| 日本不卡一区二区| 色哟哟一区二区三区| 国产精品狼人久久影院观看方式| 麻豆精品一区二区av白丝在线 | 亚洲永久精品大片| 粉嫩av一区二区三区在线播放| 91精品国产色综合久久不卡蜜臀 | 亚洲二区在线视频| 波多野洁衣一区| 欧美激情一区二区三区蜜桃视频| 天天综合色天天综合| 在线观看一区二区精品视频| 国产精品美女一区二区在线观看| 国产呦萝稀缺另类资源| wwww国产精品欧美| 偷偷要91色婷婷| 欧美在线看片a免费观看| 最新国产の精品合集bt伙计| 国产99一区视频免费 | 伦理电影国产精品| 欧美一区二区三区的| 日韩专区中文字幕一区二区| 欧美吻胸吃奶大尺度电影 | 成人性生交大合| 久久精品视频一区二区三区| 激情久久五月天| 久久精品无码一区二区三区| 久久99精品国产麻豆婷婷洗澡| 日韩欧美亚洲国产精品字幕久久久| 视频在线在亚洲| 欧美一级片免费看| 日韩精品电影一区亚洲| 日韩欧美的一区| 国产乱子伦一区二区三区国色天香| 欧美大片拔萝卜| 国产精品一二三四区| 国产精品拍天天在线| 在线欧美日韩国产| 日本欧美一区二区三区| 久久久精品影视| av男人天堂一区| 午夜精品免费在线| 欧美一级黄色片| 国产成人精品一区二区三区网站观看| 国产无人区一区二区三区| 成人亚洲一区二区一| 亚洲精品中文在线| 欧美一区二区三区在线看| 国产精品一二三四五| 日韩一区欧美小说| 欧美日韩精品欧美日韩精品| 青青草成人在线观看| 国产日韩欧美a| 在线观看国产精品网站| 免费成人深夜小野草| 国产精品美女久久久久高潮| 欧美色综合天天久久综合精品| 美女视频一区二区三区| 国产欧美日韩一区二区三区在线观看 | 亚洲另类色综合网站| 制服丝袜av成人在线看| 国产成人综合亚洲91猫咪| 一区二区三区欧美| 久久久三级国产网站| 在线视频观看一区| 精彩视频一区二区| 亚洲日本中文字幕区| 精品va天堂亚洲国产| 欧美专区亚洲专区| 国产大片一区二区| 美女爽到高潮91| 一区二区三区蜜桃网| 久久精品视频在线免费观看| 欧美日韩美女一区二区| zzijzzij亚洲日本少妇熟睡| 日韩精品久久理论片| 一区二区三区四区五区视频在线观看| 日韩精品一区二区三区视频在线观看| 日本二三区不卡| 成人性生交大片免费看视频在线 | 欧美成人性战久久| 欧美性欧美巨大黑白大战| 国产精品99久久久久久久女警| 午夜精品久久久久久久99水蜜桃| 国产精品久久久爽爽爽麻豆色哟哟| 欧美疯狂性受xxxxx喷水图片| 成人av在线播放网址| 国产在线精品一区在线观看麻豆| 午夜精品久久久久久| 亚洲影视在线播放| 亚洲精品视频在线看| 中文天堂在线一区| 久久精品欧美一区二区三区不卡 | 欧美午夜在线观看| 99久久婷婷国产综合精品| 国产精品538一区二区在线| 免费三级欧美电影| 日韩黄色免费电影| 日韩中文字幕区一区有砖一区| 一区二区三区在线高清| 亚洲精品中文字幕乱码三区| 最新中文字幕一区二区三区| 国产精品女同一区二区三区| 久久久久久久久99精品| 国产亚洲婷婷免费| 中文字幕欧美三区| 亚洲国产精品二十页| 国产日产欧美一区二区三区| 26uuu精品一区二区| 精品国产麻豆免费人成网站| 精品国产免费一区二区三区四区| 日韩三级av在线播放| 日韩免费一区二区| 国产亚洲欧美色| 亚洲国产激情av| 亚洲欧美日韩国产综合| 亚洲欧美一区二区三区极速播放| 亚洲欧美国产77777| 一区二区成人在线| 亚洲va在线va天堂| 久久国产乱子精品免费女| 国产精品一二三四区| 91免费版pro下载短视频| 日本二三区不卡| 欧美一级电影网站| 久久精品亚洲一区二区三区浴池| 国产欧美日韩精品在线| 亚洲人成网站影音先锋播放| 亚洲一区二区三区小说| 美国毛片一区二区| 成人美女视频在线观看18| 色先锋aa成人| 日韩一区二区三区电影| 日本一区二区高清| 亚洲香蕉伊在人在线观| 麻豆精品国产91久久久久久 | 精品在线亚洲视频| 成人丝袜18视频在线观看| 91电影在线观看| 精品久久久久99| 亚洲色图丝袜美腿| 麻豆传媒一区二区三区| 不卡的av电影| 欧美一区2区视频在线观看| 国产午夜精品一区二区| 亚洲国产精品欧美一二99| 激情图区综合网| 在线欧美日韩国产| 久久久久久久综合日本| 亚洲成人午夜电影| 春色校园综合激情亚洲| 欧美酷刑日本凌虐凌虐| 国产精品午夜在线观看| 亚洲一区二区三区不卡国产欧美| 国产精品影视在线观看| 欧美天堂亚洲电影院在线播放| 久久嫩草精品久久久精品一| 亚洲在线视频一区| 成人综合在线观看| 欧美大肚乱孕交hd孕妇| 亚洲第一久久影院| 99这里都是精品| 久久香蕉国产线看观看99| 亚洲v日本v欧美v久久精品| 99riav一区二区三区| 久久久久国产免费免费| 免费黄网站欧美| 欧美日韩午夜影院| 玉米视频成人免费看| 成人国产在线观看| 精品国产免费一区二区三区四区 | 一区二区成人在线视频| 国产91色综合久久免费分享| 日韩三级伦理片妻子的秘密按摩| 亚洲一区二区三区四区五区黄 | 亚洲午夜私人影院| 91麻豆视频网站| 欧美国产成人精品| 国产精品香蕉一区二区三区| 日韩精品一区二区三区在线| 日本在线观看不卡视频| 91超碰这里只有精品国产| 亚洲成人1区2区| 欧美日韩中文国产| 五月激情六月综合| 欧美日韩在线观看一区二区 | 国产精品二三区| 懂色一区二区三区免费观看| 国产农村妇女精品| 国产成人午夜视频| 国产无一区二区| 成人激情电影免费在线观看|