• <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>

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

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

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

            下面介紹通訊用的幾個IOCTL:
            1)USB_HCD_DRIVERKEY_NAME ,用于獲取USB設(shè)備驅(qū)動在注冊表中的鍵名。相應的一個結(jié)構(gòu)體是:
            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 鍵名。使用的結(jié)構(gòu)體,跟上面一樣。
            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上的節(jié)點設(shè)備信息。也就是我們接在usb口上的所有usb設(shè)備的信息,對應的結(jié)構(gòu)體:
            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設(shè)備的信息,對應的結(jié)構(gòu)體:

            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設(shè)備的描述信息。
            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結(jié)構(gòu)中取出idVendor,idProduct這兩項的值就行了。如果要得到序列號,則不是取出 iSerialNumber就可以的。這里的 iSerialNumber僅僅是一個索引值。如果想得到序列號,就需要定義一個結(jié)構(gòu),然后給設(shè)備發(fā)送個請求。請求的結(jié)構(gòu)如下圖:

            代碼參照GetStringDescriptor函數(shù)。可以根據(jù)iSerialNumber偏移,取出其對應的字符串,存放在上圖USB_STRING_DESCRIPTOR結(jié)構(gòu)中。

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

            導航

            <2010年12月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統(tǒng)計

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久99国产综合精品| 亚洲国产成人久久综合碰碰动漫3d| 久久精品国产亚洲AV无码娇色 | 久久久精品人妻一区二区三区四| 伊人久久大香线蕉av不变影院| 国产精品99久久久久久猫咪| 伊人久久大香线蕉成人| 久久线看观看精品香蕉国产| 久久亚洲精品中文字幕| 精品久久久无码21p发布| 人妻少妇精品久久| 久久久久亚洲av成人无码电影| 日本久久久精品中文字幕| 四虎国产精品成人免费久久| 久久不见久久见免费视频7| 香蕉aa三级久久毛片| 国产三级久久久精品麻豆三级| 亚洲精品乱码久久久久久蜜桃| 久久久久亚洲爆乳少妇无| 色88久久久久高潮综合影院| 久久久久无码专区亚洲av| 精品久久久久久99人妻| 国产—久久香蕉国产线看观看| 亚洲精品无码久久千人斩| 久久久久久九九99精品| 亚洲国产天堂久久综合| 久久精品亚洲福利| 狠狠久久综合伊人不卡| 国产精品青草久久久久婷婷| 久久免费视频观看| 久久久久久久97| 99国产精品久久久久久久成人热| 久久强奷乱码老熟女网站 | 99久久无色码中文字幕人妻| 看全色黄大色大片免费久久久| 国产精品无码久久四虎| 国产精品亚洲美女久久久| 久久精品国产亚洲一区二区三区| 国产精品伦理久久久久久| 精品久久久久中文字幕一区| 久久精品女人天堂AV麻|