flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
阅读:2781回复:11

CompletionRoutine函数

楼主#
更多 发布于:2007-06-06 17:21
hook了tcp设备的IRP_MJ_DEVICE_CONTROL函数,然后在hook函数中设置了CompletionRoutine函数。但是我在应用层利用deviceiocontol去访问驱动,却没有调用CompletionRoutine函数。
用softice进去后发现还是进了我的hook函数。
请教高手这是什么问题啊?
youyuas
驱动牛犊
驱动牛犊
  • 注册日期2004-06-25
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望32点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-06 21:46
CompleteRoutine 是对你自己构造的数据包回调的。你有构造IRP向下发送么?
没有调用CompleteRoutine那就是尚未完成了
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-06 21:56
引用第1楼youyuas于2007-06-06 21:46发表的  :
CompleteRoutine 是对你自己构造的数据包回调的。你有构造IRP向下发送么?
没有调用CompleteRoutine那就是尚未完成了



多谢提醒啊,可能我的错误就是在这,跟踪了一下,我的包确实没传下去。
尝试........
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-06 22:40
细想了一下:
我是hook了tcp设备的IRP_MJ_DEVICE_CONTROL函数的(不是filter driver),所以在hook函数中加了两句
IoSkipCurrentIrpStackLocation( Irp );
IoCallDriver(DeviceObject->NextDevice, Irp );
然后deviceiocontrol的cpu成了96%,退不出来了。
我估计进了一个死循环了,但不知道原因,请高手们赐教啊
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-06-07 13:32
也不管为啥了,找了个netstat的源码,修改一下,就可以调用CompleteRoutine
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-06-07 13:35
用ntdll.lib中导出的ntdeviceiocontrolfile函数就可以了,这个函数与deviceiocontrol函数有什么玄妙的区别啊
youyuas
驱动牛犊
驱动牛犊
  • 注册日期2004-06-25
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望32点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-07 22:27
按你说的做的市hook,而不是filter的话。那么简单的skipcurrentstack 可能会导致问题了。
hook的话,应该不需要skipstack吧,做多也就是拦截irp,做个新的发下去
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-06-07 23:05
因为我hook了IRP_MJ_DEVICE_CONTROL函数,所以最后还得恢复以前的IRP_MJ_DEVICE_CONTROL函数执行,该函数内是否已经将包发到下一层了,我若在hook函数中再将包发下去,会出问题吧?
flying2008
驱动牛犊
驱动牛犊
  • 注册日期2005-12-15
  • 最后登录2010-04-02
  • 粉丝0
  • 关注0
  • 积分695分
  • 威望85点
  • 贡献值0点
  • 好评度67点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-06-07 23:12
现在是用ntdeviceiocontrolfile函数就可以调用CompleteRoutine 了,该函数中的变量仅比deviceiocontrol多处一个PIO_STATUS_BLOCK IoStatusBlock,其它两者都一样,但是deviceiocontrol就不能调用CompleteRoutine
youyuas
驱动牛犊
驱动牛犊
  • 注册日期2004-06-25
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望32点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-06-13 23:14
我觉得要么你就直接构造irp发送下去,在你的hook中完成IRP_MJ_DEVICE_CONTROL的操作。要么就不要动IRP_MJ_DEVICE_CONTROL的任何东西,使用原装的。

按照你的意思,想做完成routine。那么只能自己构造irp向下发送了

关于你的tcp程序,我不太清楚你想要做什么。不过NDIS miniadapter中都有类似完成routine的注册函数。直接取hook他们就可以完成你的功能。或者自己注册一个adapter,然后利用内部链表hook。或者利用windows的DDK已知函数。

想自己构造IRP的情况,我也只在外设设备hook和文件驱动里面用过。对于网络,我感觉很少会用到这种情况吧。
youyuas
驱动牛犊
驱动牛犊
  • 注册日期2004-06-25
  • 最后登录2008-02-01
  • 粉丝0
  • 关注0
  • 积分277分
  • 威望32点
  • 贡献值0点
  • 好评度22点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-06-13 23:27
对于ntdeviceiocontrolfile,我的理解是,不知道对不对, 他的IoStatusBlock适用于驱动中的一些信息做返回的。我记得网上有些TDI的程序会用它取一些MIB_***的。你可以查一下。
为了能填充IoStatusBlock内容,driver应该会自动注册完成routine的,否则的话无法得知结果。

从名字上看deviceiocontrolfile肯定会调用ntdeviceiocontrolfile。所以感觉deviceiocontrolfile应该是ntdeviceiocontrolfile的无完成routine的简化版本
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-06-18 12:11
你把hooking和filtering这2种技术搞混了。

hooking的原理是进入自己的hooking function以后,调用原来的function;而filtering才需要IoCallDriver。

你这样混合的用,在自己里面调用IoCallDriver就已经占用了tcp.sys的stack location,再传到tcp.sys里面,它又占用一层stack location,如果这个IRP的发起者只是分配了本device stack的stack size,你这样用就会凭空多占用一个stack location,造成stack overflow (Bug Check 0x35: NO_MORE_IRP_STACK_LOCATIONS)
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
游客

返回顶部