windows驱动开发回调函数CompletionRoutine问题

细粉条 2014-06-10 10:56:58
近来在看《Windows驱动程序编程》里面第5章 数据结构 一节 介绍 I/O堆栈单元数据结构 ,其中有一个域是这样介绍的 “CompletionRoutine(PIO_COMPLETION_ROUTINE)是一个I/O完成例程的地址,该地址是由与这个堆栈单元对应的驱动程序的更上一层驱动程序设置的。你绝对不要直接设置这个域,应该调用IoSetCompletionRoutine函数,该函数知道如何参考下一层驱动程序的堆栈单元。设备堆栈的最低一级驱动程序并不需要完成例程,因为它们必须直接完成请求。然而,请求的发起者有时确实需要一个完成例程,但通常没有自己的堆栈单元。这就是为什么每一级驱动程序都使用下一级驱动程序的堆栈单元保存自己完成例程指针的原因。”

自己对 每一级驱动程序都使用下一级驱动程序的堆栈单元保存自己完成例程指针的原因 不是太理解,请高手指导一下。
...全文
345 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Henzox 2014-06-25
  • 打赏
  • 举报
回复
不客气,因为驱动写的多了就对这些熟悉而已。 可以踩一下我的博客,有很多驱动的源码,可编译执行的。 http://blog.csdn.net/henzox
细粉条 2014-06-25
  • 打赏
  • 举报
回复
引用 2 楼 Henzox 的回复:
这个很容易理解吧,因为发起者有可能不是设备栈中某一个设备的驱动,而只有设备栈中的驱动才有对应的 IRP Stack。比如你构造了一个 IRP 发给一个设备栈,此时因为你不是在设备栈中,所以完成例程的标志就不好设置啊。所以你只有设置给在设备栈中的设备驱动才行,往往就是下一级驱动程序的堆栈。 有时间我写个博客简单讲解下这方面的内容,你可以关注下。
恩,明白一些了,多谢。
Henzox 2014-06-25
  • 打赏
  • 举报
回复
这个很容易理解吧,因为发起者有可能不是设备栈中某一个设备的驱动,而只有设备栈中的驱动才有对应的 IRP Stack。比如你构造了一个 IRP 发给一个设备栈,此时因为你不是在设备栈中,所以完成例程的标志就不好设置啊。所以你只有设置给在设备栈中的设备驱动才行,往往就是下一级驱动程序的堆栈。 有时间我写个博客简单讲解下这方面的内容,你可以关注下。
细粉条 2014-06-10
  • 打赏
  • 举报
回复
怎么没人回答

9,506

社区成员

发帖
与我相关
我的任务
社区描述
Windows专区 安全技术/病毒
社区管理员
  • 安全技术/病毒社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧