关于Ndis驱动的一点个人理解

对写过驱动的一些总结:
1,TDI层驱动,该层驱动位于windows kernel网络驱动的最顶层,个人觉得主要是针对连接时的redirect,filter比较好使,比如限制本地一些端口不能往外连接,限制外部的IP和PORT往里连接,只能连接到哪些外部IP,PORT等等。还有一个主要功能就是redirect,改变实际期望连接到的目的地址和端口,redirect到另一个IP和端口上,用这种方式好像很容易监控到别人,:-) .  但是如果想改变用户发送的数据包,实现起来很是不容易,推荐使用IM驱动。使用该驱动的缺点是相关文档太少,网络上也很难找到,并且在net stop时候很容易blue,最好的办法不要半途net stop,等待系统关闭之时自动stop.
2,NDIS协议层驱动,操作系统的TCP/IP栈是一个协议层的驱动,开源的比较有名的Winpcap也是一个协议层的驱动。在这一层能收到网卡上所有的包,在根据自己的需要处理,每个协议层的驱动都能收到网卡上来的包,同层驱动之间互相不干扰,所以做不到干扰过滤数据包功能,一般用来监听网络数据包。想很多比较有名的网络协议分析软件如ethereal等,底层使用的都是Winpcap驱动
 
3,IM驱动,即中间层驱动,位于Protocol之下,miniport之上。在这一层对数据进行修改和过滤都是比较容易实现,当数据到达这一层的时候已经加上了以太头,所以从一层到七层进行哪一层的过滤都好判断,伪造假MAC,IP等等都容易实现。关于IM中间层的开发网上的资料也比较容易找到,例子也很多,DDK中自带的passthru就是一个很好的中间层例子。
 
4,虚拟网卡,处于miniport层,但是和miniport驱动又有点区别,引用驱动开发网中一位大牛的话:
“真正的虚拟网卡与IMD中Miniport驱动的区别。在IMD中,当Protocol绑定到真正的网卡后会初始化一张虚拟的网卡让TCP/IP协议来绑定,可是我们都知道这个虚拟的网卡并不能在设备管理器中显示出来,我们并不能为它设置IP等等信息,而使用NdisIMRegisterLayeredMiniport这个东西就可以虚拟一张真正的网卡!为什么呢?因为在IMD中并没有建立什么真正的网卡设备,而只是为已经存在的网卡设备建立了一个设备实例,然后将这个实例Attach到真正的网卡设备实例上,这就是典型的Windows下的分层驱动模型。那么我们就应该想到为什么微软要这么做呢,为什么不象TDI或者是其它分层驱动那么直接Attach Device还有搞个Protocol这个东西。我想原因有二,一是为了不破坏NDIS架构的完整性,因为NDIS最基本的架构就是协议和小端口;二是为了保持网络驱动的特性。现在我们来看看网络驱动的特性,网卡设备不是简单的Device Object,因为Device Object是对设备的通用抽象,它无法表示网卡驱动特性。对一个网卡来说最重要的就是Interface概念,在应用程序中,通常不会去指定本地IP地址,比如你用JAVA或者.NET去连接某个主机,这个动作最终转化成Socket动作,Socket根据协议族类型来挑选WSH DLL,然后由WSH DLL负责和协议驱动进行交互,实际上解析Socket的动作是在WSH DLL中进行的。但是在多网卡、多IP的环境中,应用程序无法去选择使用哪个IP作为本地IP,因为它不知道任何的路由信息,所以它只能向协议驱动传送一个通配符地址,然后由协议驱动来选择本地IP和网卡。我想大家都知道了网卡驱动的特性了,那就是路由中关于Interface的问题。如果微软同意我们随意在网卡设备上的Attach Object,同时保持路由,那么整个路由部分将是十分的混乱,所以要开发可以配置IP等网络信息的虚拟网卡需要微软做特殊的处理。我以为这就是微软的工程师们为什么在IMD中并不实现真正的虚拟网卡的原因;主要是路由信息的混乱,IMD中Miniport本身只是一个网卡设备的实例,我们为它添加路由信息是不符合逻辑和无法想象。我们不得不承认微软的工程师在软件结构的设计上确实很厉害,在我看来Linux就要差许多了,至少我没有在Linux中看到任何这样的东西。”
 
虚拟网卡的实现:驱动将收到的数据保存到队列中,应用程序通过readfile,writefile与驱动交互数据,有一点要注意,需要在应用程序中处理ARP请求。
DDK中的mux就是一个miniport层驱动,据说是一个虚拟网卡,安装完成以后,会在硬件设备表中加一块网卡设置,这个没有试过。
 
最后套用网上很多朋友评价NDIS驱动的一段话来总结此文:
NDIS很象斜派武功。厉害,实用。易走火入魔(挂),不好练。
 
DDK中关于内存分配的经典描述: “谁分配,谁释放”
这是安全的,代码清晰的,同时也带来了许多的回调过程, 又让代码变得看起来混乱起来,理解核心异步处理的方法本质是回调
 

你可能感兴趣的:(关于Ndis驱动的一点个人理解)