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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? cdevice.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
//
// 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:
//     CDevice.cpp
// Abstract:
//     This file manages the USB devices
//
//                  CDevice (ADT)
//                /               \
//            CFunction        CHub (ADT)
//                            /          \
//                        CRootHub   CExternalHub
//
// Notes:
//


#include "cdevice.hpp"
#include "hcd.hpp"
// address array variables - initially set to have address 0 used
// because it is reserved for the root hub (besides, no real device
// can permanently use addr0, since it is used at set address time)
CDeviceGlobal::CDeviceGlobal( ):m_objCountdown(0)
{

    m_dwFreeAddressArray[0]=0x00000001;
    m_dwFreeAddressArray[1] = m_dwFreeAddressArray[2] = m_dwFreeAddressArray[3] = 0x00000000;
    
    m_hUSBDInstance = NULL;
    m_pUSBDAttachProc = NULL;
    m_pUSBDDetachProc = NULL;
    m_pvHcdContext = NULL;
#ifdef DEBUG
    g_fAlreadyCalled = FALSE;
#endif // DEBUG
    //InitCritSec_Ex( &m_csAddress0Lock );
    InitializeCriticalSection( &m_csFreeAddressArrayLock );
};
CDeviceGlobal::~CDeviceGlobal()
{
    DeInitialize();
    // all devices, and hence all addresses, should have been freed by now
    DeleteCriticalSection( &m_csFreeAddressArrayLock );
    //DeleteCritSec_Ex( &m_csAddress0Lock );
}
// ******************************************************************
BOOL CDeviceGlobal::Initialize(IN PVOID pHcd)
//
// Purpose: Initialize any static variables associated with
//          CDevice, and establish link to USBD
//
// Parameters: pHcd - pointer to the Host Controller Driver object which
//                    we pass to USBD
//
// Returns: TRUE
//
// Notes: This function should be called only once from CHcd::Initialize
// ******************************************************************
{
    DEBUGMSG( ZONE_INIT, (TEXT("+CDeviceGlobal::Initialize\n")));
    m_pHcd=pHcd;
#ifdef DEBUG
    DEBUGCHK( !g_fAlreadyCalled );
    g_fAlreadyCalled = TRUE;
#endif // DEBUG

    DEBUGCHK( DWORD(8 * sizeof( m_dwFreeAddressArray )) == DWORD(USB_MAX_ADDRESS + 1) &&
              8 * sizeof( m_dwFreeAddressArray[0] ) == 32 &&
              m_dwFreeAddressArray[ 0 ] == 0x00000001 &&
              m_dwFreeAddressArray[ 1 ] == 0x00000000 &&
              m_dwFreeAddressArray[ 2 ] == 0x00000000 &&
              m_dwFreeAddressArray[ 3 ] == 0x00000000 );

    m_csAddress0Lock.Initialize();
    m_objCountdown.UnlockCountdown ();
    // establish links to USBD.dll
    {
        // this procedure is called to establish a link to USBD
        LPUSBD_HCD_ATTACH_PROC  lpHcdAttachProc = NULL;
        // this is defined in uhcddrv.cpp
        extern HCD_FUNCS gc_HcdFuncs;

        DEBUGCHK( m_pHcd != NULL &&
                  m_hUSBDInstance == NULL &&
                  m_pUSBDDetachProc == NULL &&
                  m_pUSBDAttachProc == NULL &&
                  m_pvHcdContext == NULL );

        m_hUSBDInstance = LoadDriver(TEXT("USBD.DLL"));
        if ( m_hUSBDInstance == NULL ) {
            DEBUGMSG(ZONE_ERROR,(TEXT("-CDevice::Initialize - Could not load USBD.DLL\r\n")));
            return FALSE;
        }
        lpHcdAttachProc = (LPUSBD_HCD_ATTACH_PROC) GetProcAddress(m_hUSBDInstance, TEXT("HcdAttach"));
        m_pUSBDAttachProc = (LPUSBD_ATTACH_PROC) GetProcAddress(m_hUSBDInstance, TEXT("HcdDeviceAttached"));
        m_pUSBDDetachProc = (LPUSBD_DETACH_PROC) GetProcAddress(m_hUSBDInstance, TEXT("HcdDeviceDetached"));
        if ( m_pUSBDAttachProc == NULL ||
             m_pUSBDDetachProc == NULL ||
             lpHcdAttachProc == NULL ||
             (*lpHcdAttachProc)(m_pHcd, &gc_HcdFuncs,  &m_pvHcdContext) == FALSE ) {

            DEBUGMSG(ZONE_ERROR, (TEXT("-CDevice::Initialize - Could not establish USBD links\n")));
            return FALSE;
        }
        DEBUGCHK( m_pvHcdContext != NULL );
    }


    DEBUGMSG( ZONE_INIT, (TEXT("-CDevice::Initialize, success!\n")));
    return TRUE;
}

// ******************************************************************
void CDeviceGlobal::DeInitialize( )
//
// Purpose: Delete any static variables associated with CDevice
//
// Parameters: None
//
// Returns: Nothing
//
// Notes: This function should be called only once from CHcd::~CHcd
// ******************************************************************
{
    DEBUGMSG( ZONE_INIT, (TEXT("+CDevice::DeInitialize\n")));

#ifdef DEBUG
    DEBUGCHK(g_fAlreadyCalled == TRUE);
    g_fAlreadyCalled = FALSE;
#endif // DEBUG

    // wait for any stray detach threads
    // This can block waiting for a callback into a client driver to return.
    // Since callbacks aren't supposed to block this oughtn't cause deadlock,
    // but a misbehaving client driver can cause us serious grief.
    // Nonetheless, not waiting means we might free USBD.DLL while it's still in use.
    //DeleteCountdown(&m_objCountdown);
    m_objCountdown.WaitForCountdown( TRUE);

    // unload USBD.dll
    if ( m_hUSBDInstance ) {
        LPUSBD_HCD_DETACH_PROC lpHcdDetachProc;
        lpHcdDetachProc = (LPUSBD_HCD_DETACH_PROC) GetProcAddress(m_hUSBDInstance, TEXT("HcdDetach"));
        if ( lpHcdDetachProc != NULL ) {
            (*lpHcdDetachProc)(m_pvHcdContext);
        }
        FreeLibrary( m_hUSBDInstance );
        m_hUSBDInstance = NULL;
    }
    m_pUSBDAttachProc = NULL;
    m_pUSBDDetachProc = NULL;
    m_pvHcdContext = NULL;

    m_dwFreeAddressArray[0] = 0x00000001;
    m_dwFreeAddressArray[1] = m_dwFreeAddressArray[2] = m_dwFreeAddressArray[3] = 0x00000000;


    DEBUGMSG( ZONE_INIT, (TEXT("-CDevice::DeInitialize\n")));
}

// ******************************************************************
BOOL CDeviceGlobal::ReserveAddress( OUT UCHAR& rAddress )
//
// Purpose: Finds an unused USB address (1-127), marks it as used, and
//          returns the address
//
// Parameters: rAddress - OUT parameter, which is set to a free address
//
// Returns: TRUE if rAddress set to a valid free address, else FALSE
//
// Notes: Address 0 is permanently marked as used. This is reserved for
//        the root hub.
// ******************************************************************
{
    DEBUGMSG( ZONE_ATTACH && ZONE_VERBOSE, (TEXT("+CDeviceGlobal::ReserveAddress\n")) );

    BOOL fSuccess = FALSE;

    EnterCriticalSection( &m_csFreeAddressArrayLock );

    // the address has 7 bits:
    //
    // xxyyyyyb
    //
    // xxb is the index into the m_dwFreeAddressArray (0-3)
    // yyyyyb is the bit of the m_dwFreeAddressArray[xxb] DWORD
    // that the address corresponds to

    // address 0 should always be marked used
    DEBUGCHK(m_dwFreeAddressArray[0] & 1 );

    for ( UCHAR address = 1; address <= USB_MAX_ADDRESS; address++ ) {
        const UCHAR index = (address >> 5); // 5 == log base 2 of 32
        const UCHAR bit = address & (32 - 1); // 32 == # of bits in DWORD
        if ( (m_dwFreeAddressArray[ index ] & (1 << bit)) == 0 ) {
            // this address is free
            fSuccess = TRUE;
            rAddress = address;
            // mark address as used
            m_dwFreeAddressArray[ index ] |= (1 << bit);
            break;
        }
    }
    LeaveCriticalSection( &m_csFreeAddressArrayLock );

    DEBUGMSG( ZONE_ATTACH && ZONE_VERBOSE, (TEXT("-CDevice::ReserveAddress, returning rAddress %d, success = %d\n"), rAddress, fSuccess ) );
    return fSuccess;
}
// ******************************************************************
void CDeviceGlobal::FreeAddress( IN const UCHAR address )
//
// Purpose: Return address to the list of unused USB device addresses
//
// Parameters: address - address to free
//
// Returns: Nothing
//
// Notes:
// ******************************************************************
{
    DEBUGMSG( ZONE_ATTACH && ZONE_VERBOSE, (TEXT("+CDeviceGlobal::FreeAddress - address = %d\n"), address) );

    EnterCriticalSection( &m_csFreeAddressArrayLock );

    // the address has 7 bits:
    //
    // xxyyyyyb
    //
    // xxb is the index into the m_dwFreeAddressArray (0-3)
    // yyyyyb is the bit of the m_dwFreeAddressArray[xxb] DWORD
    // that the address corresponds to

    const UCHAR index = (address >> 5); // 5 == log base 2 of 32
    const UCHAR bit = address & (32 - 1); // 32 == # of bits in DWORD

    // make sure this address is marked as used
    DEBUGCHK( index < 4 &&
              (m_dwFreeAddressArray[ index ] & ( 1 << bit )) );

    // free this address
    m_dwFreeAddressArray[ index ] &= ~(1 << bit);

    LeaveCriticalSection( &m_csFreeAddressArrayLock );

    DEBUGMSG( ZONE_ATTACH && ZONE_VERBOSE, (TEXT("-CDevice::FreeAddress - address = %d\n"), address) );
}

// ******************************************************************
DWORD CALLBACK CDevice::TransferDoneCallbackSetEvent( PVOID context )
//
// Purpose: This function is a callback for the CPipe class. When a
//          transfer completes, and this function was set in the
//          lpStartAddress field of IssueTransfer, we will be called
//
// Parameters: context - HANDLE to an event we should signal
//
// Returns: 0
//
// Notes: Calling this function directly is rather useless (it will
//        just have the same effect as SetEvent( context ) ), so
//        it should only be used as a callback
// ******************************************************************
{

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
毛片基地黄久久久久久天堂| 91免费视频观看| 午夜伊人狠狠久久| 亚洲乱码国产乱码精品精可以看 | 一个色在线综合| 这里是久久伊人| 在线精品视频免费观看| 99久久精品99国产精品| 国产**成人网毛片九色| 国产精品羞羞答答xxdd| 精品亚洲porn| 国产福利电影一区二区三区| 国产精品一区二区x88av| 精品一区二区三区在线播放| 奇米精品一区二区三区在线观看一| 亚洲一区二区在线免费看| 国产精品第五页| 国产欧美精品国产国产专区| 国产午夜一区二区三区| 久久精品欧美一区二区三区麻豆| 久久综合久久鬼色中文字| 亚洲国产岛国毛片在线| 欧美极品美女视频| 国产精品久久久久久亚洲伦| 国产精品日产欧美久久久久| 国产精品视频在线看| 51精品秘密在线观看| xf在线a精品一区二区视频网站| 日韩精品在线看片z| 久久久久久久免费视频了| 国产日韩成人精品| 亚洲欧洲日产国码二区| 亚洲成av人影院在线观看网| 午夜国产不卡在线观看视频| 日韩和欧美一区二区三区| 欧美a级理论片| 国产一区二区美女诱惑| 国产一区二区三区在线观看精品| 91天堂素人约啪| 在线观看区一区二| 日韩一级精品视频在线观看| 亚洲精品在线免费观看视频| 国产精品少妇自拍| 夜色激情一区二区| 亚洲成av人影院在线观看网| 久久精品国产999大香线蕉| 国产精品小仙女| 色94色欧美sute亚洲13| 91精品一区二区三区在线观看| 3d动漫精品啪啪| 中文字幕一区二区三区在线播放 | 亚洲成av人影院| 麻豆国产精品一区二区三区| 国产成人精品免费网站| 在线观看一区日韩| 欧美mv日韩mv国产网站app| 国产目拍亚洲精品99久久精品| 一区二区成人在线观看| 久久99热狠狠色一区二区| 欧美亚洲国产一区在线观看网站 | 午夜精品免费在线观看| 高清成人在线观看| 91精品国产麻豆国产自产在线 | 青青草视频一区| 成av人片一区二区| 精品久久久久久久人人人人传媒| 亚洲欧美激情视频在线观看一区二区三区 | 欧美性大战xxxxx久久久| 国产视频不卡一区| 免费观看一级特黄欧美大片| 在线免费观看不卡av| 日本一区二区三区电影| 日韩 欧美一区二区三区| 一本到不卡免费一区二区| 国产性做久久久久久| 麻豆国产精品一区二区三区 | 亚洲欧美日韩国产手机在线| 国产一区日韩二区欧美三区| 91精品国产免费| 香蕉久久夜色精品国产使用方法| 91麻豆国产香蕉久久精品| 国产日韩欧美精品一区| 天堂久久一区二区三区| 欧洲另类一二三四区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 免费人成在线不卡| 欧美嫩在线观看| 亚洲bdsm女犯bdsm网站| 欧美亚洲禁片免费| 亚洲男人的天堂一区二区| 99久久精品国产一区| 国产精品久久久久久久久免费丝袜| 国产老肥熟一区二区三区| 日韩视频永久免费| 美日韩一区二区| 日韩一区二区三区免费看| 五月天激情综合网| 欧美日韩在线观看一区二区 | av一二三不卡影片| 日本一二三不卡| 成人精品视频一区| 欧美激情一区三区| 国产91精品久久久久久久网曝门 | 裸体在线国模精品偷拍| 欧美一区二区三区白人| 免费黄网站欧美| 欧美电视剧在线观看完整版| 久久精品国产网站| 精品国产乱码久久久久久闺蜜| 久久精品国产999大香线蕉| 日韩欧美一级精品久久| 蜜桃视频免费观看一区| 精品美女被调教视频大全网站| 久久99热这里只有精品| 久久综合999| 高清视频一区二区| 亚洲免费视频中文字幕| 欧美视频三区在线播放| 日本一道高清亚洲日美韩| 国产精品乱码妇女bbbb| 成人亚洲一区二区一| 1区2区3区欧美| 欧美三级三级三级| 青青草精品视频| 国产视频一区在线播放| 91亚洲精品久久久蜜桃| 亚洲福利一区二区三区| 欧美www视频| 成人性生交大片免费看视频在线| 亚洲欧美日韩一区二区| 制服丝袜成人动漫| 国内成+人亚洲+欧美+综合在线| 国产欧美一区二区三区在线看蜜臀| 91在线视频在线| 日韩精品国产精品| 国产日韩欧美精品电影三级在线| 色婷婷av一区二区三区软件| 婷婷国产在线综合| 久久久久久久久久久电影| 99精品国产热久久91蜜凸| 婷婷国产在线综合| 欧美高清在线精品一区| 欧美日韩一区二区三区在线| 狠狠色伊人亚洲综合成人| 中文字幕一区二区在线播放| 这里是久久伊人| 成人av电影观看| 日本美女一区二区三区视频| 欧美韩国日本不卡| 欧美猛男超大videosgay| 国产91丝袜在线播放| 亚洲成a人v欧美综合天堂| 国产嫩草影院久久久久| 777xxx欧美| 91论坛在线播放| 国产精品综合视频| 亚洲成a人在线观看| 国产精品视频看| 日韩三级在线免费观看| 色婷婷精品大在线视频| 国产乱人伦精品一区二区在线观看 | 欧美一区二区三区免费视频 | 884aa四虎影成人精品一区| 国产福利不卡视频| 日本aⅴ精品一区二区三区| 国产精品国产三级国产| 精品日韩一区二区三区免费视频| 在线视频一区二区三区| 国产电影精品久久禁18| 美女在线视频一区| 亚洲一区二区黄色| **性色生活片久久毛片| 久久老女人爱爱| 日韩一区二区三区免费看| 欧美亚洲动漫精品| 99久久伊人久久99| 国产福利不卡视频| 九一九一国产精品| 日韩高清在线一区| 亚洲最新在线观看| 日韩毛片在线免费观看| 亚洲国产wwwccc36天堂| 国产欧美日韩视频在线观看| 日韩欧美一区中文| 51精品国自产在线| 欧美猛男超大videosgay| 日本乱码高清不卡字幕| 波多野结衣在线aⅴ中文字幕不卡| 国产另类ts人妖一区二区| 蜜臀久久久99精品久久久久久| 香蕉成人伊视频在线观看| 亚洲一区影音先锋| 亚洲美女电影在线| 亚洲男人的天堂av| 亚洲欧美怡红院| 国产精品毛片大码女人| 久久精品人人做人人爽人人| 久久久国产一区二区三区四区小说| 精品国产乱码久久久久久图片| 日韩欧美在线综合网|