一、用户模式和内核模式

        由于安全因素等考虑,CPU由内而外的划分成四层,Ring0、Ring1、Ring2、Ring3,Ring0层的特权最高,可以执行任意的代码,Ring3层的特权最低,只能执行有限的代码。Windows的设计正是利用了CPU的这种特性,将本身分为内核模式和用户模式。用户模式工作在Ring3层,内核模式工作在Ring0层。运行在用户模式下的应用程序的访问权限受到操作系统的限制,比如不能直接访问硬件,不能直接访问其他进程的地址空间。而运行在内核模式下的程序,对操作系统和硬件设备有着直接的访问和操作的权力。Windows的核心代码和驱动程序运行在内核模式下。

        更详细的内容可以参考《Windows内核原理与实现》、《Windows内核情景分析》等书籍。

二、Windows下网络程序设计实现技术的选择

        在用户模式下,Windows提供了windows socket、SPI等手段。如果进行网络程序设计的功能需求是开发一个Client或者简单的P2P软件,socket或许就能够满足开发的技术需求。如果软件内部想实现兼有包过滤的功能,则可以利用SPI实现。

        此外,有很多第三方机构提供了一些开发网络程序的开发库,比较著名的有ACE、libnet、WinPcap等。ACE是一个大型的网络程序开发框架,功能强大,且支持跨平台。libnet是拼装、发送原始数据包的库,大名鼎鼎的NMAP就利用了它进行数据包发送。WinPcap是将流经网卡的数据帧的副本传递到用户层,用其开发网络嗅探程序是不错的选择,但是切记,WinPcap捕获的数据包,是流经网卡数据包的一个副本,所以WinPcap并没有截获数据包的功能,常规手段下也没有中断连接的功能(非常规:比如构造一个Fin包,发出去)。

        用户层网络程序设计实现技术功能总结:可以收发数据、可以发送捕获原始数据包(libnet/winpcap),可以进行简单的包过滤,但不支持内容过滤,因此不能开发防火墙等软件。

        内核模式下,可以利用NDIS开发网络驱动程序,实现数据包的拦截、修改,向用户层应用软件提供网络传输加密等功能。也可以将自己设计的协议栈实现在这一层。NDIS功能强大,但开发难度也较大,调试过程中经常性的蓝屏、重启,因此,要掌握好调试技术。

三、关于NDIS的一点详细介绍

        NDIS是什么,可以去百度百科,那里有十分详细的介绍。以下内容只是一点个人对NDIS的理解,从原理上讲不一定十分正确,但可能会更形象一点。

        NDIS支持三种驱动,分别是微端口驱动、中间层驱动、协议驱动。

        微端口(Miniport)驱动就是我们熟知的网卡驱动,微端口驱动的开发一般由硬件开发商提供,功能就是将一串经过曼彻斯特编码的数据帧电信号,转变成为能够让操作系统识别的数字信号。微端口为上层的驱动提供接口,可以将转变好的接收到的数据帧取走,或将上层发送来的数据经过转码后,发送到网络上,导出的接口我们暂且称之为微接口吧。

        协议(Protocol)驱动,用户层传输服务的内核层提供者,一个设计好的协议的实现通常是在这一层,一个协议驱动向下层驱动导出一个接口,用来传达下层对上层的信息。微端口接口虽然提供了将接收到的数据传递到协议驱动的功能,但协议驱动如何知道有数据接收的信息呢?这就需要微端口驱动调用协议驱动的接口了。我们也暂且称这个接口为协议接口吧。

        一个最简单的分层驱动结构就是上述两层:微端口驱动位于底层,直接与物理层交互,协议驱动位于微端口驱动之上,与微端口驱动交互。但还有这样一种驱动:中间层(Intermediate)驱动。中间层驱动位于微端口驱动和协议驱动之间,其向下伪装成协议驱动,即向微端口驱动导出协议接口并调用微端口接口,向上伪装成微端口驱动,即向协议驱动导出微端口接口并调用协议接口。中间层驱动主要用途之一就是对数据包截获和修改,此外,还可以实现VPN、NAT等功能,这些功能的实现实际上也是基于对数据包的修改。