阅读:2341回复:3
关于用TDI实现接收本机HTTP包过程中的若干问题
之前打算用NDIS写 非常感谢cyliu版主提醒我说TDI能更容易实现我想要的功能
所以最近改看了下TDI 的确步骤比NDIS简单许多 首先我说下我的思路 创建绑定设备到TCP,然后在DISPATCH中接收处理次功能TDI_receive的IRP 根据楚狂人那篇文章的说法 那么我想要的HTTP数据包应该在IRP->MdlAddress中 然后我将内容打印出来. 但是遇到问题如下 1. 我测试发现只有当我第一次打开HTTP网页或者刷新的时候才会接受到次功能为TDI_receive的IRP, 按理说每当我点击别的超连接的时候应该会捕获到TDI_receive的IRP才对啊, 因为每次网页变化的时候都会有HTTP包发来我主机上的吧.但事实不是这样的 我刚才翻了翻以前的帖子,有个这样的解释 好像大部分数据都通过FastDeviceIoControl,没有通过 Dispatch这条路。 我有点看不明白什么意思 2.在DDK文档中有说可以通过设置事件的回调函数去捕获数据包,那么如果我接收到这个数据包后想阻止它向上层发送怎么办?返回错误状态就可以了吗? 我想弄清楚回调函数的调用和发送数据包的先后顺序是怎样的 是不是先调用我们的回调函数检测我们状态来决定是否向上层发送封包的 3问题1中我在想是不是接收HTTP包的方式不仅只是一种?什么情况下才会发送TDI_receive的IRP,如果是其它方式的话我应该去处理哪些类型的IRP 4在DDK的说明中提到捕获数据的几种回调函数,这几个回调函数到底有什么区别, 难道主机接收HTTP数据包的时候是通过那个什么SET_EVENT的IRP来通知调用回调函数接收数据的?可以绕过不用TDI_RECEIVE这个IRP吗? 以上几个问题都很疑惑我,但我最终想知道的是如果我想捕获所有的HTTP数据包的话我应该怎么做,希望你们能给我详细点的答复 |
|
沙发#
发布于:2008-08-04 10:45
先打击一下你的积极性,在tdi上和ndis上做拦截http包,其实难度都差不多,我个人感觉在ndis上或许可以省掉更多的麻烦,首先在网络上接收数据的时候不会去理会那个FastIO的,这方面的东西你就不要考虑了,接着接收tsdu主要靠注册的ClientEventReceive, ClientEventChainedReceive等异步通知来完成,其实tdi本身是异步的(你可以参看一下afd.sys的实现),所以,你要想在tdi上拦截http的包,就必须去接管这些事件,否则光靠接管TDI_RECEVIE是远远不够的,最后,在tdi上接管http包,如果想要在安装完驱动后立刻获得当前环境的所有数据包,是比较麻烦的,因为之前已经启动过的访问网络的进程,早已经注册过了Event,你已经很难在去接管他们了。
多多分析,其实这个很简单 :) |
|
板凳#
发布于:2008-08-04 14:12
非常感谢你的回答~!
你说的大概思路就是不是 1.我安装的驱动在系统启动的时候将所有的事件接管过来并且注册回调函数ClientEventReceive, ClientEventChainedReceive 2.那么每次这些进程在网络上有收到数据的时候都会调用上面我注册的2个函数,我可以在这些函数中得到数据包内容对么? 3.我看过个TDIFilter的代码 注册ClientEventReceive, ClientEventChainedReceive函数的话似乎是用IoSetCompletionRoutine这个函数设置的,不知道我理解的对不对,如果不是 那么通过什么方法来注册?我看了DDK说明,上面就给了这2个函数声明和解释,但是似乎没说怎么注册. 4我想问下在如果我在NDIS中实现的话,是不是只要在PTRECEIVE中进行我的包提取和处理就可以了 |
|
地板#
发布于:2008-08-04 14:47
看了shadow3 给我的意见,我实验了下 我将IIS重启发现捕获到了下面4个事件
00001455 326.86788940 TDI_EVENT_CONNECT 00001460 326.92834473 TDI_EVENT_DISCONNECT 00001465 326.99093628 TDI_EVENT_RECEIVE 00001470 327.05383301 TDI_EVENT_RECEIVE_EXPEDITED 如果我想捕获IIS接收到的数据包那么我只要对这4个事件设置回调函数就可以了是么? 我的预想是当别人连接我们的IIS和关闭连接的时候会通知 00001455 326.86788940 TDI_EVENT_CONNECT 00001460 326.92834473 TDI_EVENT_DISCONNECT 这2个事件的回调函数 如果有数据过来的话那么就会调用 00001465 326.99093628 TDI_EVENT_RECEIVE 00001470 327.05383301 TDI_EVENT_RECEIVE_EXPEDITED 这两个事件中设置的函数. 不知道我理解的对不对,有问题尽管指出 非常感谢 ~ |
|