阅读:1243回复:6
帮忙解觉一下这个问题
现小弟遇到这样一个问题,就是对一块USB板用ISO Stream方式采集视频数据。假如在工作的时候把USB从主机上拔掉,程序、驱动、系统都不死,(驱动还在正常采集数据,只是采集不到数据),当我把USB接口插回去死,机器立即蓝屏重起。后来反复试验发现,主要是设备句柄还没有关闭,当设备再次被检测到时机器就死了。
请教大侠这个问题怎么解决。在驱动层有没有办法,在应用层怎么获知设备被删除,谢先 |
|
|
沙发#
发布于:2002-12-04 09:05
以前做USB鼠标的时候也遇到过类似问题。在驱动层不用做什么特殊处理,只要PNP消息处理正确就行了。在应用层,当设备被拔掉时,实际上Driver在这个时候已经被卸载了,所以当继续调用DeviceIoControl时会出错,这时,先关掉原来打开的句柄,让后让应用程序进入定时检测状态,也就是使用一个Timer,然后在Timer的Callback函数里去试着打开Driver,如果打不开,说明设备还没有接回去,如果能够打开,则退出检测状态,继续原来的工作。
|
|
板凳#
发布于:2002-12-04 09:44
有没有驱动通知应用层的方法,比如说应用层接受驱动层发出的事件等等
|
|
|
地板#
发布于:2002-12-04 10:32
去下载版主的 zboard 源代码. :D
|
|
|
地下室#
发布于:2002-12-04 10:33
zboadr 论坛. 补充一句.
|
|
|
5楼#
发布于:2002-12-04 11:13
是什么东东呀
|
|
|
6楼#
发布于:2002-12-04 19:04
如果真的需要驱动通知应用层的话,可先从应用层生成一个Event,然后把Event Handle传给Driver,如果是WDM的话,用ObReferenceObjectByHandle把EventHandle转为Driver可以使用的另一个Handle,然后在需要的时候用KeSetEvent触发事件。如果是VXD,则先在应用层用OpenVxDHandle把EventHandle转化一下,然后把转化后的Handle传给Driver,再由Driver调用VWIN32_ResetEvent来触发事件。
|
|