hnsyz
驱动牛犊
驱动牛犊
  • 注册日期2001-12-31
  • 最后登录2010-04-20
  • 粉丝1
  • 关注0
  • 积分108分
  • 威望259点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1930回复:4

帮忙分析FILEMON 拦截代码

楼主#
更多 发布于:2002-12-06 10:01
我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
学习,交流
hnsyz
驱动牛犊
驱动牛犊
  • 注册日期2001-12-31
  • 最后登录2010-04-20
  • 粉丝1
  • 关注0
  • 积分108分
  • 威望259点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-06 20:39
不会吧?
怎么没人回答?
学习,交流
hnsyz
驱动牛犊
驱动牛犊
  • 注册日期2001-12-31
  • 最后登录2010-04-20
  • 粉丝1
  • 关注0
  • 积分108分
  • 威望259点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-09 21:47
这问题是太初级还是太偏门?
说两句好不好?
班主呢?
学习,交流
linfeng1216
驱动小牛
驱动小牛
  • 注册日期2004-03-10
  • 最后登录2008-12-31
  • 粉丝0
  • 关注0
  • 积分818分
  • 威望89点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-08 10:02
楼主我支持你,我也正在看源代码!
这件事很难
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于: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 *)传递的. 这个细节是怎么得到的?
自己跟踪代码看看,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部