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

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 閱讀(1654) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

統計

常用鏈接

留言簿(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>
            国产亚洲精品久| 欧美视频久久| 猛干欧美女孩| 国产日韩欧美亚洲一区| 日韩亚洲欧美综合| 免费国产一区二区| 欧美在线1区| 国产乱码精品| 午夜精品在线| 欧美国产精品一区| 国产日韩欧美精品一区| 一区二区激情| 亚洲高清不卡一区| 亚洲精品久久久蜜桃| 奶水喷射视频一区| 一本色道久久综合亚洲精品不 | 欧美性做爰毛片| 一区二区视频免费完整版观看| 一区二区成人精品| 在线电影国产精品| 亚洲欧美999| 国产精品女人久久久久久| 午夜精品久久久| 亚洲精品久久7777| 国产精品亚洲产品| 久久国产精品亚洲va麻豆| 亚洲女与黑人做爰| 99精品国产在热久久下载| 一区二区三区av| 亚洲精品网站在线播放gif| 亚洲免费在线视频| 亚洲国产美女| 免费试看一区| 在线成人h网| 亚洲国产99| 欧美日韩国产一区二区三区地区| 亚洲精品小视频在线观看| 亚洲人成亚洲人成在线观看图片| 欧美freesex交免费视频| 日韩一级裸体免费视频| 99国产精品视频免费观看一公开 | 免费久久99精品国产自| 麻豆精品在线视频| 正在播放亚洲| 欧美一级久久久| 91久久国产综合久久蜜月精品| 亚洲精品久久久久久一区二区 | 欧美一区二区三区视频免费| 久久成人精品| 日韩一区二区久久| 亚洲精品中文字幕女同| 国产视频一区在线观看| 欧美成年人在线观看| 国产精品二区在线观看| 久久国产免费| 性久久久久久久久| 亚洲国产精品va在线观看黑人| 久久久久久**毛片大全| 欧美亚洲日本网站| 欧美xxxx在线观看| 毛片一区二区三区| 亚洲精品日本| 国产在线观看精品一区二区三区 | 亚洲香蕉伊综合在人在线视看| 亚洲一区二区三区免费观看| 国产视频欧美视频| 久久夜色精品国产欧美乱| 久久久久国产精品人| 一区二区三区www| 亚洲经典自拍| 亚洲一区中文| 欧美激情四色| 欧美成人一区在线| 亚洲欧美激情视频| 亚洲美女在线看| 欧美偷拍另类| 伊人夜夜躁av伊人久久| 亚洲日韩视频| 久久精品国产久精国产一老狼 | 亚洲男女自偷自拍图片另类| 久久gogo国模啪啪人体图| 亚洲理论在线观看| 亚洲国产成人在线| 亚洲欧洲中文日韩久久av乱码| 一区二区三区在线观看视频| 国产一区二区精品丝袜| 伊人婷婷久久| 亚洲一区二区在线播放| 久久成人免费| 亚洲国产老妈| 欧美亚洲一级| 欧美精品自拍偷拍动漫精品| 国产精品久久久久一区二区三区| 国产亚洲精品久久久久婷婷瑜伽| 国产一区二区在线观看免费| 亚洲人成在线播放| 久久欧美肥婆一二区| 亚洲精品黄色| 另类春色校园亚洲| 国产精品蜜臀在线观看| 日韩午夜三级在线| 免费日韩av电影| 国产欧美1区2区3区| 久久久久久久97| 一区二区动漫| 亚洲免费视频网站| 日韩视频一区二区三区| 欧美成人在线免费视频| 免费视频久久| 亚洲国产mv| 欧美电影在线观看| 亚洲毛片av| 午夜视频在线观看一区二区| 国产精品永久在线| 久久九九国产| 亚洲激情一区二区| 一本色道久久88亚洲综合88| 欧美色网在线| 欧美在线91| 亚洲激情电影中文字幕| 亚洲一区欧美| 影音先锋成人资源站| 欧美激情日韩| 亚洲欧美日韩一区二区三区在线| 久久综合伊人77777| 一个色综合导航| 国产综合久久久久久鬼色| 欧美激情综合在线| 亚洲欧美制服另类日韩| 欧美mv日韩mv国产网站app| 99精品免费网| 国内精品久久久久久久影视麻豆 | 亚洲第一黄色| 国产精品视频男人的天堂| 久久综合五月| 亚洲视频你懂的| 激情婷婷欧美| 欧美日韩亚洲91| 久久精品中文字幕免费mv| 开元免费观看欧美电视剧网站| 国产精品毛片大码女人| 一区二区三区欧美视频| 亚洲欧美色一区| 欧美一区91| 亚洲国产日韩在线| 欧美一区二区三区免费在线看| 亚洲国产精品黑人久久久| 国产精品乱子乱xxxx| 久久综合伊人77777| 亚洲专区国产精品| 91久久久久久久久| 久久午夜精品| 午夜精品久久久久久久久久久久久 | 麻豆精品网站| 亚洲一区二区在线看| 亚洲第一视频| 久久久久久久久蜜桃| 在线视频欧美日韩精品| 在线电影国产精品| 国产亚洲精品一区二555| 欧美日韩国产专区| 久久综合九色综合欧美就去吻| 一区二区三区国产| 欧美一区二区啪啪| 国产在线欧美| 欧美另类综合| 中文欧美在线视频| 亚洲高清在线播放| 久久一区中文字幕| 欧美一区二视频| 亚洲一级黄色| 亚洲婷婷在线| 99这里只有精品| 日韩一本二本av| 亚洲精品综合| 99re6热在线精品视频播放速度| 亚洲国产老妈| 亚洲每日更新| 一区二区三区视频在线| 亚洲日本精品国产第一区| 亚洲成在人线av| 亚洲国产天堂久久综合| 在线欧美电影| 亚洲日本va在线观看| 最近中文字幕mv在线一区二区三区四区 | 亚洲盗摄视频| 欧美韩日一区| 亚洲福利一区| 91久久国产综合久久91精品网站| 亚洲第一精品福利| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲精品人人| 亚洲精品免费在线| 亚洲精品久久久久久久久| 亚洲毛片一区二区| 亚洲女人小视频在线观看| 欧美一区精品| 欧美gay视频| 国产精品久久国产精品99gif| 国产目拍亚洲精品99久久精品|