阅读:2435回复:13
usb插拔急救!!SOS!!
我有一个很急的问题请教大家
我想实现这样的一个功能: usb口上的智能卡拔出以后 系统自动进入到锁定的状态 同时要求屏蔽原先usb异常拔出时的出错对话框。 已有的解决方案是: 通过厂商提供的函数来定时查询usb智能卡是不是正常连接 可是我没有办法阻止系统接收usb未正常联接的状态信息 所以那个出错对话框总是有 :( 有什么可以解决的办法呢 我看了有关于usb驱动的书,知道了操作系统可以提供api来对usb设备进行访问,好像是UsbBuild一类的函数,其中的URB包可以用来获得当前usb的状态信息,可是是不是还是要采用查询的方法来不停给usb发URB呢?这样好像仍旧效率很低的。 我还想了解一点:usb插拔以后,是不是会向操作系统主动发消息呢?从2000的设备管理来看,WM_DEVICECHANE引起了系统广播查询当前是那一个设备发生了状态改变(包括USB),可是我怎么确定是不是usb上的设备发出的呢?usb插拔以后,到底是什么消息引起了WM_DEVICECHANE这个消息的广播阿? 这样的消息是不是已经写在了硬件驱动,或者有可能位于厂商提供的说明书呢? 请高手赐教阿 20分送上 [编辑 - 11/7/02 by cherryzh] |
|
最新喜欢:![]() |
沙发#
发布于:2002-11-08 09:23
用RegisterDeviceNotification可以登记监视设备的接口变化事件
在WM_DEVICECHANE做你想做的事情,我曾用他做过一个监视HID设备变化事件的程序。 |
|
|
板凳#
发布于:2002-11-08 11:25
这也是我想提的两个问题,其一怎样由系统消息得到我的设备的状态改变,RegisterDeviceNotification有没有具体的例子。其二如何屏蔽异常拔出时的出错对话框(不安全的设备拔出),请高手指教。
|
|
|
地板#
发布于:2002-11-08 16:22
长见识!
|
|
地下室#
发布于:2002-11-08 20:54
第二个问题巨好解决,去查“several tips“的帖子。
第一个,ddk里面好像有例子。去看看俺的zboard也行。 :D |
|
|
5楼#
发布于:2002-11-09 11:38
谢谢,rayyang大侠
|
|
|
6楼#
发布于:2002-11-09 13:40
RegisterNotification...这个好像可以尝试一下。我想也用的。但是我没有办法获得usb的GUID,这个可是怎么办好呢? 也就说,我现在可以通过检查wm_devicechange来获得系统硬件改变的事件,可是我现在没有办法知道是不是usb口上的事情啊 请赐教
另外,我发现 wm_devicechange中的具体情况让我弄不明白,我明明是拔出了usb设备,为什么他反馈的是 devicenodechange 而不是我所想象的 deviceremove??? 请再赐教 |
|
7楼#
发布于:2002-11-09 13:48
斑竹 你在several tips 讲到的 irp 是干什么的,在什么情况下才会用到阿 我在msdn看的云里雾里的
另外请帮忙解答一下关于在RegisterNotificaion中获得usb设备的guid的问题 感激不尽 |
|
8楼#
发布于:2002-11-09 15:22
irp是I/O请求包,驱动程序通信用的,随便一本驱动的书里就有,非常重要
RegisterDeviceNotification得提供usb设备的guid,如果你手头没有,看看inf文件,或许会有 RegisterDeviceNotification按我的理解是能注册特定的设备以监视特定设备的接口变化,只是使用RegisterNotificaion似乎并达不到预期的效果,对什么设备的插拔都有反应,气得我,我,但试用了usbview它也会对com口的启用停用有反应,到底要怎样做呢,请用过的高手指点 |
|
|
9楼#
发布于:2002-11-12 21:13
BOOL RegisterNotification()
{ DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) ); NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; NotificationFilter.dbcc_classguid = GUID_CLASS_UKEY; hDevNotify = (HANDLE)RegisterDeviceNotification( hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE ); return (hDevNotify != NULL); } 这是我的一段代码。:) 另外一个帖子里面,我贴上了OnDeviceChange的代码,在里面你可以找到发送WM_DEVICECHANGE对应的GUID。但是,如果是U盘,就没有GUID的信息,只要从头到尾查一遍。:( |
|
|
10楼#
发布于:2002-11-13 10:03
谢谢斑竹,:D :D
一直认为使用RegisterDeviceNotification后,WM_DEVICECHANGE消息只对注册了的设备有反应,其实不然,此函数结果是使窗口能接收notifications,在处理WM_DEVICECHANGE消息时,对notifications进行分析。 |
|
|
11楼#
发布于:2002-11-13 10:38
NotificationFilter.dbcc_classguid = GUID_CLASS_UKEY;
? 如果不是指定的设备的guid,那么后面的UID_CLASS_UKEY又是什么意思啊 请问在什么地方可以得到这个参数阿? |
|
12楼#
发布于:2002-11-13 10:42
另外一个帖子里面,我贴上了OnDeviceChange的代码,在里面你可以找到发送WM_DEVICECHANGE对应的GUID。但是,如果是U盘,就没有GUID的信息,只要从头到尾查一遍。
请问那个贴子在那里? 从头到尾查一遍是是什么意思啊? |
|
13楼#
发布于:2002-11-15 00:53
26个驱动器,全部找一遍。
另外,楼主说的拔卡锁定PC,其实正确的方法应该是在9X/ME下用NP,2NT/2K/XP下用GINA。而且98以后的OS自己支持smarcard,只要reader的driver做的好,可以省很多事情,而且还可以加个WHQL的标记。 :) |
|
|