fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
阅读:1828回复:2

usb摄像头驱动不能卸载

楼主#
更多 发布于:2007-10-09 17:06
按照usbintel编写了摄像头驱动,正常使用是可以卸载的,但是在读取图像的时候,突然拔掉摄像头,上层应用程序不能退出线程,怀疑会有irp或srb在pending状态。在usb拔掉后,捕获到SRB_SURPRISE_REMOVAL,ddk文档说
usbcamd对SRB_SURPRISE_REMOVAL 的处理如下
USBCAMD: Cancel pending data SRBs and return the SRBs with STATUS_CANCELLED.
USBCAMD: Call CamStopCaptureEx/CamFreeBandwidthEx on all opened streams
USBCAMD: Return STATUS_CANCELLED on any read/write SRBs that come down after SRB_SURPRISE_REMOVAL.
但不知道为什么没有cancel成功呢?
下面是我的log

'INTELCAM:
'rawFrameBuffer:  84a80000
'INTELCAM:
'RawFrameLength:  8000
'INTELCAM:
'JpegStart:  84a80000
'INTELCAM:
'JpegLength:  2969
'INTELCAM:
'INTELCAM_ReceiveDataPacket
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'SRB_SURPRISE_REMOVAL!!
'INTELCAM:
'INTELCAM_StopVideoCaptureEx
'INTELCAM:
'INTELCAM_StopVideoCapture
'INTELCAM:
'INTELCAM_FreeBandwidthEx
'INTELCAM:
'INTELCAM_FreeBandwidth

这时候线程就死在这里了,强制退出程序后,有如下log

'INTELCAM:
'INTELCAM_ProcessRawVideoFrameEx
'INTELCAM:
'INTELCAM_ProcessRawVideoFrame
'INTELCAM:
'FrameLength:0  RawFrameLength:0
'INTELCAM:
'================================!
'INTELCAM:
'INTELCAM_ProcessRawVideoFrameEx
'INTELCAM:
'INTELCAM_ProcessRawVideoFrame
'INTELCAM:
'FrameLength:0  RawFrameLength:0
'INTELCAM:
'================================!
'INTELCAM:
'INTELCAM_ProcessRawVideoFrameEx
'INTELCAM:
'INTELCAM_ProcessRawVideoFrame
'INTELCAM:
'FrameLength:0  RawFrameLength:0
'INTELCAM:
'================================!
'INTELCAM:
'INTELCAM_ProcessRawVideoFrameEx
'INTELCAM:
'INTELCAM_ProcessRawVideoFrame
'INTELCAM:
'FrameLength:0  RawFrameLength:0
'INTELCAM:
'================================!
'INTELCAM:
'INTELCAM_ProcessRawVideoFrameEx
'INTELCAM:
'INTELCAM_ProcessRawVideoFrame
'INTELCAM:
'FrameLength:0  RawFrameLength:0
'INTELCAM:
'================================!
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
INTELCAM_UnInitialize
'INTELCAM:
UnInitialize
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'Driver Entry
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'INTELCAM_HwInitialize
'INTELCAM:
'INTELCAM_ConfigureEx
'INTELCAM:
'INTELCAM_Configure
'INTELCAM:
''Configure 0x0
'INTELCAM:
'PipeConfigListSize:2
'INTELCAM:
INTELCAM_Initialize
'INTELCAM:
InitializeHardware 0x0
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
GetStreamFormatsArray
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
INTELCAM_CompleteInitialization
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'AdapterReceivePacket
'INTELCAM:
'AdapterReceivePacket

线程被退出,驱动被卸载
张帆的内核学习论坛 http://bbs.kerneldev.com
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
沙发#
发布于:2007-10-10 10:57
用户被禁言,该主题自动屏蔽!
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-10 11:13
多谢gutian98兄指点
我也知道是没有cancel掉,我是这样做的,但还不成
在INTELCAM_CompleteInitialization中会得到一个USBCAMD_INTERFACE,并把它保存在DeviceContext->pDeviceObject中。
截获SRB_SURPRISE_REMOVAL(也就是拔掉usb设备的消息),并进行deviceContext->UsbcamdInterface.USBCAMD_CancelBulkReadWrite(deviceContext,0);
也就是对我的第0个管道进行cancel读取。不知道这样的思路对不对。
现在是有十次插拔,能有一两次能正确卸载,大多数还是不能卸载。
我想大概是每次读取的srb,usbcamd会对他们进行排队,不知道有什么方法可以将这些排队的srb,逐个cancel掉。
张帆的内核学习论坛 http://bbs.kerneldev.com
游客

返回顶部