关于IRP队列的疑问?

whatday whatday 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近学习驱动编程遇到一些问题 还请各位高手帮忙解答一下哈 先谢谢了

问题一:DDK提供KDEVICE_QUEUE存储队列 队列中的每个元素用KDEVICE_QUEUE_ENTRY来表示 但是在KDEVICE_QUEUE中并没有见到有成员KDEVICE_QUEUE_ENTRY 是不是因为 KDEVICE_QUEUE 和 KDEVICE_QUEUE_ENTRY 是通过链表连接的呢?他们的包含关系只是一个逻辑上的链表,不是像一般的数据结构那样包含的吧?

问题二:在应用程序里,两个并行的线程A,B 线程执行函数代码一样 向设备发出2个异步的READ IRP 第一个IRP A进入StartIo例程在里边用KeWaitForSingleObject等待5秒钟,然后IRP B用KeInsertDeviceQueue加入到IRP队列 A进入StartIo例程之前是把中断等级提升为 DISPATCH_LEVEL 了的 但是B还是能够继续执行说明有线程的切换 这里的KeWaitForSingleObject是不是有个一个功能就是 在等待的时候把IRQL等级降低结束等待的时候在还原以前的等级呢?

问题三:在问题二的基础上在应用程序异步READ以后 执行CancelIo函数 取消例程中 将IRP设置为 STATUS_CANCELLED 等到上边的5秒钟等待完毕以后 就是KeRemoveDeviceQueue从IRP队列取出元素 但是运行到这里发生了蓝屏,调用CancelIo的是线程A还是B呢?蓝屏的原因是不是因为 先设置了IRP 在从IRP队列中取出 这样顺序错了造成的呢? 为什么呢?

问题比较多 还请各位高手帮忙解答下 再次谢谢哈
...全文
评论 5
收藏 已收藏
分享
返回顶部
whatday
驱动开发/核心开发 21,620 成员 21,709 内容