阅读:1845回复:3
应用程序非法退出,中断服务程序继续响应DMA中断并设置事件导致蓝屏,求助!
应用程序非法退出,中断服务程序继续响应DMA中断并设置事件导致蓝屏,求助!
采用事件通知方式写的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的文档,只看到提到异常结构的相关内容,也没提到具体解决办法! 因此向高手求助! 谢谢先!! |
|
沙发#
发布于:2009-12-01 20:19
有高手提到可能用异常截获的方式解决这个问题
哪位高手用过以下的东东 http://www.cppblog.com/aurain/archive/2009/02/16/73913.html 驱动编程中使用结构化异常处理(SEH) 摘自《Windows驱动开发技术详解》 1. 机构化异常处理(try-except块) 2. 结构化异常处理(try-finally块) |
|
板凳#
发布于:2009-12-04 02:48
|
|
地板#
发布于:2009-12-04 10:03
我觉的在驱动内使用用户空间内存,肯定有危险性,何不用异步读写等待当前IRP包的完成?有必要使用这样的事件吗?或者你用一个线程来读写亦可以阿,等读写IRP包返回本身不就是一个事件吗,何必再把一个事件句柄传下去,如果不想同步等待IRP的完成,你可以用管道方式来查询完成状态呀。
|
|