关于IRP队列的疑问?
最近学习驱动编程遇到一些问题 还请各位高手帮忙解答一下哈 先谢谢了
问题一: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队列中取出 这样顺序错了造成的呢? 为什么呢?
问题比较多 还请各位高手帮忙解答下 再次谢谢哈