我是这个思路,大家看看对不对
用这个GUID:53f56307-b6bf-11d0-94f2-00a0c91efb8b
首先 SetupDiGetClassDevs
然后 SetupDiEnumDeviceInterfaces
再 SetupDiGetDeviceInterfaceDetail可以得到一个设备路径,用这个设备路径可以CreateFile打开设备得到句柄,然后用这个句柄用DeviceIoControl函数得到Serial number
结构:IOCTL_STORAGE_QUERY_PROPERTY,可是只能得到硬盘的Serial number,就是得不到U盘的Serial number,这是为什么?

解决方案 »

  1.   

    不好意思,偶先提个问题,U盘有像硬盘一样的Serial number么?
      

  2.   

    有的[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&Ven_Netac&Prod_OnlyDisk&Rev_1.11\221D19FD3D8E6261&0]221D19FD3D8E6261就是硬件ID了[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR\Disk&Ven_____&Prod______&Rev_4.00\1F3312000265&0]1F3312000265就是硬件ID了
      

  3.   

    lixiaosan(小三):
    是的,有的品牌U盘没有,但有的U盘的确有呀
    希望大家多多帮忙
      

  4.   

    U盘不一定有序列号,而且那个不是规定需要有的,但是一定有PID和VID,根据这两个也可以判断
      

  5.   

    PID和VID是哪个,举个例子行吗?
      

  6.   

    其实根据你的思路,再增加几个动作是可以获得USB Mass Storage Device的Serial Number的.
    如果是我,我的方法有两个:
    (1)通过驱动程序来向硬件发送命令,这样可以得到存储装置设备实例的Device Instance IDs,这个东西类似于下面的字符串:
    硬盘:PCIIDE\IDECHANNEL\4&E3EC092&0&0
    USB存储器:USB\VID_04A5&PID_6130\0002F0EB6D990414
    像0002F0EB6D990414就是你所要的Serial Number.
    (2)用DDK直接对USB设备进行访问,可以得到它.
      

  7.   

    Microsnow(冰火):
    谢谢你给提供的方法,我想问一下,用DDK对USB设备访问具体要怎么操作呢?
      

  8.   

    zblaoshu1979(周博):你有DDK吗?在DDK里面就有一个Sample叫做USBView,你可以参考它的源代码.因为
      

  9.   

    有DDK,也看了USBView,但是没怎么看明白,他得到的
    Device Descriptor:
    bcdUSB:             0x0110
    bDeviceClass:         0x00
    bDeviceSubClass:      0x00
    bDeviceProtocol:      0x00
    bMaxPacketSize0:      0x40 (64)
    idVendor:           0x0EA0
    idProduct:          0x6803
    bcdDevice:          0x0100
    iManufacturer:        0x01
    iProduct:             0x02
    iSerialNumber:        0x03
    bNumConfigurations:   0x01ConnectionStatus: DeviceConnected
    Current Config Value: 0x01
    Device Bus Speed:     Full
    Device Address:       0x02
    Open Pipes:              3Endpoint Descriptor:
    bEndpointAddress:     0x81
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x00Endpoint Descriptor:
    bEndpointAddress:     0x02
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x00Endpoint Descriptor:
    bEndpointAddress:     0x83
    Transfer Type:   Interrupt
    wMaxPacketSize:     0x0002 (2)
    bInterval:            0x01iSerialNumber:        0x03是什么意思呀?
      

  10.   

    DDK里面的USBView你已经编译通过了,这样很好.之所以会出现:iSerialNumber:       0x03,那是因为你没有对设备进行Config Descriptors.你可以试着做一个动作:
    启动USBView.exe后,把USB设备插上去.在"Options"菜单下选中"Config Descriptors"项,然后再到"File"菜单下,点击"Refresh F5"子菜单项,这样Serial Number就会看到了.
    以下是我看到的结果:
    Device Descriptor:
    bcdUSB:             0x0110
    bDeviceClass:         0x00
    bDeviceSubClass:      0x00
    bDeviceProtocol:      0x00
    bMaxPacketSize0:      0x40 (64)
    idVendor:           0x04A5 (Acer Peripherals Inc.)
    idProduct:          0x6130
    bcdDevice:          0x1001
    iManufacturer:        0x01
    0x0409: "<USB MF>"
    iProduct:             0x02
    0x0409: "<USB PRODUCT>   "
    iSerialNumber:        0x03
    0x0409: "0002F0EB6D9C050B"
    bNumConfigurations:   0x01ConnectionStatus: DeviceConnected
    Current Config Value: 0x01
    Device Bus Speed:     Full
    Device Address:       0x02
    Open Pipes:              2Endpoint Descriptor:
    bEndpointAddress:     0x81
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x00Endpoint Descriptor:
    bEndpointAddress:     0x02
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x00Configuration Descriptor:
    wTotalLength:       0x0020
    bNumInterfaces:       0x01
    bConfigurationValue:  0x01
    iConfiguration:       0x04
    0x0409: "USB/MSC LCD Player"
    bmAttributes:         0x80 (Bus Powered )
    MaxPower:             0x32 (100 Ma)Interface Descriptor:
    bInterfaceNumber:     0x00
    bAlternateSetting:    0x00
    bNumEndpoints:        0x02
    bInterfaceClass:      0x08
    bInterfaceSubClass:   0x06
    bInterfaceProtocol:   0x50
    iInterface:           0x05
    0x0409: "Internal Device"Endpoint Descriptor:
    bEndpointAddress:     0x81
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x00Endpoint Descriptor:
    bEndpointAddress:     0x02
    Transfer Type:        Bulk
    wMaxPacketSize:     0x0040 (64)
    bInterval:            0x00
      

  11.   

    非常感谢 Microsnow(冰火) 
    在结贴之前我再问你个问题,怎么把USBVIEW在VC中编译?(我是用DDK编译的)
      

  12.   

    DDK中的例子要在VC中编译,需设置VC的一些环境参数.至于具体怎么操作,你可以到网上搜索一下,这方面的资料应该很多.祝你成功!
      

  13.   

    谢谢Microsnow(冰火) ,结贴。