dos
dos
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2010-02-24
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1206回复:4

USB设备的driver不能被正确卸载

楼主#
更多 发布于:2003-08-01 23:40
我的USB设备的driver只是一个单纯的wdm usb驱动。向上通过文件操作直接与应用程序打交道。在作HCT测试时,没有打开应用程序,拔下设备再插上,设备管理器会报如下错误(windows XP):
The driver could not be loaded because a previous instance is still loaded。
就是说前一次插上时加载的驱动因为某些原因(我想应该是仍然存在对它的引用),没有被卸载。我应该怎么避免这种错误呢?请高手指点一下。
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-02 06:24
检查一下你的驱动在卸载前有什么资源没有释放 ?
你的认可是对我最大的鼓励!
dos
dos
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2010-02-24
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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;
dos
dos
驱动小牛
驱动小牛
  • 注册日期2001-06-13
  • 最后登录2010-02-24
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-02 12:22
系统在driver执行完Unload例程后还需要做什么动作才会真正卸载driver呢?
yyhabc
驱动小牛
驱动小牛
  • 注册日期2003-01-06
  • 最后登录2013-03-18
  • 粉丝0
  • 关注0
  • 积分327分
  • 威望47点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-05 08:43
老哥,这可能是microsoft的bug,在windows内部,对象有公共的头部,在_DRIVER_OBJECT的前17字节处就是_DRIVER_OBJECT的计数,你可以判断是不是该卸载,如果该卸载,直接将其改为0即可。
游客

返回顶部