阅读:1818回复:6
关于IoCallDriver的一点疑问
最近在学习一个还原驱动,该还原驱动是在磁盘设备上挂载过滤对象,其间发现一个疑问,IoCallDriver到底是直接把IRP包发送给对应的目标设备对象,还是会先发给目标设备的栈顶设备,如果是发给目标设备的栈顶设备的话,那么在过滤对象里又调用IoCallDriver往下转发的时候不是又会调用到自己了吗,如果是直接发给目标设备的话,那么绕过过滤对象穿透还原不就轻而易举了吗,又何必像机器狗(针对还原的病毒)那样往下发SRB或者其他繁琐的动作来实现穿透呢?
还请驱网高手不吝赐教。 |
|
沙发#
发布于:2008-10-11 09:43
设备栈。
一般设备栈以外的驱动发送的直接调用设备栈顶层的。 设备栈内部发送的如果是发向底层的那么沿着这个设备栈从本设备往下直接发送。 |
|
板凳#
发布于:2008-10-11 14:07
楼上说的是。。
CallDriver实际是就是将请求发送给你的下一层的设备对象。不一定就是卷设备对象。 |
|
地板#
发布于:2008-10-13 11:08
谢谢回复,但还是有点不明,譬如设备A,挂载了名为A1的上层过滤对象
设备B直接获得设备A的对象句柄,利用IoCallDriver,直接往设备A发的话,是不是就不会经过设备A1了?这跟是否在同一个驱动里会有关吗? |
|
地下室#
发布于:2008-10-21 08:37
这个问题必须看WINDOWS的源代码才可以回答。
一般对一个设备操作都存在一个HANDLE, 在内核中OS会先用ObReferenceObjectByHandle获得Ojbect指针。 然后使用IoGetRelatedDeviceObject来获得该Object关联的设备对象, 构造IRP发送给该关联的设备对象。 这里面核心的地方就是IoGetRelatedDeviceObject, 该函数会试图获取设备栈最顶层的DeviceObject, 如果设备栈的上面是文件系统,它会获得文件系统最顶层的设备对象。 详细的流程可以参考IoGetRelatedDeviceObject。 在一个IRP的处理过程中,如果发送IRP给最顶层的DeviceObject, 的确可以能会引起递归调用的问题。 解决这个问题的方法有两个: 方法一:直接构造IRP,调用IoCallDriver的时候,自己指定DeviceObject,而不是通过IoGetRelatedDeviceObject获得。 方法二:使用阴影卷技术,这个在文件过滤驱动中是很常用的一个技术。这个技术只对解决IRP_MJ_CREATE的递归调用有效。 |
|
|
5楼#
发布于:2008-10-28 12:41
学习一下
|
|
6楼#
发布于:2008-11-04 15:54
受教了,谢谢大家
|
|