阅读:2781回复:11
CompletionRoutine函数
hook了tcp设备的IRP_MJ_DEVICE_CONTROL函数,然后在hook函数中设置了CompletionRoutine函数。但是我在应用层利用deviceiocontol去访问驱动,却没有调用CompletionRoutine函数。
用softice进去后发现还是进了我的hook函数。 请教高手这是什么问题啊? |
|
沙发#
发布于:2007-06-06 21:46
CompleteRoutine 是对你自己构造的数据包回调的。你有构造IRP向下发送么?
没有调用CompleteRoutine那就是尚未完成了 |
|
板凳#
发布于:2007-06-06 21:56
引用第1楼youyuas于2007-06-06 21:46发表的 : 多谢提醒啊,可能我的错误就是在这,跟踪了一下,我的包确实没传下去。 尝试........ |
|
地板#
发布于:2007-06-06 22:40
细想了一下:
我是hook了tcp设备的IRP_MJ_DEVICE_CONTROL函数的(不是filter driver),所以在hook函数中加了两句 IoSkipCurrentIrpStackLocation( Irp ); IoCallDriver(DeviceObject->NextDevice, Irp ); 然后deviceiocontrol的cpu成了96%,退不出来了。 我估计进了一个死循环了,但不知道原因,请高手们赐教啊 |
|
地下室#
发布于:2007-06-07 13:32
也不管为啥了,找了个netstat的源码,修改一下,就可以调用CompleteRoutine
|
|
5楼#
发布于:2007-06-07 13:35
用ntdll.lib中导出的ntdeviceiocontrolfile函数就可以了,这个函数与deviceiocontrol函数有什么玄妙的区别啊
|
|
6楼#
发布于:2007-06-07 22:27
按你说的做的市hook,而不是filter的话。那么简单的skipcurrentstack 可能会导致问题了。
hook的话,应该不需要skipstack吧,做多也就是拦截irp,做个新的发下去 |
|
7楼#
发布于:2007-06-07 23:05
因为我hook了IRP_MJ_DEVICE_CONTROL函数,所以最后还得恢复以前的IRP_MJ_DEVICE_CONTROL函数执行,该函数内是否已经将包发到下一层了,我若在hook函数中再将包发下去,会出问题吧?
|
|
8楼#
发布于:2007-06-07 23:12
现在是用ntdeviceiocontrolfile函数就可以调用CompleteRoutine 了,该函数中的变量仅比deviceiocontrol多处一个PIO_STATUS_BLOCK IoStatusBlock,其它两者都一样,但是deviceiocontrol就不能调用CompleteRoutine
|
|
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和文件驱动里面用过。对于网络,我感觉很少会用到这种情况吧。 |
|
10楼#
发布于:2007-06-13 23:27
对于ntdeviceiocontrolfile,我的理解是,不知道对不对, 他的IoStatusBlock适用于驱动中的一些信息做返回的。我记得网上有些TDI的程序会用它取一些MIB_***的。你可以查一下。
为了能填充IoStatusBlock内容,driver应该会自动注册完成routine的,否则的话无法得知结果。 从名字上看deviceiocontrolfile肯定会调用ntdeviceiocontrolfile。所以感觉deviceiocontrolfile应该是ntdeviceiocontrolfile的无完成routine的简化版本 |
|
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) |
|
|