阅读:1206回复:4
USB设备的driver不能被正确卸载
我的USB设备的driver只是一个单纯的wdm usb驱动。向上通过文件操作直接与应用程序打交道。在作HCT测试时,没有打开应用程序,拔下设备再插上,设备管理器会报如下错误(windows XP):
The driver could not be loaded because a previous instance is still loaded。 就是说前一次插上时加载的驱动因为某些原因(我想应该是仍然存在对它的引用),没有被卸载。我应该怎么避免这种错误呢?请高手指点一下。 |
|
沙发#
发布于:2003-08-02 06:24
检查一下你的驱动在卸载前有什么资源没有释放 ?
|
|
|
板凳#
发布于:2003-08-02 12:19
谢谢你的答复。
事实上,应用程序没有打开,从调试信息看也没有其他的程序打开driver而触发create例程。HCT模拟了一次意外拔除设备的事件,在收到并处理PnpSurpriseRemove后正常的进入了PnpRemove例程和Unload例程。但设备再次\"插上\"时,却出现了前面提到的错误。 下面是PnpSurpriseRemove例程的主要代码,请帮我看一下有什么毛病没有。 /* release all resource ..... */ IoCopyCurrentIrpStackLocationToNext(pIrp); status = IoCallDriver( pDeviceExt->m_pNextStackDeviceObject, pIrp); DPL((\"Set device interface false\\n\")); IoSetDeviceInterfaceState( &pDeviceExt->m_uifSymLinkName, FALSE); IoDetachDevice(pDeviceExt->m_pNextStackDeviceObject); if(pDeviceExt->m_uifSymLinkName.Buffer != NULL) { IoDeleteSymbolicLink(&pDeviceExt->m_uifSymLinkName); ExFreePool(pDeviceExt->m_uifSymLinkName.Buffer); RtlZeroMemory(&pDeviceExt->m_uifSymLinkName,sizeof (UNICODE_STRING)); } IoDeleteDevice(pFdo); return status; |
|
地板#
发布于:2003-08-02 12:22
系统在driver执行完Unload例程后还需要做什么动作才会真正卸载driver呢?
|
|
地下室#
发布于:2003-08-05 08:43
老哥,这可能是microsoft的bug,在windows内部,对象有公共的头部,在_DRIVER_OBJECT的前17字节处就是_DRIVER_OBJECT的计数,你可以判断是不是该卸载,如果该卸载,直接将其改为0即可。
|
|