3.2 NDIS协议驱动程序
网络驱动程序接口规范(NDIS)标准定义了网络适配器(也可以说是管理网络适配器的驱动程序)与协议驱动程序之间的通信。NDIS的主要目的是扮演一个包装层的角色,允许协议驱动程序不依赖特定的适配器或特定操作系统来发送和接收网络上的数据包。
3.2.1 三种类型的网络驱动程序
NDIS支持三种类型的网络驱动程序:网络接口卡驱动程序、中间层驱动程序、协议驱动程序(或传输层驱动程序)。
1.网络接口卡驱动程序
网络接口卡的驱动程序直接管理NIC。NIC驱动程序在其下面直接与物理硬件打交道,在其上面提供一个接口,允许高层(驱动)在网络上发送数据包、处理中断、复位NIC、停止NIC,以及请求与设置驱动程序的操作特性。NIC驱动程序的层次关系如图3-2所示。
图 3-2 NIC驱动程序的层次关系
NIC驱动程序既可为微端口(miniports)驱动程序,也可为遗留的全NIC驱动程序。
❑微端口驱动程序:微端口驱动程序仅以实现特定的硬件操作来管理NIC,包括发送与接收NIC上的数据。微端口对所有底层NIC驱动程序通用的操作(诸如同步管理)都是由NDIS库提供的。微端口不直接调用操作系统的例程,它们与操作系统的接口是NDIS库。微端口不保持绑定的跟踪,它仅把数据包向上传递给NDIS库,并由NDIS库确定这些数据包是否传递给了合适的协议。
❑全NIC驱动程序:全NIC驱动程序被编制为既执行特定硬件的操作,又执行所有同步与排队等通常由NDIS库完成的操作。例如,在全NIC驱动程序中,需要维护它们自己的绑定信息以标识所接收的数据。
2.中间层驱动程序
中间层驱动程序是上层驱动程序(诸如协议驱动程序)与微端口驱动程序之间的一个接口。对上层驱动程序而言,中间层驱动程序看起来像一个微端口驱动程序。对一个微端口驱动程序而言,中间层驱动程序看起来像一个协议驱动程序。一个中间层驱动程序可以位于另一个中间层驱动程序的顶部,尽管这样的分层对系统性能有负面影响。开发中间层驱动程序的典型原因是在一个已有的遗留协议驱动程序与一个微端口驱动程序之间执行介质转换任务,而该微端口驱动程序是把NIC作为一种对协议驱动程序而言是未知的新介质类型来管理的。例如,一个中间层驱动程序能够从LAN协议转换到ATM协议;一个中间层驱动程序不能与用户层的应用程序通信,只能与其他NDIS驱动程序通信。
3.协议驱动程序
协议驱动程序用于实现一个网络协议栈,如IPX/SPX或TCP/IP等,它在一个或多个网络接口卡上提供服务。一个协议驱动程序为其上面的应用程序层的客户提供服务,同时与一个或多个NIC驱动程序或其下面的中间层NDIS驱动程序连接。
协议驱动程序和底层NDIS驱动程序的通信(如发送和接收数据包),总是使用NDIS库提供的函数来进行的。例如,下边界是面向无连接的协议驱动程序(比如,与面向无连接介质的底层驱动程序进行通信,典型例子有以太网、令牌环网等)必须调用NdisSend或者NdisSendPackets函数向底层NDIS驱动程序发送数据包,也必须调用NdisRequest来进行查询,以及使用网络相关的底层面向无连接的驱动程序所支持的OID_XXX函数来设置信息请求。
NDIS库提供了一组隐藏底层操作系统细节的NdisXXX函数。例如,协议驱动程序调用NdisInitializeEvent为同步目的创建事件,调用NdisInitializeListHead创建链表。使用这些函数的NDIS协议驱动程序在微软操作系统之间的可移植性会更好。协议驱动程序也可调用OS专用的内核模式函数,例如可用KeInitializeEvent创建事件、用KeWaitForSingleObject同步两个执行线程。