(转)关于TDI过滤和通讯的一点儿体会
http://blog.sina.com.cn/s/blog_539dee350100nekw.html
TDI驱动在内核模式下工作,本来想写一个TDI的过滤驱动,主要过滤TDI_SEND和TDI_RECEIVE包,TDI_SEND部分很容易写,通过双机调试,很快就找到了数据位置,不过这一点并不是那么显而易见,我在网上找过的资料就没有一处说明了数据的具体位置,不知道那些人怎么想的,而微软的ddk资料上对irp是不完全文档说明,省略了很多关键部位的说明。TDI_RECEIVE颇费手脚,我在TDI_RECEIVE处下断,一直都等不到返回的数据,折腾了两天,查了很多资料,后来才恍然大悟,我下断的地方只是TDI_RECEIVE类型的IRP包发出的地方,而所有的网络IO本质上都是异步的,必须等到这个IRP包的状态为SUCCESS的时候才会有数据,同时发现TDI过滤不是特别稳定,或者是WINDBG调试器下断的问题,经常有断不到的情况,尤其是返回数据比较小的时候,经过一番折腾以后,对windows的驱动工作原理理解又深了一层。另外一个关于TDI应用的体会来自TDI通讯,TDIFW,一个来自sourceforge的开源项目,对TDI过滤做了很好的演示,其中也涉及了一部分TDI通讯的内容,另外有的参考资料来自《rootkits:windows内核的安全防护》,里面讲述了利用TDI发送数据部分,但是同样没有提及利用TDI接收数据,在国外的网站上找了半天,发现有人居然专门出售TDI过滤和TDI通讯的代码,基本上没有其它源代码可以参考,太郁闷了,最后在一个国外论坛找到一份演示的代码,也是通过这份代码我才明白了TDI通讯的全部机理。把这个过程写下来,代码就不贴出来了,有同样困惑的朋友或许可以得到一些启迪。