cherryzh
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2434回复:13

usb插拔急救!!SOS!!

楼主#
更多 发布于:2002-11-07 22:34
我有一个很急的问题请教大家
我想实现这样的一个功能: 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]

最新喜欢:

abei11abei11
acx
acx
驱动小牛
驱动小牛
  • 注册日期2001-04-28
  • 最后登录2012-05-07
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望57点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-08 09:23
用RegisterDeviceNotification可以登记监视设备的接口变化事件
在WM_DEVICECHANE做你想做的事情,我曾用他做过一个监视HID设备变化事件的程序。
很想你,身不由己……
nofer
驱动中牛
驱动中牛
  • 注册日期2001-06-08
  • 最后登录2008-12-17
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-08 11:25
这也是我想提的两个问题,其一怎样由系统消息得到我的设备的状态改变,RegisterDeviceNotification有没有具体的例子。其二如何屏蔽异常拔出时的出错对话框(不安全的设备拔出),请高手指教。
[img]http://www.driverdevelop.com/forum/upload/nofer/2002-11-16_32_740_5.jpg[/img] [size=3]想着梦中天堂的样子不知不觉睡着了。。。。 [/size]
jfory
驱动小牛
驱动小牛
  • 注册日期2002-05-14
  • 最后登录2003-06-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-08 16:22
长见识!
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-08 20:54
第二个问题巨好解决,去查“several tips“的帖子。
第一个,ddk里面好像有例子。去看看俺的zboard也行。 :D
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
nofer
驱动中牛
驱动中牛
  • 注册日期2001-06-08
  • 最后登录2008-12-17
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-09 11:38
谢谢,rayyang大侠
[img]http://www.driverdevelop.com/forum/upload/nofer/2002-11-16_32_740_5.jpg[/img] [size=3]想着梦中天堂的样子不知不觉睡着了。。。。 [/size]
cherryzh
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-11-09 13:40
RegisterNotification...这个好像可以尝试一下。我想也用的。但是我没有办法获得usb的GUID,这个可是怎么办好呢? 也就说,我现在可以通过检查wm_devicechange来获得系统硬件改变的事件,可是我现在没有办法知道是不是usb口上的事情啊 请赐教

另外,我发现 wm_devicechange中的具体情况让我弄不明白,我明明是拔出了usb设备,为什么他反馈的是 devicenodechange 而不是我所想象的 deviceremove???  请再赐教
cherryzh
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-09 13:48
斑竹 你在several tips 讲到的 irp 是干什么的,在什么情况下才会用到阿 我在msdn看的云里雾里的

另外请帮忙解答一下关于在RegisterNotificaion中获得usb设备的guid的问题

感激不尽
nofer
驱动中牛
驱动中牛
  • 注册日期2001-06-08
  • 最后登录2008-12-17
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-09 15:22
irp是I/O请求包,驱动程序通信用的,随便一本驱动的书里就有,非常重要
RegisterDeviceNotification得提供usb设备的guid,如果你手头没有,看看inf文件,或许会有

RegisterDeviceNotification按我的理解是能注册特定的设备以监视特定设备的接口变化,只是使用RegisterNotificaion似乎并达不到预期的效果,对什么设备的插拔都有反应,气得我,我,但试用了usbview它也会对com口的启用停用有反应,到底要怎样做呢,请用过的高手指点


[img]http://www.driverdevelop.com/forum/upload/nofer/2002-11-16_32_740_5.jpg[/img] [size=3]想着梦中天堂的样子不知不觉睡着了。。。。 [/size]
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
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的信息,只要从头到尾查一遍。:(
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
nofer
驱动中牛
驱动中牛
  • 注册日期2001-06-08
  • 最后登录2008-12-17
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望30点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-11-13 10:03
谢谢斑竹,:D :D
一直认为使用RegisterDeviceNotification后,WM_DEVICECHANGE消息只对注册了的设备有反应,其实不然,此函数结果是使窗口能接收notifications,在处理WM_DEVICECHANGE消息时,对notifications进行分析。
[img]http://www.driverdevelop.com/forum/upload/nofer/2002-11-16_32_740_5.jpg[/img] [size=3]想着梦中天堂的样子不知不觉睡着了。。。。 [/size]
cherryzh
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-11-13 10:38
NotificationFilter.dbcc_classguid = GUID_CLASS_UKEY;
?

如果不是指定的设备的guid,那么后面的UID_CLASS_UKEY又是什么意思啊 请问在什么地方可以得到这个参数阿?
cherryzh
驱动牛犊
驱动牛犊
  • 注册日期2002-11-07
  • 最后登录2002-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-11-13 10:42
另外一个帖子里面,我贴上了OnDeviceChange的代码,在里面你可以找到发送WM_DEVICECHANGE对应的GUID。但是,如果是U盘,就没有GUID的信息,只要从头到尾查一遍。

请问那个贴子在那里?
从头到尾查一遍是是什么意思啊?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-11-15 00:53
26个驱动器,全部找一遍。


另外,楼主说的拔卡锁定PC,其实正确的方法应该是在9X/ME下用NP,2NT/2K/XP下用GINA。而且98以后的OS自己支持smarcard,只要reader的driver做的好,可以省很多事情,而且还可以加个WHQL的标记。 :)
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
游客

返回顶部