阅读:1930回复:4
帮忙分析FILEMON 拦截代码
我DOWN 了一个FILEMON 源码.
看其中SYS部分, 有些地方不明白,希望高手们能指点指点. 先谢过了. & :-) 1) SYS 是NT 式驱动, 在DRIVERENTRY()中调用IOCREATEDEVICE() 创建设备, 其中设备类型项设置的是自定义的FILE_DEVICE_FILEMON 原型:#define FILE_DEVICE_FILEMON 0x00008300 看DDK文档里描述该设备类型项是This value determines which IRP_MJ_XXX a device or intermediate driver must handle. 如果用自定义的类型会有什么后果? 怎么知道必须处理的IRP_MJ_XXX 有那些? 2) 在FILEMONDISPATCH()中PHOOKEXTENSION->TYPE是控制是否HOOK DRIVER, 在不HOOK 的时候DISPATCH 给FILEMONDEVICEROUTINE(). 可在该函数结束时调用了IRPCOMPLETE, 也就是说IRP 已经完成, 从这里开始返回? 那下层的驱动也就不知道有IRP 了? 那不就 完全拦截了吗? 3) 当PHOOKEXTENSION->TYPE == GUIINTERFACE 时事务由FILEMONDEVICEHOOKROUTINE()处理,很明显函数结束时调用了 IOCALLDRIVER() 来调用下层驱动程序. 但在传递的参数 DEVICE_OBJECT 指针时传递的是自定义类型HOOKEXTENSION ->FILESYSTEM ,这个HOOKEXTENSION 指针数又是由DEVICE_OBJECT ->DEVICEEXTENSION一个(VOID *)传递的. 这个细节是怎么得到的? 疑问多多,学程序最好的方法就是读代码,相信很多朋友也是用同样的 方法来学习的. FILEMON 是好多朋友都读过的, 读懂的朋友给说两 句吧! \"掌声鼓励 ! 哗~~~~~~\" 掌声响起来了,您也该说了吧! :D |
|
|
沙发#
发布于:2002-12-06 20:39
不会吧?
怎么没人回答? |
|
|
板凳#
发布于:2002-12-09 21:47
这问题是太初级还是太偏门?
说两句好不好? 班主呢? |
|
|
地板#
发布于:2004-06-08 10:02
楼主我支持你,我也正在看源代码!
|
|
|
地下室#
发布于:2004-06-08 11:05
1)
SYS 是NT 式驱动, 在DRIVERENTRY()中调用IOCREATEDEVICE() 创建设备, 其中设备类型项设置的是自定义的FILE_DEVICE_FILEMON 原型:#define FILE_DEVICE_FILEMON 0x00008300 看DDK文档里描述该设备类型项是This value determines which IRP_MJ_XXX a device or intermediate driver must handle. 如果用自定义的类型会有什么后果? 怎么知道必须处理的IRP_MJ_XXX 有那些? 无所谓,只要和系统的没重复即可.必须处理的根据DEVICETYPE不同而变,一般需要CREATE,CLOSE DEVICEIOCONTROL...... 2) 在FILEMONDISPATCH()中PHOOKEXTENSION->TYPE是控制是否HOOK DRIVER, 在不HOOK 的时候DISPATCH 给FILEMONDEVICEROUTINE(). 可在该函数结束时调用了IRPCOMPLETE, 也就是说IRP 已经完成, 从这里开始返回? 那下层的驱动也就不知道有IRP 了? 那不就 完全拦截了吗? COMPLETE是在下层设备完成IRP返回的时候被调用的,有点象SEH的UNWIND那样. 3) 当PHOOKEXTENSION->TYPE == GUIINTERFACE 时事务由FILEMONDEVICEHOOKROUTINE()处理,很明显函数结束时调用了 IOCALLDRIVER() 来调用下层驱动程序. 但在传递的参数 DEVICE_OBJECT 指针时传递的是自定义类型HOOKEXTENSION ->FILESYSTEM ,这个HOOKEXTENSION 指针数又是由DEVICE_OBJECT ->DEVICEEXTENSION一个(VOID *)传递的. 这个细节是怎么得到的? 自己跟踪代码看看,嘿嘿...... |
|
|