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

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

理論:
    對于USB接口的設備,現在越來越多了。本篇我們就通過獲取一個USB掃描儀設備中的序列號,來介紹如何獲取usb設備的一些硬件信息。對于usb設備都是采用HCD0,HCD1,HCD2,HCD3等符號描述的。如下圖:

因此,有了這個名字,我們就可以使用CreateFile來打開usb設備。然后使用DeviceIoControl函數與usb設備通訊了。HCD是host controller driver的簡寫。需要了解詳情的,還要仔細的閱讀usb協議。
usb的通訊基本步驟如下圖所示:
基本步驟:
    1)打開HCD%X
    2) 得到上面的USB root hub
    3) 遍歷usb root hub上連接的usb 設備。獲取信息
    4)如果有多個usb口,循環前3步。

下面介紹通訊用的幾個IOCTL:
1)USB_HCD_DRIVERKEY_NAME ,用于獲取USB設備驅動在注冊表中的鍵名。相應的一個結構體是:
typedef struct _USB_HCD_DRIVERKEY_NAME
{
   ULONG   ActualLength;

   WCHAR   DriverKeyName[1];

} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;


2)IOCTL_USB_GET_ROOT_HUB_NAME,用于獲取root hub 鍵名。使用的結構體,跟上面一樣。
typedef struct _USB_ROOT_HUB_NAME
{
    ULONG ActualLength;
    WCHAR RootHubName[1];
} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;

3IOCTL_USB_GET_NODE_INFORMATION,
用于獲取連接在root hub上的節點設備信息。也就是我們接在usb口上的所有usb設備的信息,對應的結構體:
typedef struct _USB_NODE_INFORMATION
{
    USB_HUB_NODE NodeType;   
    union {
        USB_HUB_INFORMATION HubInformation;
        USB_MI_PARENT_INFORMATION MiParentInformation;
    } u;
} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;

typedef struct _USB_MI_PARENT_INFORMATION
{
    ULONG NumberOfInterfaces;
} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;

typedef struct _USB_HUB_INFORMATION
{
    USB_HUB_DESCRIPTOR HubDescriptor;

    BOOLEAN HubIsBusPowered;

} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;


typedef struct _USB_HUB_DESCRIPTOR
{
    UCHAR        bDescriptorLength;      // Length of this descriptor
    UCHAR        bDescriptorType;        // Hub configuration type
    UCHAR        bNumberOfPorts;         // number of ports on this hub
    USHORT       wHubCharacteristics;    // Hub Charateristics
    UCHAR        bPowerOnToPowerGood;    // port power on till power good in 2ms
    UCHAR        bHubControlCurrent;     // max current in mA
    //
    // room for 255 ports power control and removable bitmask
    UCHAR        bRemoveAndPowerMask[64];      
} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;


4) IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, 用于獲取接在usb口上的單個usb設備的信息,對應的結構體:

typedef struct _USB_NODE_CONNECTION_INFORMATION
{
    ULONG ConnectionIndex;
    USB_DEVICE_DESCRIPTOR DeviceDescriptor;
    UCHAR CurrentConfigurationValue;
    BOOLEAN LowSpeed;

    BOOLEAN DeviceIsHub;

    USHORT DeviceAddress;

    ULONG NumberOfOpenPipes;

    USB_CONNECTION_STATUS ConnectionStatus;
    USB_PIPE_INFO PipeList[0];
} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;

4)IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, 用于獲取usb設備的描述信息。
typedef struct _USB_DEVICE_DESCRIPTOR
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    USHORT bcdUSB;
    UCHAR bDeviceClass;
    UCHAR bDeviceSubClass;
    UCHAR bDeviceProtocol;
    UCHAR bMaxPacketSize0;
    USHORT idVendor;
    USHORT idProduct;
    USHORT bcdDevice;
    UCHAR iManufacturer;
    UCHAR iProduct;
    UCHAR iSerialNumber;
    UCHAR bNumConfigurations;
} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;

typedef struct _USB_DEVICE_DESCRIPTOR
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    USHORT bcdUSB;
    UCHAR bDeviceClass;
    UCHAR bDeviceSubClass;
    UCHAR bDeviceProtocol;
    UCHAR bMaxPacketSize0;
    USHORT idVendor;
    USHORT idProduct;
    USHORT bcdDevice;
    UCHAR iManufacturer;
    UCHAR iProduct;
    UCHAR iSerialNumber;
    UCHAR bNumConfigurations;
} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;

typedef enum _USB_CONNECTION_STATUS
{
    NoDeviceConnected,
    DeviceConnected,

    /* failure codes, these map to fail reasons */
    DeviceFailedEnumeration,
    DeviceGeneralFailure,
    DeviceCausedOvercurrent,
    DeviceNotEnoughPower,
    DeviceNotEnoughBandwidth,
    DeviceHubNestedTooDeeply,
    DeviceInLegacyHub
} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;

typedef struct _USB_PIPE_INFO
{
    USB_ENDPOINT_DESCRIPTOR EndpointDescriptor;
    ULONG ScheduleOffset;
} USB_PIPE_INFO, *PUSB_PIPE_INFO;

typedef struct _USB_ENDPOINT_DESCRIPTOR
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bEndpointAddress;
    UCHAR bmAttributes;
    USHORT wMaxPacketSize;
    UCHAR bInterval;
} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;

需要注意一點,如果要得到pid,vid,則直接從
USB_DEVICE_DESCRIPTOR結構中取出idVendor,idProduct這兩項的值就行了。如果要得到序列號,則不是取出 iSerialNumber就可以的。這里的 iSerialNumber僅僅是一個索引值。如果想得到序列號,就需要定義一個結構,然后給設備發送個請求。請求的結構如下圖:

代碼參照GetStringDescriptor函數。可以根據iSerialNumber偏移,取出其對應的字符串,存放在上圖USB_STRING_DESCRIPTOR結構中。

posted on 2010-11-17 10:25 wrh 閱讀(3211) 評論(0)  編輯 收藏 引用


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


導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿(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>
            欧美大尺度在线| 在线观看视频一区| 欧美综合激情网| 午夜精品久久久久久99热软件| 99re66热这里只有精品4| 91久久久久久国产精品| 亚洲人线精品午夜| 亚洲午夜在线视频| 欧美一区二区啪啪| 久久亚洲欧洲| 亚洲欧洲视频在线| 亚洲美女免费精品视频在线观看| 欧美激情在线观看| 一本色道久久综合| 欧美在线看片| 欧美精品国产一区| 国产精品草莓在线免费观看| 国产一区二区精品久久99| 亚洲国产精品综合| 午夜精品久久久久久久蜜桃app| 亚洲与欧洲av电影| 欧美91大片| 午夜精品美女久久久久av福利| 日韩午夜视频在线观看| 亚洲夜晚福利在线观看| 久久精品免费播放| 欧美午夜不卡| 亚洲国产毛片完整版| 欧美一区二区三区视频在线| 亚洲激情第一页| 午夜宅男欧美| 欧美日精品一区视频| 亚洲国产乱码最新视频| 久久se精品一区精品二区| 亚洲精品视频一区| 久久男人资源视频| 国产麻豆成人精品| 亚洲深夜福利在线| 91久久久在线| 老司机午夜精品视频在线观看| 欧美日韩日韩| 亚洲精品美女在线观看播放| 久久在线观看视频| 亚洲一区二区三区精品在线观看| 欧美 亚欧 日韩视频在线| 国产综合色一区二区三区| 欧美一级免费视频| 在线中文字幕日韩| 欧美日韩成人网| 亚洲六月丁香色婷婷综合久久| 欧美亚洲日本一区| 亚洲桃花岛网站| 欧美性大战xxxxx久久久| 在线亚洲成人| 亚洲美女视频| 欧美午夜影院| 午夜亚洲视频| 亚洲欧美日韩在线高清直播| 国产精品区一区二区三| 西西裸体人体做爰大胆久久久| 亚洲乱码精品一二三四区日韩在线 | 亚洲综合首页| 国产精品初高中精品久久| 在线综合欧美| 亚洲系列中文字幕| 国产欧美日韩精品a在线观看| 亚洲一区二区三区在线看| 亚洲视频在线观看三级| 国产精品一区二区久久精品| 欧美一二区视频| 欧美中文字幕在线视频| 在线观看日韩专区| 亚洲欧洲一区二区天堂久久| 欧美日韩国产一级片| 亚洲欧美视频在线观看| 欧美亚洲系列| 欧美一区二区精品在线| 9国产精品视频| 欧美日韩一区高清| 篠田优中文在线播放第一区| 欧美一区二区视频观看视频| 国外成人免费视频| 91久久黄色| 国产美女扒开尿口久久久| 老司机免费视频久久| 美女主播一区| 亚洲综合久久久久| 久久久久久久999| 一二三区精品福利视频| 午夜精品影院在线观看| 亚洲激情成人在线| 亚洲一卡久久| 亚洲黄色视屏| 亚洲欧美中文日韩v在线观看| 国际精品欧美精品| 亚洲区在线播放| 国产一区二区三区四区在线观看 | 午夜精品视频在线观看| 欧美一区视频在线| 9色porny自拍视频一区二区| 亚洲综合丁香| 一本色道88久久加勒比精品| 久久精品99无色码中文字幕| 亚洲天堂男人| 欧美大胆人体视频| 久久久久一区| 欧美三级电影大全| 欧美国产激情| 国产一区二区三区精品欧美日韩一区二区三区| 免费亚洲一区| 国产亚洲精品高潮| 亚洲素人一区二区| 一区二区三区免费在线观看| 久久一区二区三区四区| 久久不射2019中文字幕| 欧美视频在线一区二区三区| 欧美成人免费在线观看| 韩国亚洲精品| 欧美综合国产| 久久午夜精品| 一色屋精品视频免费看| 久久精品电影| 久久综合久久综合这里只有精品| 国产精品久久久久久久久久免费看| 免费黄网站欧美| 韩国精品主播一区二区在线观看| 亚洲视频一起| 亚洲综合不卡| 国产精品久久国产精麻豆99网站| 亚洲高清免费| 亚洲激情网址| 欧美国产精品v| 亚洲国产精品欧美一二99| 亚洲国产成人av| 蜜臀91精品一区二区三区| 欧美成人在线免费视频| 亚洲国产导航| 欧美第一黄网免费网站| 午夜精品影院| 亚洲一级片在线观看| 一区二区三区视频在线观看| 国产精品99久久久久久久久久久久| 欧美成人亚洲| 亚洲高清自拍| 欧美a级大片| 亚洲精品免费在线播放| 一本一道久久综合狠狠老精东影业| 久久综合一区二区三区| 欧美成人一区二区在线| 日韩亚洲成人av在线| 欧美精品一区在线观看| 99在线热播精品免费99热| 亚洲欧美综合v| 国产主播一区二区三区四区| 久久亚洲美女| 日韩天堂av| 久久精品女人| 亚洲日本中文字幕区| 欧美日韩不卡视频| 亚洲欧美电影院| 美女成人午夜| 亚洲午夜国产成人av电影男同| 国产精品久久久久久久久果冻传媒| 宅男噜噜噜66一区二区| 久久九九久久九九| 亚洲欧洲精品天堂一级| 欧美日韩国产首页在线观看| 亚洲欧美在线一区二区| 欧美顶级大胆免费视频| 亚洲欧美不卡| 亚洲电影在线免费观看| 欧美日韩亚洲国产一区| 久久爱另类一区二区小说| 亚洲国产精品高清久久久| 午夜在线一区二区| 亚洲精品国久久99热| 国产女主播视频一区二区| 欧美电影在线播放| 欧美专区18| 亚洲一区二区三区四区五区午夜| 久久久国产精品亚洲一区 | 国产精品黄视频| 久久久一区二区| 亚洲小说欧美另类婷婷| 亚洲丰满少妇videoshd| 久久成人在线| 亚洲午夜一二三区视频| 亚洲高清自拍| 激情婷婷亚洲| 国产欧美一区二区三区在线看蜜臀 | 亚洲欧美日韩中文播放| 亚洲国产成人tv| 国产性天天综合网| 欧美日韩一区免费| 欧美大片第1页| 久久亚洲精品一区二区| 欧美在线首页| 午夜精品久久久久久久蜜桃app| 亚洲人成艺术| 亚洲国产黄色|