Windows Miniport驱动在接收过程中出现的黑屏问题
来源:互联网 发布:微信打开淘宝链接 原理 编辑:程序博客网 时间:2024/06/07 11:37
对于NDIS miniport驱动而言,在完成了初始化历程之后,最关键的两个部分就是接收函数和发送函数。在windows环境之下,一般采用硬件中断的方式进行数据的接收。即,硬件在接收到数据之后,发起一个硬件中断,驱动在ISR中确认中断,并在Dpc中完成对数据的接收拷贝。
在驱动的开发过程中,出现了一个非常让人困惑的问题:在接收过程中会出现黑屏现象。一般来讲,黑屏的产生多是对内存的读写出现了问题。在缺少调试手段的情况下,想要确认问题的所在很麻烦,因为,他不像蓝屏,会生成dump文件供我们分析。
经过很久的分析,我才发现,问题出现在NdisMIndicateReceivePacket这个函数上面。通过阅读微软的函数说明文档,我们知道这个函数是用来向上层提交接收到的数据包的。在屏蔽掉这段代码之后,就不会出现黑屏现象。
思考了很久,在我觉得对这个函数的调用没有问题的情况下,我翻阅了ReactOS中对这个函数的实现。我发现了两点问题:
在这个函数的内部,存在一个自旋锁 这个函数会判断packet的状态时success还是resource
所以,很明显,一方面,我们在使用这个函数之前必须要释放掉自旋锁,另一方面必须要在接收拷贝数据包之后,使用NDIS_SET_PACKET_STATUS将packet的状态设为NDIS_STATUS_RESOURCES。按照相关书籍的说法:
若miniport驱动程 序 在 指 明 包 描 述 符 之 前 将 Status 成 员 设 为 NDIS_STATUS_RESOURCES , 则 它 在NdisMIndicateReceivePacket 返 回 之 后 ,应 当 立即 收 回 包描 述符 。
若 微 端 口 驱 动 程 序 在 指 明 包 描 述 符 之 前 将 包 的 Status 成 员 设 为NDIS_STATUS_SUCCESS , 则 微 端 口 驱 动 程 序 在 NDIS 将 包 描 述 符 返 回 给 微 端 口 驱 动 程 序 的MiniportReturnPacket 之前,不能收回包描述符。
在这样改动之后,黑屏现象暂时没有出现过了。
- Windows Miniport驱动在接收过程中出现的黑屏问题
- android启动其他acitivity过程中,出现的短暂黑屏问题
- 在windows xp下使用dbca创建数据库过程中出现的问题及解决方法
- iOS中webview加载pdf文件出现黑屏的问题
- 在安装驱动过程中发生的问题
- float类型在值传递过程中出现的问题
- float类型在值传递过程中出现的问题
- 在学习QT过程中调试slot出现的问题
- c++和java在socket通信过程中发送和接收函数的问题
- 给IIC芯片AT24CXXX编写驱动的过程中出现的一些不稳定的问题总结
- 详解Windows 2000/XP Class/Port/Miniport驱动模型
- 详解Windows 2000/XP Class/Port/Miniport驱动模型
- 详解Windows 2000/XP Class/Port/Miniport驱动模型
- 详解Windows 2000/XP Class/Port/Miniport驱动模型
- 在samba服务中共享的中文名在windows中出现乱码的问题
- 解决Xcode在iOS7上出现部分黑屏与不适配的问题
- Qt在android下启动时,出现短暂黑屏的问题
- JDeveloper经常黑屏的问题(Windows 7)
- [bzoj3545]Peaks [bzoj3551]Peaks加强版
- AMiner背后的技术细节与挑战
- rebmuNelgniS.136
- 数据一致性和事物管理
- SpringMVC处理Date类型的成员变量方法
- Windows Miniport驱动在接收过程中出现的黑屏问题
- mysql脏读、不可重复读、幻读(虚读)
- bzoj3779: 重组病毒
- maven配置问题
- 浅谈Spark应用程序的性能调优
- AFNetworking框架实现原理
- mysql找不到mysql.sock
- 利用javaScript闭包做到函数的私有性和公开性
- golang