下载

2下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 NDIS协议驱动程序设计

NDIS协议驱动程序设计.pdf

NDIS协议驱动程序设计

christinakai
2012-03-28 0人阅读 举报 0 0 暂无简介

简介:本文档为《NDIS协议驱动程序设计pdf》,可适用于人文社科领域

http:wwwpapereducnNDIS协议驱动程序设计王峥张维北京邮电大学电信工程学院北京()Email:heetywangcom摘要:网络驱动程序接口规范(NDIS)提供了上层协议驱动程序与网卡驱动程序的接口函数使协议驱动可以和网卡通信。本文首先介绍了NDIS和NDIS的类型然后主要对NDIS协议驱动的部分功能的实现进行了分析。关键词:NDIS协议驱动接口数据包.引言NDIS(NetworkDriverInterfacespecification)是Microsoft和Com公司开发的网络驱动程序接口规范的简称。它为Windows下驱动程序的开发带来许多方便。NDIS的设计目的是通过将不同的协议从网络接口卡上拆除使得用户可以访问不同的协议。在设计过程中协议并不需要了解关于网络卡的任何信息图一为NDIS驱动结构图。NDIS程序库(NDISsys)提供了一个面向NIC驱动程序的完全抽象的接口网卡驱动程序与协议层驱动程序及操作系统通过这个接口进行通信。图NDIS驱动结构FigNDISdriverstructurehttp:wwwpapereducnNDIS定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范它屏蔽了底层物理硬件的不同使上层的协议驱动程序可和底层任何型号的网卡通信。.NDIS简介网络驱动程序接口规范(NDIS)库将网络硬件抽象为网络驱动程序。NDIS也说明了网络驱动程序间的标准接口因此它将用来管理硬件的底层驱动程序抽象为上层驱动程序例如网络传输层。NDIS也维护着状态信息和网络驱动程序的参数包括指向函数的指针句柄和链接时参数块的指针以及其他系统参数。NDIS支持以下种类型的网络驱动程序:微端口驱动程序中间层驱动程序协议驱动程序。NDIS微端口驱动程序一个NDIS微端口驱动程序(也叫微端口NIC驱动程序)有两个基本功能:·管理一个网络接口卡(NIC)包括通过NIC发送和接收数据。·与高层驱动程序相接例如中间层驱动程序和传输协议驱动程序。一个微端口驱动程序与它的NIC通信并且通过NDIS库与高层驱动程序通信。NDIS库对外提供了一整套的函数(NdisXXX函数)这些函数封装了微端口需要调用的所有操作系统函数。同时微端口必须向外提供一组入口(MiniportXxx函数)使NDIS可以为了完成自己或高层驱动程序的任务而访问微端口。NDIS中间层驱动程序中间层驱动程序一般位于微端口驱动程序和传输协议驱动程序之间。因为它在驱动程序层结构的中间位置所以既与上层协议驱动程序通信又要与下层微端口驱动程序通信。在它的下界中间层驱动程序提供了协议入口点(ProtocolXxx函数)NDIS调用这些函数传递下层微端口的请求。对于一个下层微端口驱动程序一个中间层驱动程序这时就仿佛是一个协议驱动程序。在它的上界中间层驱动程序提供了微端口的入口指针(MiniportXxx函数)一个或多个上层协议驱动程序通过NDIS调用这些函数进行通信。对于上层协议驱动程序一个中间层驱动程序这时就仿佛是一个微端口驱动程序。NDIS协议驱动程序一个网络协议在NDIS驱动程序层次结构中属于最高层驱动程序而它经常在实现传输层协议的传输驱动程序中被用作最底层的驱动程序例如TCPIP或IPXSPX。一个传输协议驱动程序分配包从应用程序中将数据拷贝到包中并且通过调用NDIS函数将这些包发送到低层驱动程序中。协议驱动程序也为从下层驱动程序中接收包提供了接口。一个传输协议驱动程序将接收到的数据转换成相应的客户应用数据。在它的下层协议驱动程序与中层网络驱动程序和微端口NIC驱动程序相连接。协议驱动程序调用NdisXxx函数来发送包读取和设置由低层驱动程序所维护的信息以及使用操作系http:wwwpapereducn统服务。协议驱动程序也提供了一套入口点(ProtocolXxx函数)NDIS代表下层驱动程序调用这些函数为自己或向上指示接收包、指示下层驱动程序的状态、以及与协议驱动程序进行通信。对于上层传输协议驱动程序对高层驱动程序提供了一个私有接口。.NDIS协议驱动的实现我们是用的开发工具是windowsDDK(DeviceDevelopmentKit)DDK功能非常强大提供了驱动所需的各种NDIS函数。下面主要介绍一下使用ddk实现协议驱动的主要步骤及相关函数。初始化协议驱动程序必须提供一个入口函数DrverEntry函数相当与C应用程序的main函数驱动程序也是从这里开始被调用执行的。DrverEntry函数主要功能是对协议驱动中必须使用到的一系列protocol函数进行注册并对驱动数据结构及资源进行初始化操作。在DriverEntry必须调用NdisRegisterProtocol函数注册驱动的Protocol函数入口点并且必须注册ProtocolBindAdapter和ProtocolUnBindAdapter函数以便在ProtocolBindAdapter函数中继续完成初始化工作。DriverEntry函数中还需要注册相关派遣例程等。Protocol函数注册后驱动运行时会自动调用相关Protocol函数完成相应功能。动态绑定协议驱动程序通过提供ProtocolBindAdapter函数和ProtocolUnbindAdapter函数就可以支持对低层网卡的动态绑定。如果驱动程序向NDIS注册了这些函数那么将可以延迟打开和绑定低层网卡而不必在DriverEntry函数中实现该功能只要用ProtocolBindAdapter函数就可代替执行该操作。如果协议驱动程序提供了这些函数那么只要低层网卡可用NDIS将调用能够将自己绑定到该适配器的任何协议驱动程序的ProtocolBindAdapter函数。并且只要低层网卡被关闭那么NDIS将可以调用互逆的ProtocolUnbindAdapter函数。动态绑定网卡实现流程:ProtocolBindAdapter(参数略){NdisAllocateMemoryWithTag(……)调用NdisAllocateMemoryWithTag为设备分配驻留系统的内存……初始化设备信息……检查驱动是否已经绑定到该设备如果没有则开始进行绑定……建立绑定Status=ProtocolCreateBinding(http:wwwpapereducn……)if(Status!=NDISSTATUSSUCCESS){break}}如果ProtocolBindAdapter函数没有完成绑定操作则系统会自动调用ProtocolOpenAdapterComplet异步完成绑定操作。数据包的组织和管理在NDIS中数据的接收与发送都是以包为单位进行的。一个包由以下部分组成:·一个包描述符。其所含信息包括整个包所占用的物理页面的数量、包的长度、指向第一个和最后一个缓冲区描述符的指针以及包池的句柄等等。·一组缓冲区描述符。每个缓冲区描述符r用来描述一片存储区域其中包括起始虚拟地址、偏移量、该存储区域的大小以及指向下一个缓冲区描述符的指针等信息。·由缓冲区描述符所描述的虚拟存储区域该区域可能横跨几个页面。这些页面最终被映射到物理内存中。构造一个数据包需要申请各种资源只有成功得到了各种所需资源才能构造出一个可以用于收发数据的数据包。首先要做的就是得到一个数据包描述符而数据包描述符必须从数据包池中分配其步骤如下:在驱动程序初始化或是每次向NIC绑定时调用NdisAllocatePacketPool请求分配一个数据包池其中含有指定数量的数据包描述符。从NdisAllocatePacketPool申请得到的数据包池中请求分配一个数据包描述符。在得到了数据包描述符之后还要通过调用NdisAllocateBack或者NdisChainBufferAtFront向上面链接严格或是多个缓冲区描述符。而缓冲区描述符所描述的存储区域则可由内核提供的NdisAllocateMemory函数得到。这之后还要用缓冲区描述符对刚刚得到的存储区域加以映射。整个过程如下:首先在驱动程序初始化或是每次向NIC绑定时调用NdisAllocateBufferPool函数请求分配一个缓冲池今后所需的缓冲区描述符即由此获得。然后调用NdisAllocateMemory函数请求分配一片存储区域。最后调用NdisAllocateMemory函数请求分配一片存储区域。最后调用NdisAllocateBuffer函数分配并建立一个缓冲区描述符用以描述刚刚由NdisAllocateMemory得到的存储区域。需要注意的是由NdisAllocateMemory返回的虚拟基址和长度将在调用NdisAllocateBuffer时作为参数传入用以初始化一个缓冲区描述符。接收数据驱动初始化时会注册两个接收函数ProtocolRecieve和ProtocolRecievePacket函数当有数据包发送到网卡时驱动会根据网卡类型调用所需函数不支持多包接收的网卡或者接收单包http:wwwpapereducn且包描述符附有带外数据的情况下会调用ProtocolRecieve函数而多包接收的网卡会调用ProtocolRecievePacket函数。以ProtocolRecieve函数为例简单描述一下接收数据的流程(如图)。图接收数据流程图FigTheflowchartofreceivingdata驱动程序负责维护一个接收缓冲区该缓冲区以队列的形式组织。当网卡通知NDIS已从网络上接收到数据包时可以先将这些数据缓存起来。当上层应用程序需要读取数据时该读操作的数据源不是直接从网络得到而是经过有效管理的存放着数据的缓冲区。当下层指示有数据包时系统自动调用ProtocolReceve函数基本流程为:查询接收到的数据包是否为需要的包格式如果满足则分配并初始化包描述符和缓冲描述符在绑定时已经创建包池和缓冲池。判断包长度是否等于前视缓冲区长度。如果等于则将待接收的包进行排队并记数之后进行读取数据操作。如果不等于则调用NdisTransferData接收数据并当返回Pending状态时调用ProtocolTransferDateComplete完成相关操作。发送数据发送数据必须先组成需要发送的包格式然后放到队列中等待发送。在发送前要创建发送数据包池和缓冲池(在绑定时候创建)在需要发送数据时为包从包池中创建包描述符和缓冲描述符。http:wwwpapereducn当数据包组好后首先对数据的合法性检验。如果数据太短小于以太网包头(个字节)则不合法如果数据太长比底层网卡所能支持的最大帧长度还长则也不合法然后判断是否已经绑定网卡如果已绑定则调用系统函数NdisAllocatePacket分配和初始化一个包描述符调用NdisAllocateBuffer分配和初始化缓冲描述符并给新分配得到的缓冲描述符赋值指向系统空间中的用户缓冲区当资源分配完毕会根据需要调用系统函数NdisSendPackets或NdisSend向下递交一个发送请求。(流程如图)图发送数据流程图FigTheflowchartofsendingdata对NdisSendPackets的调用系统会自动调用ProtocolSendComplete来完成发送操作获得发送的包的缓冲区信息并释放包缓冲区描述符。.总结NDIS规范应用非常广泛可以实现不同类型驱动接口本文主要对协议驱动的NDIS接口的实现进行了简要介绍并且已经通过测试可以进行简单的数据包的发送和接收上层具体协议可以根据需要实现不同协议来完成需求开发window操作系统下的NDIS协议驱动。http:wwwpapereducn参考文献MicrosoftCorp,WindowsNTDDKdocumentationArtBakerJerryLozano著<<Windows设备驱动程序设计指南>>机械工业出版社,TheDesignofNDISProtocolDriverWangZhengZhangWeiSchoolofTelecommunicationEngineeringBeijingUniversityofPostsandTelecommunicationBeijing()AbstractNetworkDriverInterfacespecification(NDIS)providetheinterfacefunctionoftheupperprotocoldriverprogramandthenetworkcarddriverprogram,whichmaketheprotocoldrivercouldcommunicatewiththenetworkcardThispaperfirstintroducestheNDISandthetypeofNDIS,thenmainlyanalysestheimplementionofthepartfunctionoftheNDISprotocoldriverKeywords:NDISProtocolDriverInterfacedatapacket

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/7

NDIS协议驱动程序设计

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利