首页
社区
课程
招聘
[求助]设置自己的irp完成例程
发表于: 2008-11-6 10:53 8516

[求助]设置自己的irp完成例程

2008-11-6 10:53
8516
有个问题困扰很久,只好来求助各位大侠。
现在我截取到了win的tdi通信层tcpdispatch函数入口,并且截取了tdi_create这个irp,我想对这个irp设定一个自己的completeroution这个完成例程,在设定完这个例程之后,并不是使用iocalldriver来调用下一层驱动,而是直接把这个irp传提到tcpdispatch函数入口,问题就出在这里。传递之后,整个通信过程可以顺利完成,但是自己的completeroution这个完成例程并没有被调用。
设定自己的completeroution这个完成例程的方法尝试过两种,一种是用IoSetCompletionRoutine,但是这个函数是设定下一层驱动的irp完成例程,貌似不能在我这种情况下使用。第二种是直接设定irp栈的CompletionRoutine和context这两个参数,然后下发,但是通信完成之后也没有能够调用。
跟踪了tcpdispatch里面的create函数,发现里面已经用iocompleterequest来设定该irp已完成,并且status和information也已经填充。
同时研究了tdifw1.4.4的源码,发现里面如果采用hook的话,也用了IoSetCompletionRoutine,但是驱动不能加载。。。
现在很无奈了,不知道问题出在哪里了,不知道那位兄弟也遇到过这种情况,望不吝赐教,万分感谢。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 199
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没有人遇到过同样的情况么?
2008-11-6 22:57
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
ROOTKIT有一个很好的完整的例子,IoSetCompletionRoutine可以用的,是设置本层的完成例程,只是它把CompletionRoutine和context这两个参数设在了下一层irp栈,这个你搞错了。同理当前本层的CompletionRoutine和context这两个参数,要先保存(因为有可能还有上层),所以,在干完事情后,(完成例程中)可以直接调用原来保存的CompletionRoutine(这样才能返回上层完成例程)
2008-11-6 23:16
0
雪    币: 214
活跃值: (46)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
IoSetCompletionRoutine 是个宏,和直接设置没有区别
2008-11-7 13:59
0
雪    币: 199
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我的情况可能还有点不同,因为我的irp已经到达驱动的最底层,tcpcreate已经不会再调用下层驱动了,所以对这个irp用IoSetCompletionRoutine貌似已经没有作用了,察看了IoSetCompletionRoutine这个函数的一些资料,发现除了设置了routine和context这两个参数之外,还设置了control,我再试一下,但是如果直接设置本曾irps的参数的话,其实是设定了上层的完成例程,不知道能不能完成我的要求,还要考虑其原有的完成函数,麻烦啊。

十分感谢上面的两位兄弟!!
2008-11-13 09:47
0
雪    币: 199
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
果然是因为没有设置control这个参数来指定什么时候调用完成例程~~
2008-11-13 10:00
0
雪    币: 222
活跃值: (44)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
http://hi.baidu.com/shineastdh/blog/item/d429c70eff9bc5e036d122f2.html
2009-1-6 01:29
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我遇到一个问题,是关于键盘过滤驱动的。它会自己创建一个设备,Attach到键盘驱动上,在IRP_MJ_READ里面对Irp设置完成例程,以得到按键信息。
但是这里有一个问题,这个驱动加载的时候,已经有一个Irp处于等待中了,由于这个Irp未设置完成例程,也就是说刚刚加载的第一次按键信息无法得到。
我试着给被Attach的设备的CurrentIrp直接设置完成例程,也就是LZ的那种直接赋值的方法,结果在按键后,完成例程确实被调用了,也得到了按键信息,但是之后的任何按键都没有用了!?
调试输出发现,原先会被调用IRP_MJ_READ回调,也没有被调用到,就好像是读取下一个键值的Irp根本没有生成似的。因为没有了下一个Irp,所以自然没人去读去键值,按键就没有用了?
初学驱动,不知道我理解的有没有问题,以及有没有方法解决呢?
2009-3-21 14:17
0
游客
登录 | 注册 方可回帖
返回
//