首页 > 代码库 > 编写NDIS驱动,完全控制网卡收发报文

编写NDIS驱动,完全控制网卡收发报文

在windows上面,利用网卡做自定义报文的收发,Winpcap是唯一选择,目前自己编写驱动来实现相关功能的基本找不到。

 

Winpcap对于接收的报文只是复制,并不阻断报文向操作系统提交,因此还是影响了操作系统,导致操作系统时不时的发出一些报文来,而这些报文又可能会干扰我们的测试过程,为了突破这个限制,我重新实现了相关的驱动,做到了以下几个功能:

 

1  和Winpcap一样出色的报文接收和发送功能。函数接口类似,原来的代码不用大修改。

2  接收后的报文不会转交到操作系统。

3  操作系统发出的报文会被无情的丢弃。

4  应用层所有功能封装成一个DLL,直接控制某个网卡调用相关接口函数即可。

5  应用层收到的数据也能够保存为pcap文件格式,这样便于使用wireshark来分析报文。

6  带接收缓冲功能,防止应用层处理不及时而造成丢包。

 

通过这个驱动,被我们控制的网卡相当于从操作系统中脱离,完全被我们控制,这就成了一个收发包的设备了,可以用于报文测试模拟了,而软件模拟的成本比硬件成本低很多,如果我们实现了一个比较好的软件,那么可以节省很多购买测试设备的钱。华为的Tesgine都是可以被部分替换的。当然,软件开发的成本也不小,需要对各种报文有经验的开发人员,另外,网卡的吞吐率只有1G,和仪器设备无法比,需要多个网卡的配合。但还是有很多这方面的需求的。

 

我们编写自定义驱动,当然不需要重头开始,windows的DDK中已经提供了样例,其中,windowsXP版本,可以看WinDDK\7600.16385.1\src\network\ndis\passthru这个例子,采用NDIS5,如果是Win7的话,需要采用WinDDK\7600.16385.1\src\network\ndis\filter这个例子,这是基于NDIS6的。在没有NDIS开发经验之前,这几个例子都相当的难懂,在有了经验之后,发现这又是情理之中的代码,一步一步按照微软的驱动往下走即可。这两个例子,都提供了报文阻断的实现,但没有提供和应用层交互的代码,也没有实现发送报文的代码,因此,需要在这两个例子上,扩充出OpenFile,ReadFile,WriteFile,DeviceIOControl等相关的功能,并做好数据的缓冲拷贝机制。对于这部分代码,可以参考winpcap的驱动实现过程。

 

由于代码算公司的成果,这里就不贴出来了。