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

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>
            日韩手机在线导航| 先锋影音网一区二区| 国产亚洲二区| 一区二区免费在线视频| 亚洲综合日韩中文字幕v在线| 黄色成人91| 久久国产视频网站| 欧美专区第一页| 国产精品丝袜久久久久久app| 亚洲第一天堂av| 在线观看中文字幕不卡| 久久狠狠婷婷| 久久综合网络一区二区| 激情91久久| 久久嫩草精品久久久久| 久久久精品国产一区二区三区 | 久久频这里精品99香蕉| 久久人人97超碰人人澡爱香蕉 | 欧美日韩免费视频| 亚洲精品资源美女情侣酒店| 亚洲精品视频在线观看免费| 欧美11—12娇小xxxx| 欧美激情中文字幕一区二区| 在线观看欧美黄色| 久久手机精品视频| 欧美黄色片免费观看| 亚洲日韩视频| 欧美三级精品| 亚洲欧美中文日韩v在线观看| 羞羞漫画18久久大片| 国产综合香蕉五月婷在线| 久久不见久久见免费视频1| 另类天堂av| 亚洲精品一区二区三区99| 暖暖成人免费视频| 亚洲精品国产精品乱码不99| 一本色道久久综合精品竹菊| 国产精品国产a| 欧美一级视频免费在线观看| 另类酷文…触手系列精品集v1小说| 在线成人激情视频| 欧美二区不卡| 亚洲五月六月| 猛男gaygay欧美视频| 日韩视频在线观看国产| 国产精品三级视频| 久久免费高清| 艳女tv在线观看国产一区| 欧美在线网站| 日韩一级成人av| 国产视频久久网| 欧美大色视频| 欧美一级大片在线观看| 欧美xx69| 久久av资源网站| 亚洲国产一区二区视频| 国产精品av免费在线观看| 久久精品成人一区二区三区| 亚洲精品乱码久久久久久按摩观| 欧美一区二区精品| 亚洲伦理在线| 黄色成人av| 国产精品一级在线| 欧美精品www在线观看| 午夜影院日韩| 一本大道久久a久久精品综合| 久久免费国产| 午夜在线精品| 一本色道久久综合亚洲91| 黄色成人在线网站| 国产精一区二区三区| 欧美日韩成人一区二区| 久久蜜桃精品| 欧美在线视频a| 亚洲在线一区二区| 99精品免费| 亚洲精品在线观| 亚洲二区视频| 欧美sm重口味系列视频在线观看| 午夜综合激情| 亚洲婷婷国产精品电影人久久| 亚洲国产成人porn| 激情丁香综合| 国产一区视频观看| 国产色产综合色产在线视频| 欧美性天天影院| 欧美日韩视频在线一区二区 | 国产一区二区三区久久久| 国产精品久久久久久一区二区三区 | 黄色成人在线免费| 国产主播一区二区三区| 国产精品一区毛片| 国产精品久久久久久超碰| 欧美日韩视频在线一区二区| 欧美精品三级日韩久久| 欧美成va人片在线观看| 欧美成人一区二区| 欧美激情欧美激情在线五月| 久久中文精品| 免费人成精品欧美精品| 久久夜色精品国产亚洲aⅴ| 久久免费精品视频| 久久这里只有精品视频首页| 久久婷婷激情| 欧美顶级少妇做爰| 欧美乱人伦中文字幕在线| 欧美巨乳波霸| 欧美亚一区二区| 国产精品老女人精品视频| 国产精品私房写真福利视频| 国产精品亚洲а∨天堂免在线| 国产伦精品一区二区三区在线观看 | 欧美色图首页| 国产精品久久久久免费a∨大胸| 国产精品扒开腿爽爽爽视频| 国产精品视频不卡| 黑人巨大精品欧美黑白配亚洲| 精品白丝av| 亚洲免费激情| 欧美亚洲综合久久| 噜噜爱69成人精品| 亚洲国产精品热久久| 日韩视频在线一区二区| 亚洲在线视频观看| 久久深夜福利| 欧美性大战xxxxx久久久| 国产精品一区免费在线观看| 韩国视频理论视频久久| 亚洲精品欧美极品| 亚洲欧美日韩中文在线制服| 久久精品动漫| 亚洲黄色大片| 香蕉国产精品偷在线观看不卡| 久久av最新网址| 欧美日韩 国产精品| 国产日韩欧美在线| 日韩写真视频在线观看| 欧美一区二区三区免费看| 欧美成人a∨高清免费观看| 999亚洲国产精| 久久久久欧美| 国产精品久久久久aaaa樱花| 影音先锋日韩有码| 亚洲欧美高清| 亚洲第一在线| 欧美一区二区视频免费观看| 欧美成人一区二区三区片免费| 国产欧美日韩一区二区三区| 亚洲精品1区2区| 久久蜜桃资源一区二区老牛 | 欧美视频一区在线| 亚洲黄色av一区| 久久国产精彩视频| 日韩视频亚洲视频| 嫩模写真一区二区三区三州| 国产精品视频免费一区| 亚洲片在线资源| 久久综合色婷婷| 午夜精品久久久久久久久久久久| 欧美成人性生活| 樱花yy私人影院亚洲| 新狼窝色av性久久久久久| 91久久久一线二线三线品牌| 欧美一区二区网站| 国产精品美女| 亚洲小说春色综合另类电影| 欧美成人免费在线观看| 久久国产精品99国产精| 国产精品久久中文| 亚洲婷婷在线| 亚洲精品综合精品自拍| 欧美国产精品va在线观看| 一区二区三区在线观看视频| 性色av香蕉一区二区| 在线视频一区二区| 欧美日韩免费观看一区=区三区| 在线观看欧美视频| 蜜桃视频一区| 久久亚洲春色中文字幕| 国内精品视频在线播放| 久久精品视频网| 午夜亚洲一区| 国产一区二区日韩精品| 久久久久久噜噜噜久久久精品| 亚洲欧美激情精品一区二区| 国产精品激情电影| 亚洲欧美日韩一区二区| 一区二区三区www| 国产精品成人一区二区| 亚洲自啪免费| 亚洲在线电影| 国产视频一区三区| 久久人人爽人人爽爽久久| 久久福利电影| 在线观看91久久久久久| 欧美成人自拍视频| 欧美精品在线观看一区二区| 99re6这里只有精品视频在线观看| 亚洲国产精品一区二区三区| 欧美精品在线一区|