一个关于检测usb加密狗的简单问题,可否不用ddk?如果解决了,再加100分

liyin_first 2005-10-30 12:39:26
需求如下:1.开机的时候,检测加密狗是否插入,如果没有,就弹出提示。
2.可以动态检测加密狗的插入和拔除,并弹出提示。

我在VC和.NET论坛上面也找了相应的资料,大体思路就是遍历usbroot下面的各个接口,检测相应的设备;可以捕获WM_DEVICECHANG事件,来获取usb设备的状态。

实现方法可以通过ddk,也可以通过hid.dll,setupapi.dll等几个库来做。

我现在的问题是:
1.采用hid.dll,setupapi.dll等库的方式做的时候,只能列出系统插入的“PNP设备ID”以“HID\……”开头的设备(采用msinfo32.exe查看-系统摘要》组件-》usb),也就是说以“USB\”或者“PCI\”或者“STOR\”开头的都看不到,我通过程序无法看到优盘,移动硬盘等,只能看到我的IE3.0的微软鼠标,以"HID\"开头的。我就觉得奇怪了。具体程序可以见http://www.lvr.com/hidpage.htm
2.我这里加密狗的牌子有可能是不同的,就是程序可以检测到所有类型加密狗的情况。但是VID,PID好像具体跟公司出产的某个加密狗是相关的。我能不能只写一段通用的程序,就可以判断出所有公司出产的加密狗是否在系统中,也就是加密狗有没有什么共同的ID或者其他什么特征。


小弟对win32以及MFC编程都不是很熟,所以找的一些程序是在.NET上封装usb的一些库来进行调用的。
如下使我找得一些封装usb接口到.NET的例子,但是我运行起来始终无法获取“USB”开头的设备。

http://www.lvr.com/hidpage.htm
http://www.icsharpcode.net/OpenSource/SharpUSBLib/default.aspx
http://msdn.microsoft.com/coding4fun/someassemblyrequired/isthatyou/default.aspx
...全文
479 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
会思考的草 2005-10-31
  • 打赏
  • 举报
回复
根据你描述的情况看,我觉得有可能是你在调用SetupAPI的时候指定错了设备类的GUID。
会思考的草 2005-10-31
  • 打赏
  • 举报
回复
可能你的和我的情况不同,我要找的是U盘,所以是使用
DEFINE_GUID \
(HARDDISK_GUID, 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID \
(VOLUME_GUID, 0x53f5630d, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
这两个GUID来找的。不知道你的加密狗插上去windows会认成什么设备?
liyin_first 2005-10-31
  • 打赏
  • 举报
回复
to codewarrior(会思考的草)
我就是觉得奇怪,为什么我用SetupAPI无法获取“USB/”开头的设备,只能获取“HID/”开头的。

to saliors(正在学习中)
比较不幸的是,需要满足不同加密狗的要求。也就是A公司的加密狗和B公司的加密狗有没有什么相同的地方,PID会不会有相同的地方?
saliors 2005-10-31
  • 打赏
  • 举报
回复
一般加密狗的厂家都会提供相应的sdk或者开发包,里面有可供调用的函数,并不需要自己写,楼主可以联系加密狗的供应商看看。
saliors 2005-10-31
  • 打赏
  • 举报
回复
就我认为,加密狗可以是完全不同的硬件结构,所以不应该有都有共同的特点,就算一部分有相同的特征,也不能保证所有的都有该相同的特征。嗯,这是我的看法,仅供楼主参考。
qaz1984 2005-10-30
  • 打赏
  • 举报
回复
up
会思考的草 2005-10-30
  • 打赏
  • 举报
回复
使用SetupAPI可以取得USB子键下的键值的吧,我就是用这个方法取得U盘盘符的阿。
liyin_first 2005-10-30
  • 打赏
  • 举报
回复
to raidenzxx(小强)
对,可能是这个问题。
我的usb鼠标找的到,但是其中的值为“\\?\hid#vid_045e&pid_0039#6&632ed5a&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}” 前面有几个字符“\\?\”,不知道哪里来得。

但是 以usb开头的还是找不到
raidenzxx 2005-10-30
  • 打赏
  • 举报
回复
If SE = ERROR_INSUFFICIENT_BUFFER Then
ReDim Buffer(BufferLen - 1)
Buffer(0) = 5
Retval = SetupDiGetDeviceInterfaceDetail(hDevInfoI, DIDI, Buffer(0), BufferLen,BufferLen, ByVal 0&)
End If
raidenzxx 2005-10-30
  • 打赏
  • 举报
回复
这里好像有个字节替换的问题好像是UNICODE显示的问题造成的
如果你确定SetupDiGetDeviceInterfaceDetail返回的buffer里有数据
那你必须替换buffer首地址的字节为&H5,VC6没这种问题

我在VB里面试的时候,它就是不显示,而且返回buffer里面确实有数据,
具体是什么原因造成的,没时间去研究它
liyin_first 2005-10-30
  • 打赏
  • 举报
回复
up
UnrealImagecoffee 2005-10-30
  • 打赏
  • 举报
回复
hook 也 可以 搞定 吧!◎◎

2,640

社区成员

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

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