青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

windows sdk編程系列文章 ---- 遍歷USB設備,獲取掃描儀序列號之二

代碼:見光盤GetSerialNo

#include "windows.h"
#include "PlkUsbIo.h"
#include <malloc.h>

#define NUM_HCS_TO_CHECK 10

/******************************************************************/
bool EnumUsbDevice();
PCHAR GetDriverKeyName(HANDLE Hub, ULONG ConnectionIndex);
PCHAR GetHCDDriverKeyName(HANDLE HCD);
PCHAR GetRootHubName(HANDLE HostController);
PCHAR WideStrToMultiStr(PWCHAR WideStr);
bool GetStringDescriptor (
        HANDLE hHubDevice,
        ULONG   ConnectionIndex,
        UCHAR   DescriptorIndex    ,
        CHAR * outBuff);
   
/******************************************************************/

int main(int argc, char* argv[])
{
    EnumUsbDevice();
    return 0;
}

bool EnumUsbDevice()
{
    char        HCName[16];
    int         HCNum;
    HANDLE      hHCDev;
    PCHAR       rootHubName;

    ULONG       index;
    BOOL        success;

    PUSB_NODE_CONNECTION_INFORMATION    connectionInfo;
    HANDLE hHubDevice;

    for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
    {
        wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
        hHCDev = CreateFile(HCName,
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            NULL,
            OPEN_EXISTING,
            0,
            NULL);
        if (hHCDev == INVALID_HANDLE_VALUE)   
            break;
       
        PCHAR driverKeyName, deviceDesc;
        driverKeyName = GetHCDDriverKeyName(hHCDev);
        if(driverKeyName == NULL)
            goto end;   
       
   
        ULONG nBytes;
        rootHubName =(char*) GetRootHubName(hHCDev);
        if(rootHubName==NULL)
            goto end;
   
        PUSB_NODE_INFORMATION HubInfo;
        HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
        PCHAR deviceName;
        deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
        if (rootHubName != NULL)
        {
            strcpy(deviceName, "\\\\.\\");
            strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
            hHubDevice = CreateFile(deviceName,
                GENERIC_WRITE,
                FILE_SHARE_WRITE,
                NULL,
                OPEN_EXISTING,
                0,
                NULL);
            free(deviceName);
            if (hHubDevice == INVALID_HANDLE_VALUE)
                goto end;
           
            success = DeviceIoControl(hHubDevice,
                IOCTL_USB_GET_NODE_INFORMATION,
                HubInfo,
                sizeof(USB_NODE_INFORMATION),
                HubInfo,
                sizeof(USB_NODE_INFORMATION),
                &nBytes,
                NULL);
            if (!success)
                goto end;
           

        }

        int port;
        port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts;
        for (index=1; index <= port; index++)
        {
            ULONG nBytes;
            nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
                sizeof(USB_PIPE_INFO) * 30;
            connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
            if (connectionInfo == NULL)
                goto end;
           
            connectionInfo->ConnectionIndex = index;
            success = DeviceIoControl(hHubDevice,
                IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
                connectionInfo,
                nBytes,
                connectionInfo,
                nBytes,
                &nBytes,
                NULL);
            if (!success)
            {
                free(connectionInfo);
                goto end;
            }
       

            deviceDesc = NULL;
            if (connectionInfo->ConnectionStatus != NoDeviceConnected)
            {
                driverKeyName = GetDriverKeyName(hHubDevice,
                    index);
                if (driverKeyName)
                {
                    free(driverKeyName);
                }
            }

            if (connectionInfo->ConnectionStatus == DeviceConnected)
            {
                //取出序列號索引
                UCHAR nSerialno = connectionInfo->DeviceDescriptor.iSerialNumber;
                CHAR OutBuff[20] = {0};
                GetStringDescriptor(hHubDevice,connectionInfo->ConnectionIndex,nSerialno,OutBuff);

                //判斷序列號是否有效
                if(
序列號是否有效)
                {
                      CloseHandle(hHubDevice);
                      CloseHandle(hHCDev);
                     return true;
                }
            }

        }
end:;
    }

    CloseHandle(hHubDevice);
    CloseHandle(hHCDev);
    return false;
}

PCHAR GetDriverKeyName(HANDLE Hub, ULONG ConnectionIndex)
{
    BOOL                                success;
    ULONG                               nBytes;
    USB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyName;
    PUSB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyNameW;
    PCHAR                               driverKeyNameA;

    driverKeyNameW = NULL;
    driverKeyNameA = NULL;

    driverKeyName.ConnectionIndex = ConnectionIndex;

    success = DeviceIoControl(Hub,
        IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
        &driverKeyName,
        sizeof(driverKeyName),
        &driverKeyName,
        sizeof(driverKeyName),
        &nBytes,
        NULL);

    if (!success)
    {
        goto GetDriverKeyNameError;
    }

    nBytes = driverKeyName.ActualLength;

    if (nBytes <= sizeof(driverKeyName))
    {
        goto GetDriverKeyNameError;
    }

    driverKeyNameW = (PUSB_NODE_CONNECTION_DRIVERKEY_NAME)malloc(nBytes);

    if (driverKeyNameW == NULL)
    {
        goto GetDriverKeyNameError;
    }

    driverKeyNameW->ConnectionIndex = ConnectionIndex;

    success = DeviceIoControl(Hub,
        IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
        driverKeyNameW,
        nBytes,
        driverKeyNameW,
        nBytes,
        &nBytes,
        NULL);

    if (!success)
    {
        goto GetDriverKeyNameError;
    }
    driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName);
    free(driverKeyNameW);

    return driverKeyNameA;


GetDriverKeyNameError:
    if (driverKeyNameW != NULL)
    {
        free(driverKeyNameW);
        driverKeyNameW = NULL;
    }

    return NULL;
}
PCHAR GetRootHubName(HANDLE HostController)
{
    BOOL                success;
    ULONG               nBytes;
    USB_ROOT_HUB_NAME   rootHubName;
    PUSB_ROOT_HUB_NAME rootHubNameW;
    PCHAR               rootHubNameA;

    rootHubNameW = NULL;
    rootHubNameA = NULL;

    success = DeviceIoControl(HostController,
        IOCTL_USB_GET_ROOT_HUB_NAME,
        0,
        0,
        &rootHubName,
        sizeof(rootHubName),
        &nBytes,
        NULL);

    if (!success)
    {
        goto GetRootHubNameError;
    }

    nBytes = rootHubName.ActualLength;

    rootHubNameW =(PUSB_ROOT_HUB_NAME) malloc(nBytes);

    if (rootHubNameW == NULL)
    {

        goto GetRootHubNameError;
    }

    success = DeviceIoControl(HostController,
        IOCTL_USB_GET_ROOT_HUB_NAME,
        NULL,
        0,
        rootHubNameW,
        nBytes,
        &nBytes,
        NULL);

    if (!success)
    {
        goto GetRootHubNameError;
    }

    rootHubNameA = WideStrToMultiStr(rootHubNameW->RootHubName);
    free(rootHubNameW);

    return rootHubNameA;


GetRootHubNameError:
    if (rootHubNameW != NULL)
    {
        free(rootHubNameW);
        rootHubNameW = NULL;
    }

    return NULL;
}
PCHAR GetHCDDriverKeyName(HANDLE HCD)
{
    BOOL                    success;
    ULONG                   nBytes;
    USB_HCD_DRIVERKEY_NAME driverKeyName;
    PUSB_HCD_DRIVERKEY_NAME driverKeyNameW;
    PCHAR                   driverKeyNameA;

    driverKeyNameW = NULL;
    driverKeyNameA = NULL;

    success = DeviceIoControl(HCD,
        IOCTL_GET_HCD_DRIVERKEY_NAME,
        &driverKeyName,
        sizeof(driverKeyName),
        &driverKeyName,
        sizeof(driverKeyName),
        &nBytes,
        NULL);

    if (!success)
    {
        goto GetHCDDriverKeyNameError;
    }

    nBytes = driverKeyName.ActualLength;

    if (nBytes <= sizeof(driverKeyName))
    {
        goto GetHCDDriverKeyNameError;
    }

    driverKeyNameW =(PUSB_HCD_DRIVERKEY_NAME) malloc(nBytes);

    if (driverKeyNameW == NULL)
    {
        goto GetHCDDriverKeyNameError;
    }

    success = DeviceIoControl(HCD,
        IOCTL_GET_HCD_DRIVERKEY_NAME,
        driverKeyNameW,
        nBytes,
        driverKeyNameW,
        nBytes,
        &nBytes,
        NULL);

    if (!success)
    {
        goto GetHCDDriverKeyNameError;
    }

    driverKeyNameA = WideStrToMultiStr(driverKeyNameW->DriverKeyName);
    free(driverKeyNameW);

    return driverKeyNameA;


GetHCDDriverKeyNameError:
    if (driverKeyNameW != NULL)
    {
        free(driverKeyNameW);
        driverKeyNameW = NULL;
    }

    return NULL;
}

PCHAR WideStrToMultiStr(PWCHAR WideStr)
{
    ULONG nBytes;
    PCHAR MultiStr;
    nBytes = WideCharToMultiByte(
        CP_ACP,
        0,
        WideStr,
        -1,
        NULL,
        0,
        NULL,
        NULL);

    if (nBytes == 0)
    {
        return NULL;
    }
    MultiStr =(PCHAR) malloc(nBytes);

    if (MultiStr == NULL)
    {
        return NULL;
    }
    nBytes = WideCharToMultiByte(
        CP_ACP,
        0,
        WideStr,
        -1,
        MultiStr,
        nBytes,
        NULL,
        NULL);

    if (nBytes == 0)
    {
        free(MultiStr);
        return NULL;
    }

    return MultiStr;
}


bool    GetStringDescriptor (
        HANDLE hHubDevice,
        ULONG   ConnectionIndex,
        UCHAR   DescriptorIndex    ,
        CHAR * outBuff
        )
    {
        BOOL    success;
        ULONG   nBytes;
        ULONG   nBytesReturned;

        UCHAR   stringDescReqBuf[sizeof(USB_DESCRIPTOR_REQUEST) + MAXIMUM_USB_STRING_LENGTH];

        PUSB_DESCRIPTOR_REQUEST stringDescReq;
        PUSB_STRING_DESCRIPTOR stringDesc;

        nBytes = sizeof(stringDescReqBuf);

        stringDescReq = (PUSB_DESCRIPTOR_REQUEST)stringDescReqBuf;
        stringDesc = (PUSB_STRING_DESCRIPTOR)(stringDescReq+1);

   
        ::ZeroMemory(stringDescReq,nBytes);
        stringDescReq->ConnectionIndex = ConnectionIndex;
        stringDescReq->SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE << 8) | DescriptorIndex;
        stringDescReq->SetupPacket.wIndex = GetSystemDefaultLangID();
        stringDescReq->SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST));

        success = DeviceIoControl(hHubDevice,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
                                stringDescReq,nBytes,
                                stringDescReq,nBytes,
                                &nBytesReturned,NULL);

        if (!success || nBytesReturned < 2)
            return false;

        if (stringDesc->bDescriptorType != USB_STRING_DESCRIPTOR_TYPE)
            return false;

        if (stringDesc->bLength != nBytesReturned - sizeof(USB_DESCRIPTOR_REQUEST))
            return false;

        if (stringDesc->bLength % 2 != 0)
            return false;

        WCHAR * wChar = new WCHAR[stringDesc->bLength + 1];
        memcpy(wChar,stringDesc->bString,stringDesc->bLength);
        char *szTemp = WideStrToMultiStr(wChar);
        lstrcpy(outBuff, szTemp);
       
        if(szTemp)
        delete []szTemp;
       
        if(wChar)
        delete []wChar;
        return true;
    }

分析:

1)首先假定有10個usb接口
    #define NUM_HCS_TO_CHECK 10

2)循環打開這10個usb端口,如果端口沒有這么多,調用
CreateFile,就會返回 INVALID_HANDLE_VALUE。
    for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
    {
        wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
        hHCDev = CreateFile(HCName,
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            NULL,
            OPEN_EXISTING,
            0,
            NULL);
        if (hHCDev == INVALID_HANDLE_VALUE)   
            break;

3)獲取root hub
       ULONG nBytes;
        rootHubName =(char*) GetRootHubName(hHCDev);
        if(rootHubName==NULL)
            goto end;

4) 遍歷連接在root hub上的節點
        int port;
        port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts;
        for (index=1; index <= port; index++)
        {
            ULONG nBytes;
            nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
                sizeof(USB_PIPE_INFO) * 30;
            connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
            if (connectionInfo == NULL)
                goto end;
           
            connectionInfo->ConnectionIndex = index;
            success = DeviceIoControl(hHubDevice,
                IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
                connectionInfo,
                nBytes,
                connectionInfo,
                nBytes,
                &nBytes,
                NULL);
            if (!success)
            {
                free(connectionInfo);
                goto end;
            }

5)根據節點的連接狀態,獲取節點信息,得到序列號。
    if (connectionInfo->ConnectionStatus == DeviceConnected)
            {
                //取出序列號索引
                UCHAR nSerialno = connectionInfo->DeviceDescriptor.iSerialNumber;
                CHAR OutBuff[20] = {0};
                GetStringDescriptor(hHubDevice,connectionInfo->ConnectionIndex,nSerialno,OutBuff);

6)得到序列號的方法在理論部分已經詳細說明了,對應的函數是
GetStringDescriptor,這里不再重復

posted on 2010-11-21 15:24 wrh 閱讀(1645) 評論(0)  編輯 收藏 引用

導航

<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統計

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产日韩一区二区| 国产视频久久| 美女黄色成人网| 欧美一区视频在线| 久久精品国产第一区二区三区最新章节| 亚洲自拍偷拍色片视频| 欧美一区二区三区啪啪| 久久精品免费观看| 亚洲大胆av| 国产欧美日韩在线视频| 国产精品嫩草影院av蜜臀| 国产亚洲欧美日韩精品| 亚洲丰满在线| 亚洲综合日本| 六月天综合网| 在线亚洲国产精品网站| 久久精品国产清自在天天线| 免费成人在线观看视频| 欧美午夜精品| 亚洲第一视频| 欧美影院久久久| 国产精品视频福利| 香蕉乱码成人久久天堂爱免费| 亚洲一区美女视频在线观看免费| 欧美一级电影久久| 欧美大色视频| 国产欧美三级| 国产精品大片wwwwww| 久久国产精品第一页| 久久综合中文字幕| 欧美日韩免费一区二区三区| 国产女人18毛片水18精品| 一区二区在线看| 亚洲深夜激情| 久久综合一区二区三区| 久久久久一区二区| 欧美大香线蕉线伊人久久国产精品| 亚洲国产99精品国自产| 中日韩午夜理伦电影免费| 久久精品亚洲热| 欧美日韩一区二区在线观看视频| 国产女人18毛片水18精品| 亚洲欧洲另类| 日韩视频一区二区三区在线播放免费观看| 亚洲一区二区三区三| 嫩草影视亚洲| 亚洲第一页自拍| 欧美一区二区三区精品| 欧美精品亚洲二区| 黄色精品网站| 亚洲欧美日韩一区在线观看| 麻豆久久婷婷| 午夜久久久久久| 麻豆freexxxx性91精品| 精品电影在线观看| 先锋影院在线亚洲| 日韩视频一区| 欧美精品一区二| 一区在线观看视频| 性欧美暴力猛交另类hd| 亚洲精品亚洲人成人网| 开心色5月久久精品| 国产亚洲欧美激情| 亚洲私人影院在线观看| 欧美激情按摩| 久久免费精品日本久久中文字幕| 欧美jizz19性欧美| 国产专区综合网| 久久国产直播| 欧美一区二区三区久久精品茉莉花| 欧美日韩免费观看一区三区| 亚洲精品中文字幕女同| 亚洲电影免费在线| 麻豆精品精品国产自在97香蕉| 国产亚洲成人一区| 久久国产色av| 久久九九电影| 亚洲国产精品成人综合| 欧美高清视频在线播放| 裸体女人亚洲精品一区| 亚洲私拍自拍| 欧美日韩高清免费| 亚洲免费激情| 亚洲三级视频在线观看| 欧美久久久久久久久久| 亚洲精品久久久久中文字幕欢迎你| 免费美女久久99| 久久午夜精品| 日韩视频一区二区在线观看| 亚洲国内高清视频| 欧美日韩另类综合| 性色av一区二区三区红粉影视| 美国成人毛片| 欧美在线看片| 一区二区三区.www| 国产精品99久久久久久人| 国产精品免费一区二区三区在线观看| 亚洲女人天堂成人av在线| 亚洲午夜性刺激影院| 国产欧美一区二区精品仙草咪| 欧美一区二区三区免费视| 欧美一区二区免费观在线| 亚洲高清中文字幕| 日韩视频永久免费观看| 国产精品任我爽爆在线播放| 久久精品国产69国产精品亚洲| 欧美一级夜夜爽| 亚洲精品美女在线观看| 亚洲午夜三级在线| 国产伦精品一区二区三区| 巨乳诱惑日韩免费av| 欧美绝品在线观看成人午夜影视| 亚洲免费视频一区二区| 久久青草久久| 午夜性色一区二区三区免费视频| 久久国产天堂福利天堂| 99re6热只有精品免费观看 | 亚洲成人自拍视频| 99国产精品久久久| 在线看无码的免费网站| 亚洲日本va午夜在线电影| 国产精品入口尤物| 亚洲福利视频二区| 国产欧美 在线欧美| 91久久精品美女| 亚洲视频在线免费观看| 亚洲国产精品一区二区第一页| 一本色道久久99精品综合| 怡红院精品视频| 亚洲午夜三级在线| 亚洲欧洲另类国产综合| 欧美一区深夜视频| 亚洲欧美日本在线| 欧美麻豆久久久久久中文| 久久午夜视频| 国产日韩精品一区二区三区| 亚洲日本成人在线观看| 欧美性猛交xxxx乱大交退制版| 先锋影音久久| 日韩视频永久免费| 久久av资源网| 午夜精品一区二区三区在线| 蜜桃视频一区| 久久男人av资源网站| 牛人盗摄一区二区三区视频| 国产日韩欧美综合精品| 久久精品99久久香蕉国产色戒| 久久av一区| 夜夜嗨av一区二区三区四区| 久久久久久夜| 久久综合色综合88| 国产综合色精品一区二区三区| 日韩午夜激情av| 国产亚洲一级| 女同一区二区| 91久久中文字幕| 亚洲麻豆一区| 欧美日韩mv| 亚洲视频电影在线| 午夜精品免费| 国产女人aaa级久久久级| 亚洲高清av| 亚洲黄色视屏| 欧美日韩福利视频| 一个人看的www久久| 亚洲欧美www| 国产乱码精品一区二区三区五月婷 | 国产农村妇女精品一二区| 亚洲免费视频成人| 欧美在线日韩在线| 欧美美女福利视频| 亚洲午夜国产成人av电影男同| 一二三四社区欧美黄| 国产精品久久久久久久久久免费| 一本色道婷婷久久欧美| 午夜欧美视频| 一区二区三区在线观看国产| 亚洲一区二区在线观看视频| 欧美一区二区在线免费播放| 好看的亚洲午夜视频在线| 久久蜜桃香蕉精品一区二区三区| 欧美高清一区| 亚洲午夜久久久| 激情欧美一区二区三区| 欧美成人综合一区| 亚洲私人影院在线观看| 久久中文精品| 激情综合中文娱乐网| 久久久久久久一区| 亚洲裸体在线观看| 久久久人成影片一区二区三区观看| 在线日韩av片| 国产精品一级| 欧美精品免费在线| 久久国产精品第一页 | 亚洲网站视频| 欧美va亚洲va日韩∨a综合色| 一区二区三区精密机械公司 | 蜜臀99久久精品久久久久久软件 | 欧美日韩人人澡狠狠躁视频|