asdfghjkl
驱动牛犊
驱动牛犊
  • 注册日期2002-06-13
  • 最后登录2006-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4548回复:9

如何获取usb设备类型,急!!

楼主#
更多 发布于:2004-06-03 19:25
请问应用程序如何才能获得一个usb设备的类型(打印机、u盘等)?
用DeviceIoControl(hHubDevice,
        IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,...)
试图获取一个hub所接设备的usb设备描述符,得不到正确结果。请问这是为什么?还有其它方法吗?

[编辑 -  6/12/04 by  asdfghjkl]

最新喜欢:

xingzhe23xingzh...
flyhye
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2012-01-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-03 20:02
要获得一个usb设备的类型,你应该找的是接口描述符中的bInterfaceClass才对呀

请问应用程序如何才能获得一个usb设备的类型(打印机、u盘等)?

ddk中的usbview示例用:
DeviceIoControl(hHubDevice,
        IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,
        ...)
试图获取一个hub所接设备的usb设备描述符,但返回的USBDeviceDescriptor.bDeviceClass域总是为0。

这是为什么呢?还有其它方法吗?

曾经发过一次,一直无人回答;查了不少资料,也没有头绪。还望高手不佞赐教。
千载奇逢,无如好书良友 一生清福,只在碗茗炉烟
flyhye
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2012-01-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-04 12:40
参考usbview中的GetConfigDescriptor()中获得the entire Configuration Descriptor,应该需要两次调用DeviceIoControl,第一次是获得the entire Configuration Descriptor的长度,然后在分配空间,第二次再调用就可以获得了完整的配置信息。
你要的数据应该位于第9+5个byte上。

谢谢回复!
但请问如何找呢?
千载奇逢,无如好书良友 一生清福,只在碗茗炉烟
hustdj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-06
  • 最后登录2008-07-02
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-04 16:15
USB从设备的分类可以从USB设备接口描述符(Standard Interface Descriptor)对应的的bInterfaceClass这一个byte得到。
bInterfaceClass的典型代码为1,2,3,6,7,8,9,10,11,255。分别代表意思为1-audio:表示一个音频设备。2-communication device:通讯设备,如电话,moden等等。3-HID:人机交互设备,如键盘,鼠标等。6-image图象设备,如扫描仪,摄像头等,有时数码相机也可归到这一类。7-打印机类。如单向,双向打印机等。8-mass storage海量存储类。所有带有一定存储功能的都可以归到这一类。如数码相机大多数都归这一类。9-hub类。11-chip card/smart card。255-vendor specific.厂家的自定义类,主要用于一些特殊的设备。如接口转接卡等。

flyhye
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2012-01-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-04 17:22
好!
还是你这个详细!

USB从设备的分类可以从USB设备接口描述符(Standard Interface Descriptor)对应的的bInterfaceClass这一个byte得到。
bInterfaceClass的典型代码为1,2,3,6,7,8,9,10,11,255。分别代表意思为1-audio:表示一个音频设备。2-communication device:通讯设备,如电话,moden等等。3-HID:人机交互设备,如键盘,鼠标等。6-image图象设备,如扫描仪,摄像头等,有时数码相机也可归到这一类。7-打印机类。如单向,双向打印机等。8-mass storage海量存储类。所有带有一定存储功能的都可以归到这一类。如数码相机大多数都归这一类。9-hub类。11-chip card/smart card。255-vendor specific.厂家的自定义类,主要用于一些特殊的设备。如接口转接卡等。

 
千载奇逢,无如好书良友 一生清福,只在碗茗炉烟
asdfghjkl
驱动牛犊
驱动牛犊
  • 注册日期2002-06-13
  • 最后登录2006-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-05 13:56
非常感激两位的解答,虽然还不知这种方法能否达到我需要的效果。

最后请问如何给您们分呢?
flyhye
驱动小牛
驱动小牛
  • 注册日期2003-07-01
  • 最后登录2012-01-11
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-08 17:52
不对,如果是用usbview的话,它已经获得了,你直接用就可以了,只是记得是第9+5个byte就是你所需的

刚才试了一下,在usbview的示例中, USB_CONFIGURATION_DESCRIPTOR和USB_DEVICE_DESCRIPTOR(但bDeviceClass总是为0)都能正确得到。而试图获取USB_INTERFACE_DESCRIPTOR时,在第一次调用DeviceIoControl获得描述符长度时,就出错了(success=false)。这是为什么呀?

难道不是只需把GetConfigDescriptor()函数中的
configDescReq->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8)| DescriptorIndex;
改为configDescReq->SetupPacket.wValue = (USB_INTERFACE_DESCRIPTOR_TYPE << 8)| DescriptorIndex;
并修改分配的空间大小,就行了吗?是同样调用IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION吗?

急切盼望回复,谢谢!

[编辑 -  6/8/04 by  asdfghjkl]
千载奇逢,无如好书良友 一生清福,只在碗茗炉烟
asdfghjkl
驱动牛犊
驱动牛犊
  • 注册日期2002-06-13
  • 最后登录2006-05-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-12 18:24
已发过一些问题(包括刚发的“如何得到一个usb hub的指定端口上所接设备的"DEVINST"),但现在仔细一想发现可能没有把问题真正讲清楚,只好把以前的问题翻出来再发一次。浪费的版面就不好意思了,也在此感谢曾经热心帮助过的各位高手。

其实我是想从SP_DEVINFO_DATA/DEVINST得到usb设备的Interface Descriptor,以根据设备类型来决定是否禁用一个设备。但我目前只知道可用usbview的方法,通过IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION来获取接口描述符中的设备类型。现在却发现,不知怎样才能通过该方法得到对应的SP_DEVINFO_DATA或DEVINST,所以不能禁用设备。

请问还有其它方法吗?望赐教,谢了。
beiujm
驱动小牛
驱动小牛
  • 注册日期2005-11-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分983分
  • 威望129点
  • 贡献值0点
  • 好评度98点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-12-29 10:04
    query.PropertyId = StorageAdapterProperty;
    query.QueryType = PropertyStandardQuery;

    status = DeviceIoControl(
                        hDevice,                
                        IOCTL_STORAGE_QUERY_PROPERTY,
                        &query,
                        sizeof( STORAGE_PROPERTY_QUERY ),
                        &outBuf,                  
                        512,                      
                        &returnedLength,      
                        NULL                    
                        );
http://beiyu.bokee.com
zcgzdhxm
驱动牛犊
驱动牛犊
  • 注册日期2010-06-08
  • 最后登录2010-10-22
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望31点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2010-06-08 16:37
我也要
游客

返回顶部