存档

文章标签 ‘IRP’

IO_REMOVE_LOCK使用方法小结

2012年1月1日 没有评论

IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。

为什么要用IO_REMOVE_LOCK?
WDM 驱动程序在处理设备删除 IRP 并释放驱动程序分配的内存后可能接收到附加的 IRP。在处理附加的 IRP 时试图引用已经释放的内存会导致系统崩溃。驱动程序能够接收已删除设备的 IRP,这有两个原因:
1. 在设备被删除后,另一个组件可以发送 I/O。
2. 在设备删除请求之前发送的 I/O 请求可能在目标驱动程序处理设备删除请求之后到达。[......]

IO_STACK_LOCATION与IRP的一点笔记

2011年12月24日 2 条评论

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料。
1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window)
2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序。
IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有[......]

继续阅读

IRP完成例程的一点疑问

2011年2月26日 没有评论

(对驱动的学习一直是断断续续,最近又重新开始看驱动,对完成例程和IRP以及IO堆栈有了新的认识,具体请看《IO_STACK_LOCATION与IRP的一点笔记》)
通常使用完成例程有三步:

  1. 调用IoCopyCurrentIrpStackLocationToNext()函数,把当前的IRP栈数据复制一份到下一层。
  2. 调用IoSetCompletionRoutine()函数,为IRP设置完成例程。
  3. 调用IoCallDriver()函数,把IRP传递到下一层驱动对象。

完成例程的返回值有STATUS[......]

继续阅读

蓝屏MULTIPLE_IRP_COMPLETE_REQUESTS

2011年2月20日 没有评论

今天写了一会IRP的同步处理,结果就不停的蓝屏。用WinDbg调试尽然还停留在一个ExFreePool行上,其实错误久发生在上一行的IoCompleteRequest。从这个蓝屏代号来看,可以看出来是“有多个IRP完成请求”。可是我找了好久才发现原因,主要是WinDbg的错误提示,弄得我以为链表的哪里弄错了。
最后一行一行代码的看,问题还是找到了。先前的IRP本来是用IoMarkIrpPending进行了挂起操作,但是派遣函数仍然返回了STATUS_SUCCESS,结果在IRP_MJ_CLEAN[......]

继续阅读