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

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

?? usbmsc.c

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? C
?? 第 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.
//
/*++

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: 

    usbmsc.c

Abstract:

    USB Mass Storage Class.
        Bulk-Only Transport 1.0 (BOT)
        Control/Bulk/Interrupt Transport 1.0 (CBIT and CBT)

Functions:

Notes: 

--*/


#include "usbmscp.h"

#include "bot.h"
#include "cbit.h"

#include <Pkfuncs.h> // for LoadDriver


LONG g_NumDevices = 0;


#ifdef DEBUG
DBGPARAM dpCurSettings = {
    TEXT("USBMSC"), {
    TEXT("Errors"),    TEXT("Warnings"),  TEXT("Init"),        TEXT("Trace"),
    TEXT("USB_PARSE"), TEXT("USB_INIT"),  TEXT("USB_CONTROL"), TEXT("USB_BULK"),
    TEXT("USB_INT"),   TEXT("BOT"),       TEXT("CBI"),         TEXT("CBIT"),
    TEXT("TIME"),      TEXT("Undefined"), TEXT("Undefined"),   TEXT("Undefined")  
    },
    0x0003 // ZONE_WRN|ZONE_ERR
};
#endif  // DEBUG

//*****************************************************************************
//
// F U N C T I O N    P R O T O T Y P E S
//
//*****************************************************************************

LPCUSB_INTERFACE
ParseUsbDescriptors(
   USB_HANDLE       hUsbDevice,
   LPCUSB_FUNCS     UsbFuncs,
   LPCUSB_INTERFACE CurInterface,
   LPUSHORT         ConfigIndex
   );

VOID
RemoveDeviceContext(
   PUSBMSC_DEVICE pUsbDevice
   );

BOOL
SetUsbInterface(
   PUSBMSC_DEVICE pUsbDevice,
   LPCWSTR        UniqueDriverId
   );

BOOL WINAPI 
UsbDeviceNotify(
   LPVOID lpvNotifyParameter,
   DWORD  dwCode,
   LPDWORD *dwInfo1,
   LPDWORD *dwInfo2,
   LPDWORD *dwInfo3,
   LPDWORD *dwInfo4
   );

BOOL
UsbDeviceTest(
   PUSBMSC_DEVICE  pUsbDevice
   );

DWORD 
GetMaxLUN(HANDLE hTransport, PUCHAR pLun);

PVOID CreateBulkTransferMgr(
    LPCUSB_FUNCS  lpUsbFuncs, USB_PIPE hPipe, LPCUSB_ENDPOINT_DESCRIPTOR lpEndpointDesc,LPCTSTR szUniqueDriverId
    );

VOID DeleteBulkTransferMgr(LPVOID lpContent);

BOOL 
DllEntry(
   HANDLE hDllHandle, 
   DWORD  dwReason, 
   LPVOID lpreserved
   ) 
{
    UNREFERENCED_PARAMETER(hDllHandle);
    UNREFERENCED_PARAMETER(lpreserved);

    switch (dwReason) {

      case DLL_PROCESS_ATTACH:
           DEBUGREGISTER((HINSTANCE)hDllHandle);
	   DisableThreadLibraryCalls((HMODULE) hDllHandle);
           break;

      case DLL_PROCESS_DETACH:
           break;

      default:
        break;
    }
   
    return TRUE;
}


//*****************************************************************************
//
//  U S B D      I N T E R F A C E
//
//*****************************************************************************
BOOL 
USBInstallDriver(
   LPCWSTR szDriverLibFile 
   )
{
    HKEY  hKey = NULL;
    BOOL  bRc;
    UCHAR i;

    const WCHAR wsUsbDeviceID[] = CLASS_NAME_SZ;

    USB_DRIVER_SETTINGS usbDriverSettings = { USBMSC_DRIVER_SETTINGS };

    // reg entries for Class driver
    REG_VALUE_DESCR rdClassValues[] = {
        DLL_SZ, REG_SZ, 0, (PUCHAR)(DRIVER_NAME_SZ),
        NULL, 0, 0, NULL
    };

    // reg entries for Disk SubClass drivers
    WCHAR wsSubClassRegKey[sizeof(CLIENT_REGKEY_SZ)+16] = CLIENT_REGKEY_SZ;
    const ULONG index = (sizeof(CLIENT_REGKEY_SZ)-2)/2;
    DWORD dwIoctl = DEFAULT_IOCTL;

    REG_VALUE_DESCR rdSubClassValues[] = {
        DLL_SZ,    REG_SZ,    0, (PUCHAR)(DEFAULT_DISK_SZ),
        PREFIX_SZ, REG_SZ,    0, (PUCHAR)(DEFAULT_PREFIX_SZ),
        FSD_SZ,    REG_SZ,    0, (PUCHAR)(DEFAULT_FSD_SZ),
        FOLDER_SZ, REG_SZ,    0, (PUCHAR)(DEFAULT_FOLDER_SZ),
        IOCTL_SZ,  REG_DWORD, 0, (PUCHAR)(&dwIoctl),
        NULL, 0, 0, NULL
    };

    DWORD dwReset   = RESET_TIMEOUT;
    DWORD dwCommand = COMMAND_BLOCK_TIMEOUT;
    DWORD dwStatus  = COMMAND_STATUS_TIMEOUT;

    REG_VALUE_DESCR rdTimeouts[] = {
        RESET_TIMEOUT_SZ,           REG_DWORD, 0, (PUCHAR)(&dwReset),
        COMMAND_BLOCK_TIMEOUT_SZ,   REG_DWORD, 0, (PUCHAR)(&dwCommand),
        COMMAND_STATUS_TIMEOUT_SZ,  REG_DWORD, 0, (PUCHAR)(&dwStatus),
        NULL, 0, 0, NULL
    };


    DEBUGMSG( ZONE_USB_INIT, (TEXT("USBMSC>USBInstallDriver(%s)\n"), szDriverLibFile ));

    //
    // register with USBD
    //   
    bRc = RegisterClientDriverID( wsUsbDeviceID );
    if ( !bRc ) {
        DEBUGMSG( ZONE_ERR, (TEXT("RegisterClientDriverID error:%d\n"), GetLastError()));
        return FALSE;
    }

    bRc = RegisterClientSettings( szDriverLibFile,
                                 wsUsbDeviceID,
                                 NULL, 
                                 &usbDriverSettings );

    if ( !bRc ) {
        DEBUGMSG( ZONE_ERR, (TEXT("RegisterClientSettings error:%d\n"), GetLastError()));
        return FALSE;
    }

    //
    // Add our default Timeout values to the reg
    //
    if ( !GetSetKeyValues( wsSubClassRegKey,
                               &rdTimeouts[0],
                               SET,
                               TRUE ) ) {

        DEBUGMSG( ZONE_ERR, (TEXT("GetSetKeyValues failed!\n")));
        TEST_TRAP();
    }

    //
    // Create our Disk SubClass Reg entries.
    //
    for (i = USBMSC_SUBCLASS_RBC; i <= USBMSC_SUBCLASS_SCSI; i++) {
        
        swprintf( &wsSubClassRegKey[index], TEXT("\\%d"), i );
        
        if ( !GetSetKeyValues( wsSubClassRegKey,
                                   rdSubClassValues,
                                   SET,
                                   FALSE ) ) {

            DEBUGMSG( ZONE_ERR, (TEXT("GetSetKeyValues failed!\n")));
            TEST_TRAP();
        }
    }

    DEBUGMSG( ZONE_USB_INIT, (TEXT("USBMSC<USBInstallDriver:%d\n"), bRc ));

    return bRc;
}


BOOL 
USBUnInstallDriver(
   VOID
   )
{
   BOOL bRc;

   const WCHAR wsUsbDeviceID[] = CLASS_NAME_SZ;
   
   USB_DRIVER_SETTINGS usbDriverSettings = { USBMSC_DRIVER_SETTINGS };

   DEBUGMSG( ZONE_USB_INIT, (TEXT("USBMSC>USBUnInstallDriver\n")));

   TEST_TRAP();

   bRc = UnRegisterClientSettings( wsUsbDeviceID,
                                   NULL,
                                   &usbDriverSettings );

   bRc = bRc & UnRegisterClientDriverID( wsUsbDeviceID );

   DEBUGMSG( ZONE_USB_INIT, (TEXT("USBMSC<USBUnInstallDriver:%d\n"), bRc));

   return bRc;
}


BOOL
USBDeviceAttach(
   USB_HANDLE       hDevice,
   LPCUSB_FUNCS     UsbFuncs,      
   LPCUSB_INTERFACE UsbInterface,
   LPCWSTR          UniqueDriverId,   
   LPBOOL           AcceptControl,      
   LPCUSB_DRIVER_SETTINGS UsbDriverSettings,
   DWORD Unused
   )
{
    BOOL             bRc = TRUE;
    ULONG            ulConfigIndex = 0;
    PUSBMSC_DEVICE   pUsbDevice = NULL;
    LPCUSB_INTERFACE pUsbInterface = NULL;
    PUSBDISK_ATTACH  DiskAttach;
    UCHAR bInterfaceSubClass;
    UCHAR bTempInterfaceSubClass = 0xFF; // invalid subclass
    UCHAR uMaxLun;
    UINT    uiIndex; // Working Unit.

    // reg entries for Disk SubClass drivers
    WCHAR wsSubClassRegKey[sizeof(CLIENT_REGKEY_SZ)+16] = CLIENT_REGKEY_SZ;
    const ULONG index = (sizeof(CLIENT_REGKEY_SZ)-2)/2;
    REG_VALUE_DESCR RegVal[2] = {0};
    WCHAR wsDriverName[MAX_DLL_LEN];

    REG_VALUE_DESCR rdTimeouts[] = {
        RESET_TIMEOUT_SZ,           REG_DWORD, sizeof(DWORD), (PUCHAR)(NULL),
        COMMAND_BLOCK_TIMEOUT_SZ,   REG_DWORD, sizeof(DWORD), (PUCHAR)(NULL),
        COMMAND_STATUS_TIMEOUT_SZ,  REG_DWORD, sizeof(DWORD), (PUCHAR)(NULL),
        NULL, 0, 0, NULL
    };

    UNREFERENCED_PARAMETER(UniqueDriverId);
    UNREFERENCED_PARAMETER(Unused);


    DEBUGMSG( ZONE_USB_INIT, (TEXT("USBMSC>USBDeviceAttach(0x%x, %s)\n"), hDevice, UniqueDriverId));

    //
    // Determine if we control this USB peripheral...
    //
    *AcceptControl = FALSE;

    do {

        if ( USBMSC_INTERFACE_CLASS != UsbDriverSettings->dwInterfaceClass) {
            DEBUGMSG( ZONE_ERR, (TEXT("Not our Device Class:0x%x\n"), UsbDriverSettings->dwInterfaceClass ));
            bRc = FALSE;
            break;
        }
                
        //
        // Parse USB Descriptors
        //
        pUsbInterface = ParseUsbDescriptors( hDevice, 
                                             UsbFuncs, 
                                             UsbInterface,
                                             (LPUSHORT)&ulConfigIndex );

        if ( !pUsbInterface ) {
            DEBUGMSG( ZONE_ERR, (TEXT("ParseUsbDescriptors failed!\n") ));
            bRc = FALSE;
            break;
        }

        //
        // we found a device, interface, & protocol we can control, so create our device context
        //
        pUsbDevice = (PUSBMSC_DEVICE)LocalAlloc( LPTR, sizeof(USBMSC_DEVICE) );
        if ( !pUsbDevice ) {
            DEBUGMSG( ZONE_ERR, (TEXT("LocalAlloc error:%d\n"), GetLastError() ));
            bRc = FALSE;
            break;
        }

        pUsbDevice->Sig = USBMSC_SIG;

        InitializeCriticalSection( &pUsbDevice->Lock );

        pUsbDevice->hUsbDevice = hDevice;

        pUsbDevice->pUsbInterface = pUsbInterface;
        pUsbDevice->ConfigIndex   = (USHORT)ulConfigIndex;

        pUsbDevice->UsbFuncs = UsbFuncs;

        pUsbDevice->Flags.AcceptIo      = FALSE;
        pUsbDevice->Flags.DeviceRemoved = FALSE;

        pUsbDevice->dwMaxLun=0;
        //
        // set the USB interface/pipes
        //
        bRc = SetUsbInterface( pUsbDevice, UniqueDriverId );
        if ( !bRc ) {
            DEBUGMSG( ZONE_ERR, (TEXT("SetUsbInterface failed!\n")));
            break;
        }

        // create endpoint 0 event
        pUsbDevice->hEP0Event = CreateEvent( NULL, MANUAL_RESET_EVENT, FALSE, NULL);
        if ( !pUsbDevice->hEP0Event ) {
            DEBUGMSG( ZONE_ERR, (TEXT("CreateEvent error:%d\n"), GetLastError() ));
            bRc = FALSE;
            break;
        }

        //
        // Read the timeout values from the registry
        //
        rdTimeouts[0].Data = (PUCHAR)(&pUsbDevice->Timeouts.Reset);
        rdTimeouts[1].Data = (PUCHAR)(&pUsbDevice->Timeouts.CommandBlock);
        rdTimeouts[2].Data = (PUCHAR)(&pUsbDevice->Timeouts.CommandStatus);
        
        if ( !GetSetKeyValues(wsSubClassRegKey,
                                  &rdTimeouts[0],
                                  GET, 
                                  FALSE) ) {
            //
            // use defaults
            //
            pUsbDevice->Timeouts.Reset         = RESET_TIMEOUT;
            pUsbDevice->Timeouts.CommandBlock  = COMMAND_BLOCK_TIMEOUT;
            pUsbDevice->Timeouts.CommandStatus = COMMAND_STATUS_TIMEOUT;
        }

        if (!pUsbDevice->Timeouts.Reset)
            pUsbDevice->Timeouts.Reset = RESET_TIMEOUT;

        if (!pUsbDevice->Timeouts.Reset)
            pUsbDevice->Timeouts.CommandBlock = COMMAND_BLOCK_TIMEOUT;

        if (!pUsbDevice->Timeouts.Reset)
            pUsbDevice->Timeouts.CommandStatus = COMMAND_STATUS_TIMEOUT;

        //
        // Load the USB Disk Driver based on the bInterfaceSubClass code.
        // The USB Disk Driver is named by convention USBDISKxx.DLL, 
        // where 'xx' is a valid bInterfaceSubClass code.
        //
        // To override the default disk driver stuff the replacement driver subkey in the registry.
        // If the named subkey does not exist then retry with SCSI as the default driver.
        //
        bInterfaceSubClass = pUsbDevice->pUsbInterface->Descriptor.bInterfaceSubClass;
        ASSERT( (bInterfaceSubClass >= USBMSC_SUBCLASS_RBC) && 
                (bInterfaceSubClass <= USBMSC_SUBCLASS_SCSI) ||
                bInterfaceSubClass == USBMSC_SUBCLASS_RESERVED);

_retryDefault:
        swprintf( &wsSubClassRegKey[index], TEXT("\\%d"), bInterfaceSubClass ); 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品伦一区| 欧美日韩国产另类一区| 色成人在线视频| 久久亚洲一区二区三区明星换脸| 国产精品久久久久久亚洲毛片| 亚洲无人区一区| 欧美激情艳妇裸体舞| 中文字幕一区视频| 视频在线观看一区二区三区| 91香蕉国产在线观看软件| 欧美一区二区福利在线| 亚洲午夜一二三区视频| av网站一区二区三区| 日本一区二区三区国色天香| 国产精品资源在线观看| 久久久美女毛片| 国产精品影音先锋| 欧美三片在线视频观看| 亚洲美女精品一区| 国产传媒欧美日韩成人| 国产人伦精品一区二区| 99视频超级精品| 天堂资源在线中文精品| 欧美一级二级在线观看| 久久99精品国产| 中文字幕一区二区在线观看| 91一区二区三区在线观看| 亚洲综合一区二区三区| 日韩美一区二区三区| 成人午夜在线视频| 一区二区三区精品久久久| 韩国女主播成人在线| 亚洲一区二区三区四区在线| 在线视频欧美精品| 激情图片小说一区| 伊人色综合久久天天| 久久久久久日产精品| 欧美精品乱码久久久久久| 懂色av中文字幕一区二区三区| 视频一区在线播放| 最新久久zyz资源站| 久久久美女艺术照精彩视频福利播放| 波多野结衣一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 国产亚洲欧美一区在线观看| 欧美午夜在线观看| a美女胸又www黄视频久久| 国产在线视频精品一区| 男女性色大片免费观看一区二区| 国产精品女主播av| 国产日本一区二区| 国产精品的网站| 亚洲欧洲综合另类在线| 一区二区三区在线观看动漫| 亚洲欧美二区三区| 自拍偷拍欧美精品| 亚洲国产毛片aaaaa无费看| 亚洲国产精品久久人人爱| 国内精品自线一区二区三区视频| 国产一区二区调教| 色又黄又爽网站www久久| 欧美一区二区三区四区久久| 国产日韩欧美电影| 日韩精品电影在线观看| 成人av免费在线播放| 欧美日韩aaa| 中文字幕中文字幕在线一区 | 国产成人精品三级麻豆| 91网站最新网址| 久久久精品免费免费| 爽好久久久欧美精品| 91亚洲国产成人精品一区二区三| 欧美性猛交xxxx黑人交| 国产色产综合产在线视频| 日本不卡视频在线| 在线视频一区二区三区| 2022国产精品视频| 亚洲精品精品亚洲| 成人综合在线观看| 欧美一级电影网站| 亚洲一卡二卡三卡四卡| 91国产精品成人| 亚洲综合色噜噜狠狠| 成人福利电影精品一区二区在线观看| 欧美人妖巨大在线| 日韩不卡在线观看日韩不卡视频| 91免费在线播放| 亚洲激情五月婷婷| 欧美在线观看视频在线| 亚洲国产欧美在线| 9191成人精品久久| 美日韩一区二区三区| 欧美电影免费观看高清完整版 | 亚洲aⅴ怡春院| 91精品国产91综合久久蜜臀| 日韩有码一区二区三区| 欧美日韩午夜影院| 麻豆精品久久久| 国产欧美日韩中文久久| 99久久99久久精品国产片果冻| 日韩一区国产二区欧美三区| 国产最新精品精品你懂的| 日本一区二区在线不卡| 欧美自拍偷拍一区| 九九久久精品视频| 夜夜精品视频一区二区| 精品国产制服丝袜高跟| 欧美精品久久一区| 成人永久免费视频| 日本va欧美va瓶| 悠悠色在线精品| 国产精品对白交换视频 | 国产午夜三级一区二区三| 在线观看av一区| 国产一区在线看| 亚洲精品国产a久久久久久| 日韩欧美久久久| 日本韩国一区二区| 国产乱码精品一品二品| 天天综合天天综合色| 有坂深雪av一区二区精品| 中文字幕乱码一区二区免费| 欧美刺激脚交jootjob| 欧美体内she精视频| 97超碰欧美中文字幕| 国产成人免费在线视频| 久久99九九99精品| 蜜臀av一区二区| 日韩av在线发布| 日本不卡123| 国产a视频精品免费观看| 成人午夜免费视频| 91丝袜呻吟高潮美腿白嫩在线观看| 成人黄色小视频在线观看| 成人美女在线视频| 97精品国产97久久久久久久久久久久 | 亚洲桃色在线一区| 国产精品女主播av| 国产精品丝袜91| 亚洲视频电影在线| 午夜一区二区三区在线观看| 日韩成人免费在线| 成人激情电影免费在线观看| 色八戒一区二区三区| 欧美一卡二卡三卡| 久久久久久久精| 午夜精品久久久久久久久| 国产一区二区三区综合| 色综合久久综合网| 26uuu亚洲综合色| 亚洲一区二区中文在线| 久草这里只有精品视频| 777a∨成人精品桃花网| 亚洲视频免费观看| 国产麻豆午夜三级精品| 欧美日韩国产精品自在自线| 国产三级一区二区| 国产综合色视频| 欧美一区二区三区电影| 亚洲综合区在线| 欧美综合一区二区| 亚洲视频在线观看三级| 国产一区二区在线视频| 精品久久久久香蕉网| 麻豆精品一区二区三区| 欧美日韩一卡二卡三卡| 一区二区三区日韩在线观看| 97久久精品人人做人人爽| 欧美精品一区二区三区一线天视频| 一区二区高清在线| 色偷偷久久一区二区三区| 国产精品传媒视频| 99国产精品国产精品久久| 国产欧美精品一区aⅴ影院| 久久99精品网久久| 久久久久久久久一| av在线播放成人| 亚洲免费av高清| 91精品在线免费观看| 天天综合网天天综合色| 精品国产乱码久久久久久蜜臀| 韩国理伦片一区二区三区在线播放| 26uuu国产日韩综合| 大白屁股一区二区视频| 国产精品麻豆99久久久久久| 在线视频一区二区三区| 全部av―极品视觉盛宴亚洲| 国产亚洲欧美一区在线观看| 99久久综合精品| 国内精品视频一区二区三区八戒| 亚洲国产高清aⅴ视频| 在线一区二区三区做爰视频网站| 偷拍一区二区三区| 中文字幕+乱码+中文字幕一区| 欧美日韩国产系列| 91在线国产福利| 精品一区二区三区免费| 亚洲日本成人在线观看| 中文字幕精品一区二区三区精品| 色94色欧美sute亚洲线路一久 |