关于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中关于内存分配的经典描述: “谁分配,谁释放”
这是安全的,代码清晰的,同时也带来了许多的回调过程, 又让代码变得看起来混乱起来,理解核心异步处理的方法本质是回调
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
  对于在“蓝网之家”影响下蠢蠢而动搞 Windows 95 远程启动的朋友可能不少,那么大家一定对 NDIS 这几个字母不会感到陌生。其实不只是在远程启动这一层,只要是网卡的驱动盘,大家都会在里面发现有类似 NDIS、NDIS2、NDIS3、NDIS4一样的目录,只是大家在 Windows 9x 或 NT 中安装、设置网卡时没有注意到它罢了。但即使大搞特搞 RPL 的朋友对其大概也是只知其然而不其所以然。    NDIS 是什么?有什么作用?       NDIS 的全称是 Network Device Interface Specification,中文意思就是网络设备接口规范。    根据 OSI 七层模型,物理层定义了对网卡、线缆以及其它物理硬件设备进行配置的标准。节点间建立通信时是由物理层在传输介质上传送二进制信息实现的,因此,在发送端和接收端都还必须有一个程序来格式化这种信息流并将其传送给上一层。NDIS 的作用就是避免在访问网卡每次进行传输时都编写相应的代码。由此说来,NDIS 本质上是一种软件接口,有了 NDIS ,所有的传输就可以采用一种通用的方式来访问由不同厂商制造的网卡了,即它是用来连接协议堆栈和网卡的。   与此相关的软件还有重定向器(Redirector)和服务器(Server)。前者的目的是截获来自 OSI 会话层的网络调用,并通过将其传送到相应的协议驱动程序接口而格式化成 NDIS 能够识别和使用的命令。后者则负责接收从重向器传过来的来自于远程计算机的请求,再将这一请求传送给相应的本地文件系统驱动程序,最后再由该“服务器”将数据沿协议堆栈向下传递给客户机。    TCP协议也是通过调用 NDIS 接口服务来完成传输操作的。
1 NDIS中间层驱动程序 2 1.1 NDIS中间层驱动程序(NDIS Intermediate Drivers)概述 2 1.2 NDIS中间层驱动程序的用途 4 1.3 NDIS中间层驱动程序的开发环境 4 2 NDIS中间层驱动程序的开发 4 2.1 可分页和可丢弃代码 4 2.2 共享资源的访问同步 5 2.3 中间层驱动程序的DriverEntry函数 5 2.3.1 注册NDIS中间层驱动程序 6 2.3.1.1 注册中间层驱动程序的Miniport 6 2.3.1.2 注册中间层驱动程序的协议 8 2.4 中间层驱动程序的动态绑定 11 2.4.1 打开中间层驱动程序下层的适配器 12 2.4.2 微端口(Miniport)初始化 12 2.4.3 中间层驱动程序查询和设置操作 13 2.4.3.1 发布设置和查询请求 14 2.4.3.2 响应设置和查询请求 15 2.4.4 作为面向连接客户程序注册中间层驱动程序 15 2.5 中间层驱动程序数据包管理 17 2.5.1.1 重用数据包 18 2.6 中间层驱动程序的限制 19 2.7 中间层驱动程序接收数据 19 2.7.1 下边界面向无连接的中间层驱动程序接收数据 19 2.7.1.1 在中间层驱动程序中实现ProtocolReceivePacket处理程序 20 2.7.1.2 在中间层驱动程序中实现ProtocolReceive处理程序 21 2.7.1.3 下边界面向无连接中间层驱动程序接收OOB数据信息 22 2.7.2 下边界面向连接的中间层驱动程序接收数据 22 2.7.2.1 在中间层驱动程序中实现ProtocolCoReceivePacket处理程序 23 2.7.2.2 在下边界面向连接的中间层驱动程序中接收OOB数据信息 23 2.7.3 向高层驱动程序指示接收数据包 23 2.8 通过中间层驱动程序传输数据包 23 2.8.1 传递介质相关信息 25 2.9 处理中间层驱动程序的PnP事件和PM事件 26 2.9.1 处理OID_PNP_XXX查询和设置 26 2.9.2 中间层驱动程序ProtocolPnPEvent处理程序的实现 27 2.9.3 处理规定的电源请求 28 2.9.3.1 睡眠状态的电源设置请求 28 2.9.3.2 工作状态的电源设置请求 29 2.10 中间层驱动程序复位操作 29 2.11 中间层驱动程序拆除绑定操作 30 2.12 中间层驱动程序状态指示 31 3 负载平衡和失效替换 31 3.1 关于LBFO 31 3.2 指定对LBFO的支持 32 3.3 在微端口驱动程序上实现LBFO 32 3.3.1 初始化微端口束 33 3.3.2 平衡微端口驱动程序的工作量 33 3.3.3 在主微端口失效后提升一个次微端口 34 4 安装网络组件 34 4.1 用于安装网络组件的组件和文件 34 4.2 创建网络INF文件 35 4.2.1 网络INFS文件名的约定 35 4.2.2 网络INF文件的版本节 35 4.2.3 网络INF文件的模型节 36 4.2.4 INF文件的DDInstall节 37 4.2.5 删除节 38 4.2.6 ControlFlags节 39 4.2.7 网络INF文件的add-registry-sections 39

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值