获取用USB to IDE 连接的存储设备的设备信息(厂商、序列号什么的)

fly4free 2009-11-06 09:22:39
我的内置刻录机,由于供电问题,让我挪到了机箱外面。
我自己编程实现了,获取接入计算机的USB设备的信息,
在识别我这种连法的刻录机时,出现了问题,厂商信息被识别成"USB TO IDE",
iProduct、iSerialNumber为0
(用usbview也是这样结果)

但是,Windows自己的“停用设备”对话框,却能正确显示相关信息,windows是怎么获取到的
这让我想起,前一阵,有一个U盘,同样iVender, iProduct都为0,但是 “停用设备”对话框却能显示其型号信息
点击查看图(baidu hi)
(。该型号信息,与注册表中 SYSTEM\CurrentControlSet\Enum\USBSTOR下的相关键的 "FriendlyName" 键值相同)

各位,有遇到这种情况的吗,有没有个解决思路?
...全文
268 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ht_890107 2012-06-09
  • 打赏
  • 举报
回复
菜鸟求代码:2415499300@qq.com
MoXiaoRab 2009-11-07
  • 打赏
  • 举报
回复
用SetupAPI枚举设备看看,应该可行
fly4free 2009-11-07
  • 打赏
  • 举报
回复
使用 IOCTL_STORAGE_QUERY_PROPERTY 可以通过盘符来获得对应 硬件设备的vender、product等属性。
我再在 DBT_DEVTYP_VOLUME 里处理新卷增加吧。。。

获得后在用 5楼的 比较判断,保存USB使用记录。。

希望那个远在北京的没见过面的客户的手里的U盘,可以通过这个方式获得其牌子信息……
myshinji 2009-11-07
  • 打赏
  • 举报
回复
我目前的实现方法是在 DBT_DEVICEARRIVAL 里 捕获 DBT_DEVTYP_DEVICEINTERFACE 设备类型的接入
这样通过一系列方法,得到了该usb设备本身的信息

现在有个问题:
显示设备组件
参考上图。是个树形结构,系统自己有法子区分加载的卷属于哪一个设备的了(到底根据什么联系的呢?)
我想这个信息不是以USB设备标准保存在指定位置,可能还得需要 IOCTL_STORAGE_XXX 码的支持?
fly4free 2009-11-07
  • 打赏
  • 举报
回复
我是用IOCTL获取USB设备信息的(IOCTL_USB_GET_NODE_CONNECTION_NAME 等信息)

问题是:
此时,那个USB设备,是 "USB to IDE "这个东西,连着我的IDE硬盘,我向 "USB to IDE "这个东西 发送控制码,返回的是 它本身的信息,而不是它带着的硬盘的信息

这样,我该如何做呢?谢谢了啊~
myshinji 2009-11-07
  • 打赏
  • 举报
回复
哈哈,经过N个小时努力,终于弄明白了一点。

查看一个usb设备是不是 移动存储, 我的想法就是,如果产生了卷,那么就是移动存储。
可是怎么判断呢,
只好在 case DBT_DEVTYP_VOLUME: 里获取新增的盘符,然后 经过N步 获得其设备实例句柄,进而得到其在设备树上的父节点的设备实例句柄 hParentInst

而在之前接收到的 case DBT_DEVTYP_DEVICEINTERFACE 里经过M步骤可以得到 对应的SP_DEVINFO_DATA结构体数据,其成员DevInst的值就是 hParentInst。

说到这里,可能有人觉得和贴子标题没什么关系。。。我其实也不太确定接下来的试验会不会成功,我再想想吧。。。
MoXiaoRab 2009-11-06
  • 打赏
  • 举报
回复
你自己是用setupApi获取的?
系统貌似是用USB设备发送IOCTL获取信息的
Linux读取U盘或者移动硬盘序列号获取U盘或者移动硬盘分区名。基本原理如下: 当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。 相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0) 这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。 该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。 完整代码,可直接编译和测试,嵌入式环境下也是适应的。 在linux测试如下,id表示序列号,sdb1表示是分区名称: # ./a.out udisk dev num:0 udisk id:055CE21B ret:0 dev num:0 found dir:0:0:0:1 found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1 sub founction found dir:sda found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda found dir:0:0:0:2 found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2 sub founction found dir:sdb found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb found sd sub device dir:sdb1 found dir:0:0:0:0 found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0 sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory get name return:0,disk name:sdb1 # 因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧