nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1991回复:1

应用程序非法退出,中断服务程序继续响应DMA中断并设置事件导致蓝屏,求助!

楼主#
更多 发布于:2009-12-01 09:03
采用事件通知方式写的PCI驱动!

首先在应用程序中设置了事件句柄hEvent,并通过DeviceIOControl将此句柄送入驱动程序中
然后开发发起DMA传输,DMA发出多次完成中断后,驱动内部缓冲区被存满,DPCforISR程序设置驱动程序中设置的内核事件为有信号状态,通过设置该事件,通知应用程序前来取数据。同时驱动程序自动发起下一次DMA操作......

正常情况下一切均正常工作
现在遇到的问题是
驱动程序一旦非法退出,或者是在没有停止DMA状态的情况下,退出应用程序,导致计算机会黑屏重启!
经过判断,初步怀疑就是在DPCforISR程序设置内核事件为有信号状态出的问题
由于程序是在driversworks中开发的,因此在设置该内核事件之前还是做了一些判断当前事件句柄状态的工作
例如当前内核事件句柄状态为m_pEvent;

BOOLEAN  State_pEvent = m_pEvent->IsValid();//该函数是DriversWorks提供的检查内核事件是否被有效初始化的函数,如果被初始化,即返回TRUE,否则FALSE。
if(m_pEvent)
   if(State_pEvent ==TRUE)
     m_pEvent->Set();
  .....

即便做了如此些工作,一旦上层应用程序在未关闭DMA前关闭或者应用程序非法退出(无法关闭DMA的前提下退出),仍然会黑屏重启

看过相关DDK的文档,只看到提到异常结构的相关内容,也没提到具体解决办法!
因此向高手求助!
谢谢先!!

  
nj6961
驱动牛犊
驱动牛犊
  • 注册日期2004-11-17
  • 最后登录2017-01-11
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2009-12-01 09:15
有高手提到可能用异常截获的方式解决这个问题

哪位高手用过以下的东东

http://www.cppblog.com/aurain/archive/2009/02/16/73913.html

驱动编程中使用结构化异常处理(SEH)
摘自《Windows驱动开发技术详解》
1. 机构化异常处理(try-except块)
2. 结构化异常处理(try-finally块)
游客

返回顶部