WDM和MDF下IRP的处理流程是不相同的,其中MDF又有UMDF何KMDF之分,我们先来看看UMDF中IRP的详细处理,如下图所示:
1:I/O管理器将IRP传递给位于内核模式设备堆栈中的顶层驱动对象(Up Device Object)。
2:位于内核的反射器将该IRP打包发送给UMDF Host进程。
3:IRP包传送给负责处理它的驱动后,framework创建一个WDF请求对象并把它插入进相应的队列,亦或者调用相应的回调函数来处理该IRP。
4:当UMDF驱动处理完IRP请求后,framework调用转发器(dispatcher), 转发器将发起一个Windows I/O请求给底层驱动对象(Down Device Object)。
注意:此时的IRP已经不是最开始发起的IRP
5:底层驱动对象收到新IRP之后将其发送到更下一层的内核模式驱动(Kernel-mode Drivers),内核模式下的驱动将其发送至相应的驱动处理。
6:当IRP完成时,转发器将会收到完成信息,并告诉framework, framework将WDF请求设置成完成状态。
7:framework调用I/O completion回调函数。
8:当最后UMDF的I/O completion回调函数返回后,framework会将完成标识符和数据传递给反射器。
9:反射器将原始的IRP设置成完成,并告之I/O管理器,最后由I/O管理器来通知上层程序本次IRP操作已经完成。