这个思路,大家看看对不对
用这个GUID:53f56307-b6bf-11d0-94f2-00a0c91efb8b
首先 SetupDiGetClassDevs
然后 SetupDiEnumDeviceInterfaces
再 SetupDiGetDeviceInterfaceDetail可以得到一个设备路径,用这个设备路径可以CreateFile打开设备得到句柄,然后用这个句柄用DeviceIoControl函数得到Serial number
结构:IOCTL_STORAGE_QUERY_PROPERTY,可是只能得到硬盘的Serial number,就是得不到U盘的Serial number,这是为什么?
其实根据你的思路,再增加几个动作是可以获得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设备进行访问,可以得到它.
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: 0x01
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Full
Device Address: 0x02
Open Pipes: 2
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x00
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x00
Configuration 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: 0x00
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x00
用这个GUID:53f56307-b6bf-11d0-94f2-00a0c91efb8b
首先 SetupDiGetClassDevs
然后 SetupDiEnumDeviceInterfaces
再 SetupDiGetDeviceInterfaceDetail可以得到一个设备路径,用这个设备路径可以CreateFile打开设备得到句柄,然后用这个句柄用DeviceIoControl函数得到Serial number
结构:IOCTL_STORAGE_QUERY_PROPERTY,可是只能得到硬盘的Serial number,就是得不到U盘的Serial number,这是为什么?
其实根据你的思路,再增加几个动作是可以获得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设备进行访问,可以得到它.
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: 0x01
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Full
Device Address: 0x02
Open Pipes: 2
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x00
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x00
Configuration 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: 0x00
Endpoint Descriptor:
bEndpointAddress: 0x02
Transfer Type: Bulk
wMaxPacketSize: 0x0040 (64)
bInterval: 0x00