阅读:1711回复:5
(敬请关注)usb设备对象句柄没有全部close的情况下,拔掉设备产生的问题!
问题陈述:
做了一个usb设备的驱动程序,在应用程序还持有usb设备对象句柄的情况下(此时已没有i/o操作),拔掉usb设备,然后再插上usb设备,会导致usb设备无法正常加载。IoCreateDevice设备对象的时候没有给DeviceName,而是IoRegisterDeviceInterface注册了一个设备接口类guid。跟踪此过程,发现pnp管理器没有发送IRP_MN_REMOVE_DEVICE的pnp请求,而必须等到应用程序close所有设备对象句柄之后,才会发出。 请问,如何在应用程序持有设备对象句柄的情形下,仍然彻底完成对驱动程序的卸载?请高人指点迷津! |
|
|
沙发#
发布于:2004-08-11 09:26
笨办法:在应用程序中定时检测设备是否存在,如果不存在了就CloseHandle
|
|
|
板凳#
发布于:2004-08-11 11:39
只有在所有设备对象句柄都被释放以后,才会 IRP_MN_REMOVE_DEVICE,这在 DDK 的文档里已经写的很清楚了。所以你想在“在应用程序持有设备对象句柄的情形下,仍然彻底完成对驱动程序的卸载”是不可能的。
但是在usb设备被子突然拔出时驱动会收到 IRP_MN_SURPRISE_REMOVAL,你可以在处理这个 IRP 时做些动作帮助应用程序释放句柄。 DDK 中写出了一种方式,就是在 IRP_MN_SURPRISE_REMOVAL 时IoSetDeviceInterfaceState(FALSE)。在应用程序中可以截获这个事件,释放句柄。 |
|
地板#
发布于:2007-03-02 10:33
按照2楼的方法,在驱动中是不是说不能完全解决这个问题,而要在应用层来解决?
有没有可能在驱动中解决这个问题,因为应用层不是我来编写? |
|
|
地下室#
发布于:2007-03-02 11:17
引用第2楼cockliujun于2004-08-11 11:39发表的“”: 说得好! |
|
|
5楼#
发布于:2007-03-02 16:17
在驱动中能否释放打开设备的句柄呢?
|
|
|