




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
无线网卡驱动软件的实现李姗新技术开发中心摘 要:宽带无线IP网络中移动终端的实现不仅要求优秀的硬件设计以达到良好的物理性能,更离不开其配套软件的支持。早期的宽带无线PE网络中,移动终端的软件均是在Linux平台下开发的,虽然可以使无线网卡正常工作,但是安装以及配置都不便于用户操作。虽然近年来Linux操作系统以其特有的优越性在服务器、嵌入式系统等方面得到了广泛的应用,但是作为PC用户,Windows在很长一段时间内仍然是主流操作系统。因此为了达到实用化的目的,我们着力于开发Windows平台下的移动终端软件,向用户提供一个友好的界面,使用户只需进行简单的操作,就能够从容使用无线网卡进行Intenret接入,并对无线网卡进行一些常用的配置。同时也为宽带无线IP网络的普及做出了很大的贡献。主要分析Windows平台下无线网卡驱动软件的实现关键词:无线网卡1无线网卡驱动软件的软件环境1.1 WindowsNT操作系统概述(1)WindowsNT的硬件特权极从Intel80386开始,出于安全性和稳定性的考虑,该系列的CPU可ring0-ring3从高到低四个不同的权限级别,对数据也提供相应的四个保护行于较低级别的代码不能随意调用高级别的代码和访问高级别的数据,ring0级别的代码可以直接对物理硬件进行访问。由于WindowsNT是一个支持多平台的操作系统,为了与其他平台兼利用了CPU的两个运行级别:内核模式内核模式对应于80x86的ring0层,当CPU运行于内核模式时一切行,任务可以执行特权极指令,对任何UO设备有全部的访问权。操作系第3章无线网卡驱动软件的实现部分,包括设备驱动程序都运行于该模式用户模式用户模式对应于80x86的ring3层,在这个模式中,硬件防止特权指令并进行内存和1/O空间引用的检查,此时操作系统就可以限制任务对各种的访问。操作系统的用户接口部分以及所有的用户应用程序都运行在该级(2)WindowsNT操作系统体系结构WindowsNT操作系统被分为许多独立的模块,如图3.1所示,它使用“环境子系统”的技术可用来对多操作系统进行仿真。我们可以看出WindowsNT操作系统包含许多不同的模块,这些模块可以被分成三组:硬件抽象层(HardwareAbstractingLayer:HAL)HAL提供了基于处理器结构资源的不变抽象层,使得NT操作系统的其他部分(包括内核和可执行等级部件)能够方便的使用处理器资源。由HAL提供的工具和资源主要包括:设备寻址、1/O体系结构、中断管理、DMA操作、系统时钟和计时器、硬件和BIOS接口以及配置管理。系统内核WindowsNT内核是主要用来处理系统运行机理的操作系统模块,它负责为操作系统中所有较低等级功能提供专门处理器支持。与HAL不同,内核为基本设计体系结构提供支持,包括处理和发送中断、存储和恢复线程环境以及多处理器的同步。NT操作系统的可执行层等级的部件可以使用内核提供的服务。可执行层 可执行层在WindowsNT操作系统中是一个特殊的模块,它负责实现与操作系统关联的许多基本功能,包括系统服务分发、管理分页池和非分页池。可执行层由多个可执行部件组成(如输入/输出管理器、对象管理器等),并为用户模式进程及它们彼此之间提供服务。可执行层组件把UO请求从用户模式和内核线程转换成对各种驱动程序例程的合适顺序的调用。从图我们还可以看出,核心模式的设备驱动程序(DeviceDriver)是被UO管理器包围起来的,即驱动程序与操作系统上层的通信全部都要通过UO管理器,这给驱动程序的编写带来了很大的便利,诸如接收用户的请求、与用户程序交换数据、内存映射、挂接中断、同步等麻烦的工作都由UO管理器代劳了。1.2 WindowsNT驱动程序(1)WindowsNT驱动程序的分类在WindowsNT中,从最高的等级上,驱动程序可以分为两大类:用户模式驱动程序和内核模式驱动程序。用户模式驱动程序对于一个特定环境子系统来说是特定的,并且它对由这个子系统控制的应用程序提供支持。用户模式驱动程序经常为标准内核模式驱动程序提供子系统专门接口口在我们通常所使用的Win32环境子系统中,用户模式驱动程序作为动态链接库使用。内核模式驱动程序组成了WindowsNT执行层的一部分,正如他们的名字一样,内核模式驱动程序运行于内核模式中,它们根据硬件的通信协议,直接对硬件进行端口访问、中断响应和DMA传输。内核模式驱动程序可以分为如下三种:文件系统驱动程序(FSD)、中间级驱动程序和设备驱动程序。本文所讨论的无线网卡的驱动程序即为设备驱动程序的一种。这些驱动程序按照一定的顺序组成了驱动程序堆栈,“堆栈”共同工作,全面处理一个特定设备对象上的请求,如图下所示。(2)WindowsNT内核模式设备W动程序的结构WindowsNT驱动程序结构使用入口点(Entyr)模型。在这个模型当中,当UO管理器想要驱动程序执行一个特定的功能,UO管理器就会在驱动程序中调用一个特定的例程。在驱动程序的每一个入口点,v0管理器传递一套特定的参数给驱动程序,使得驱动程序可以执行所要求的功能。大多数WindowsNT内核模式设备驱动程序使用的基本驱动程序入口点如下:驱动程序入口点(DriverEntyr)这是每一个设备驱动程序的入口,每次加载驱动程序时,操作系统会自动调用这个函数。大部分的设备初始化的工作都在这个过程中完成,包括设置响应各种用户请求的过程的入口,当用户请求到来时,使得UO管理器知道应调用哪些过程来处理。分派入口点(Dispatchentyrpoints)当UO管理器有一个UO请求需要驱动程序处理时,它会调用驱动程序相应的分派入口点(分派入口点的选择取决于请求的UO主函数代码),把一个指针传递给驱动程序的一个设备对象,把另一个指针传递给一个I!0请求包(I/0RequestPacket,IRP)。其中IRP用于描述要执行的UO请求,它将在所指向的设备对象上执行。中断服务例程(ISR)只有当驱动程序支持中断处理的情况下,这个入口点才存在。在DriverEntry中就建立了设备中断向量与设备驱动程序之间的连接,因此当设备请求一个硬件. 中断时,就会调用与之对应的ISR.推迟过程调用(DeferredProcedureCall,DPC)WindowsNT为它的内核代码分配了不同的级别。在同一个CPU上,级别低的过程可以被任何级别更高的过程中断。由于中断处理过程运行于较高的DIRQL级(与1/O设备的平台相关的中断级别),它们能屏蔽许多级别小于或等于它们的过程的执行,如果它们占用CPU时间过长,很容易使系统性能下降。因此中断处理过程应将一些不是很紧急的任务放在DPC的过程中,在完成数据传输等紧急任务后将一个DPC对象放在系统DPC队列的末尾,然后退出,尽量早地让出CPUs系统将在完成所有DIRQL级的任务后处理DPC队列,在DISPATCHewLEVEL执行每一个DPC对象指定的DPC过程,完成中处理断过程未尽的任务。1.3网络驱动程序结构WindowsNT的网络结构但是作为网络驱动程序,他们不同于标准的内核模式驱动程序,而是有着自己特有的接口规范-NDIS(NetworkDriverInterfaceSpecification).NDIS描述了在网络接口卡(NIC)驱动程序和其上层协议驱动及操作系统之间的一个接口,通过这个接口可以实现一个或多个NIC驱动程序和其上层协议驱动的通信。NIC驱动程序可以依赖NDIS实现所有的外部函数,包括与上层协议驱动程序的通信、注册和截获NIC硬件中断以及与底层的NIC进行通信。由于NDIS紧随着技术的发展和开发商的反馈同步发展,目前NDIS标准己经发展成为网络标准的一个完整家族。WindowsNT支持3种类型的网络驱动程序:.网络接口卡(NetworkInterfaceCard,NIC)驱动程序(NICdriver)在驱动程序栈的底部,是网络接口卡驱动程序,管理实际的网络硬件。NI驱动程序表现一个标准的接口,允许高层驱动程序发送和接收包,复位和停止NIC,查询和设置NIC的特性。到NIC驱动程序的接口由NDIS定义。.NDIS中间驱动程序(NDISintermediatedriver)NDIS4.0版包括一种新组件,NDIS中间驱动程序。NDIS中间驱动程序是位于上层协议驱动程序(如传送驱动程序)和微端口驱动程序之间的夹层,对上层的传输驱动程序transpotrdriver)来说,中间驱动表现为微端口驱动程序;对微端口驱动程序来说,中间驱动程序则表现为协议驱动程序。NDIS中间驱动程序执行各种必要的NIC驱动程序和传输驱动程序之间转换。以管理传输驱动程序不能识别的新介质。上层协议驱动程序(Upper-levelprotocoldriver)。上层协议驱动程序负责实现TDI接口或特定的应用程序接口,以向其用户提供服务。它独立于底层的网络硬件,通过调用NDIS向下一层驱动程序打包、拷贝数据并发送分组,而且它也向下一层驱动程序提供接口以接受来自下层驱动程序的分组。所有的WindowsNT传送驱动程序都通过传送驱动程序接口(TDI)为内核模式网络客户程序提供服务。2 无线网卡的软件编程接口分析2.1 HFA3841的基本操作由于MAC控制器HFA3841的固件(Firmware)中完成了最底层、最复杂的传输/发送模块功能,并向下提供与物理层的接口,向上提供一个程序开发接口,为程序开发人员开发附加的移动主机应用功能提供支持,其本身的功能非常强大、复杂。下面对HFA3841的基本操作做具体的分析。初始化过程当CardServices模块发出命令将卡设置为I/O方式后,初始化过程包括如下的一系列操作:1)主机等待命令寄存器的Busy位清零。2)主机发出命令初始化HFA3841,然后等待HFA3841命令寄存器的Bsuy位清零。HFA3841在收到命令后,将卡内可用的内存按128字节分块,并形成一个内存块链,然后给这些链表分配帧标识(FID),最后进入Disable状态。3)主机通过写RID(OXF000)来设置MAC端口类型(AP和MH的设置是不同的),然后等待HFA3841的忙位被清除。HFA3841收到命令后更新自己的配置参数,清除忙位。4)主机通过写RID(OXFC07)来设置最大的数据长度。然后等待HFA3841的忙位被清除。HFA3841收到命令后更新自己的配置参数,清除忙位。5)主机写相应的RID来设置其他需要的参数,同上面的一样,HFA3841配合更新自己的配置参数。6)主机设置中断使能寄存器相应的位,将各个事件的处理对应到各个事件的处理函数上。(注:主机必须对占有资源的事件予以确认)7)主机发出使能命令。HFA3841发出probe命令在给定的信道上搜索配置的SSID,如果找到,尝试认证和登录,并将状态的改变和收到数据的事件告知主机。一旦网卡进入使能状态,通常的数据收发过程就可以开始了,这也包括缓冲区的操作。数据发送过程:1)分配缓冲区或预留缓冲区在发送之前,需要申请分配一块缓冲区。也可以在采用一种效率更高的方式,即先申请并保留一个FID池,这些FID都是可重复使用的。对可重用的FID,Firmware将这个FID连接到新的一块缓冲区,以分配事件(allocationevent)的形式告知主机该FID可以使用。HFA3841的Firmware收到主机发出的分配缓冲区的命令后,在缓冲区列表中找到一块足够大的空闲缓冲区,并将指向该缓冲区头的指针作为FID返回给主机。2)访问缓冲区主机将FID写入BAP选择寄存器,将偏移地址写入BAP偏移寄存器,然后等待忙位被清除。HFA3841的Firmware收到主机的命令后,计算缓冲区指针和物理偏移量,准备访问缓冲区,并将BAP偏移寄存器的忙位清除。3)写缓冲区主机通过BAP寄存器写入数据。在HFA3841侧,Firmware读取每一个写入BAP数据寄存器的数据,将之写入对应的物理内存,并使缓冲区指针增加,以指向下一个逻辑缓冲区位置。4)发出发送命令主机将欲发送的FID写入第一个参数寄存器(ParamO)将发送命令写入命令寄存器,然后等待中断或主动查询事件状态寄存器(EVSTAT),HFA3841的Firmware收到主机发出的命令,将主机指定要发帧的FID所标识的帧放入发送队列做进一步的处理,然后等待发送完成。在等待的期间,Finnware可以服务于其他的事件。当发送完成后,Firmware在事件状态寄存器中设置相应的位来给主机以回应发送成功则设置TX位,否则设置TXExc位)。5)确认发送状态主机收到发送状态后,在事件确认寄存器(EvAck)设置相应的位对发送状态予以确认。6)下一次分配在HFA3841侧,如果发送命令指出是要重用,而且Firmware不再需要这些缓冲区、Firmware就会在查询缓冲区链表以确保FID对应有足够的缓冲区,然后以分配事件的形式告知主机。相反,如果发送命令没有指定为可重用,主机必须通过分配命令得到另一个FID。主机保留从分配事件中得到的FID,作为访问可重用的缓冲区的令牌。盛藉捞戎苗爵1)准备接收HFA3841的Firmware预留一个最大的缓冲区以处理接收的数据。一旦该缓冲区被使用,就有一个后台的进程来重新分配一个新的缓冲区.2)数据到达HFA3841将接收到的数据放入接收缓冲区队列。如果帧有效,就回应一个ACK信号。Firmware截断缓冲区,将剩余的缓冲区块返回给系统的空闲缓冲池,然后通过事件状态寄存器EvStat)告知主机有数据帧到达。3)主机准备接收数据主机收到接收事件后,从接收FID寄存器中获取接收帧的FID,将之写入BAP选择寄存器,并在BAP偏移寄存器中写入逻辑偏移量。HFA3841的Firmware收到主机的命令后,计算缓冲区指针和物理偏移量,准备访问缓冲区。宽带无线IP网络中实用化移动终端的研究与实现4)主机接收数据主机不断的读取BAP数据寄存器,直到所有的数据读入主机的缓冲区中。(读取的次数可以依据帧描述符中数据长度域来确定。)HFA384I的Firmware配合主机的读数,自动增量缓冲区的指针,并把相应的数据放入BAP数据寄存器中。5)对接收事件以确认当所有的数据都以接收完成,主机设置事件确认寄存器(EvAck)相应的位以确认接收事件完成。消息帧的处理消息帧的处理相对来说要简单的多(但根据消息帧的信息来做处理却是整个系统中最关键和复杂的),其主要的用途在于主机和HFA384I之间交换通信信息。总共有三种类型的消息帧:通知帧(NotificationFrame),查询帧(InquiryFrame)非主动请求帧(UnsolicitedFrame).通知帧(NotificationFrame)是主机主动通知HFA384I通信信息,操作过程如下:1)主机向HFA384I发出命令申请消息帧的FIDHFA384I收到命令后按最大的帧长分配一块缓冲区,并赋与一个FID.然后以中断的形式告知主机。2)主机收到分配完成事件中断后,从对应的寄存器中获取FID,根据这个FID借助于BAP,将通知帧的数据放入HFA384I的缓冲区中。3)主机将消息帧的FID放入参数寄存器中,在命令寄存器中向HFA384I发出通知命令。HFA384I收到通知帧后,转入对通知帧的处理,以配合主机的操作。查询帧(InquiryFrame)用于主机主动查询HFA384I当前的通信状态或参数,操作过程如下:1)主机将查询类型(InfoType)写入参数寄存器,然后发出查询命令。2)HFA384I收到命令后,根据查询类型,收集相应的信息,并组织成帧,以中断的形式告知主机。3)主机在中断处理时根据所获取的FID,获取查询帧的数据,给HFA384I以回应确认收到。然后转入对查询帧的处理。另一种类型的消息帧是非主动请求帧(UnsolicitedFrame),用于HFA384I主动向主机提供信息,通常发生在通信状态改变时,操作过程如下:1)当HFA384I有消息帧要给主机时,通过中断告知主机。2)主机收到中断信号,检查事件寄存器相应的位,如果是有消息帧到达事件,则转入消息帧处理函数。3)当主机完成对消息帧的处理,在事件确认寄存器里设置相应的位给HFA384I以确认,表明事件处理完成。.2.2HFA3841的软件编程接口HFA3814的软件编程接口主要包括寄存器列表,命令/状态寄存器,IFD管理寄存器,缓冲区访问通道(BAP,BuefrAcsesPath),事件寄存器,控制寄存器,主机软件寄存器,辅助端口。表3,1示出了所有寄存器的列表以及寄存器的格式。HAF3814的软件编程接口不仅仅是表列出的寄存器列表,还包括固件(iFmrwra)e所提供的有关命令以及这些命令的操作规范,如前面所述的基本操作等等。遵从HAF8341的操作规范,主机将能与H队3814配合,完成初始化、数据收发、设备管理等功能。23无线网卡驱动软件的实现本文所讨论的宽带无线网卡驱动程序属于网络接口卡驱动程序(NICDirevr)中的一种NDsI微端口驱动程序。本小节从NCIDrive:谈起,描述了采用NDSI微端口驱动程序来开发无线网卡驱动软件的优越性,并着重描述了无线网卡驱动软件的实现过程。2.3.1NDIS微端口驱动程序NDISNIC驱动程序依赖于NDIS接口提供的服务,NDIS库引出一个完整的内核模式系统函数集。NIC驱动程序与上层协议驱动程序以及与下层的宽带无线网卡的接口都必须符合NDIS接口标准。NIC驱动程序提供到网络接口卡的接口。上层的传送驱动程序通过标准的NDIS接口和NIC驱动程序通信。当传送驱动程序有一个分组要发送,它将通过NDIS接口库提供的服务来调用NIC驱动程序把分组传下来,而NIC驱动程序接收到此分组后,继续把它传到具体的网络接口卡上,并指示网络接口卡把分组传送到物理网络上。同样,当网络接口卡从网络上接收到分组时,会产生一个硬件中断,此中断由NIC驱动程序处理,NIC驱动程序将通过NDIS指示协议驱动程序已接收到一个分组。NDISNIC驱动程序有两种类型:微端口NIC驱动程序微端口驱动程序执行管理NIC所需的硬件操作,包括发送和接收数据。对所有底层驱动程序共同的操作则由NDIS来提供,例如同步。微端口驱动程序不直接调用WindowsNT操作系统的内核模式函数。与操作系统之间的接口由NDIS来完成。全驱动程序全驱动程序不仅要完成对特定的硬件操作,同时还要完成通常由NDIS来完成的系统操作,如同步问题和排队问题。全驱动程序保存绑定信息以指示上层接收到分组,而微端口驱动程序不需要保存绑定信息,它通过NDIS把收到的分组传给上一层。由上面的介绍我们可以看出,两种类型的NIC驱动程序都使用NDIS接口库CNDIS.sys)提供的函数和服务。NDIS库将NDIS微端口和中间驱动程序从操作系统分离出来,执行尽可能多的公共处理,它为NDIS驱动程序创建了一个完整的常规环境,使得NDIS驱动程序可以被修改以用于网络操作,也可以跨越操作系统。NDIS库使得驱动程序卸下了处理许多日常事务的负担,并且提供了通常标准核心模式驱动程序所没有的专门网络功能。本文使用微端口NIC驱动程序来开发宽带无线网卡的驱动程序。这样,不仅可以降低开发驱动程序的难度,更由于NDIS接口库的可跨越操作系统性,我们在WindowsNT下编写的无线网卡驱动程序所生成的目标代码可以在Windows98, WindowsMe以及Windows2000下正常运行。2.3.2无线网卡驱动程序的具体实现驱动程序和应用程序之间最大的差别之一是驱动程序的控制结构.应用程序从头至尾都在main或WinMain函数的控制下进行,控制各个子例程被调用的顺序。而驱动程序没有main或WinMain入口函数,只是由I/0管理器根据需要调用的子例程的集合。下面描述无线网卡驱动程序中重要例程的实现。(I)驱动程序的初始化过程驱动程序的初始化模块主要完成驱动软件和无线网卡硬件的初始化操作。DriverEntyr例程每一个微端口驱动程序必须提供一个DriverEntry例程。当驱动程序被载入时,I/O管理器调用该驱动程序的DriverEntyr函数,该例程在微端口驱动程序和NDIS库之间建立联系,并在NDIS中登记特征信息。NDIS微端口驱动程序在DriverEntry例程中做的第一件事就是通过调用NdisMInitializeWrapper()函数确保NDIS库已经装载,并向NDIS库提供一个指向NDIS微端口驱动程序对象(DriverObject)的指针,这样当接收到一个I”时,v0管理器就会调用NDIS库。在驱动程序和NDIS建立联系后,NDIS微端口驱动程序会创建一个NDIS一INIPORTesCHARACTERISTICS数据结构,这个结构包含了NDIS版本号以及指向NDIS微端口其他入口点的指针。最后NDIS微端口驱动程序通过调用NdisMRegisterMiniport()函数,将一个指向该数据结构的指针传给NDIS库。DriverEntry模块的流程图见图其中结构体NDISesMINIPORT_CHARACTERISTICS的成员包括:CheckForHangHandler是一个可选函数,用来报告NIC的状态信息。如果不提供此函数。将由NDIS通过发送或请求超时来决定硬件适配器信息。DisableInterruptHandler禁止适配器产生中断信号。EnableInterruptHandler允许适配器产生中断信号。HaltHandle:当NIC被删除时释放NIC站用的资源,停止NIC的运行。HandlelnterruptHandler完成未处理完的中断处理,开始新的操作。就是前面所提过的推迟过程调用(DPC).InitializeHandle:为以后的网络UO操作设置NIC,申请注册表中必须的硬件资源,为网络UO操作分配驱动程序所须的资源。sIRllandle:中断服务程序。Qeu班nfomratioHnnaider返回驱动程序或硬件接口卡状态和传输能力eRestHnadler硬件接口卡的复位或复位驱动程序的软件状态。eSdnHaldle:传输一个上层传下来的分组到硬件接口卡。eSdnPakcetsHnaider传输几个上层传下来的分组到硬件接口卡。SlelnofmratioHnnadler NoIS设定NIC驱动程序的信息口rTnasefrDataHnaidre复制接收到的分组到NDIS指定的地址。CW10Initialize例程CW10hiitialize()是进入DirverEnrty例程后第一个被NDIS调用的函数,cwlolnitialize函数启动适配器并向打包器(、好apper)注册资源。首先必须为保存硬件适配器特定的信息和驱动程序的内部结构体分配空间,例如本文讨论的驱动程序中定义的cwlo一ADAPTER类型的adapter-p。CW10esADAPTER是本文的无线网卡驱动程序定义的一个非常重要的结构体,它包含了驱动程序所能控制的适配器的所有软硬件信息。在驱动程序中通过调用NdisAllocateMemoyr和NdisZeroMemory分配和初始化结构体所需的空间。接下来通过调用ReadConfigeRegistryo函数读取无线网卡特定的注册表信息,同时还从注册表中获取卡的类型、总线类型、卡的中断号、IO端口基地址等和卡相关的基本信息,由于我们使用的是PCMCIAII插槽的无线卡,所以还要通过调用NdisMQueyrAdapterResources向系统询问PCMCIA资源,最后根据获取的信息对adapterp_结构体中的参数进行相应的设置。在驱动程序中主要通过调用NdisReadConfiguration()获取注册表中的信息。在适配器的信息设置完毕之后,调用CWlORegisterAdapter()函数注册无线网卡适配器的各项参数并完成硬件初始化,主要包括:调用NdisMSetAttributeso传递adapte,的指针到NDIS;调用NdisMRegisterloPotrRange( )向操作系统注册UO端口地址,它首先申请I/O端口地址然后得到一个映射地址驱动程序以后调用NdisRawWrite(Read)PotrXxx函数时必须用映射地址:调用CardReset(adapter_p)对无线卡完成硬件初始化,并申请FIDo调用NdisMRegistertnterrupt()确定设备所使用的硬件中断号,此中断号由NDIS保存并传递给系统,再通过调用CWlOEnableInterrupto激活硬件中断。当适配器硬件产生中断时,会自动调用驱动程序的MinipotrISR例程在本文讨论的驱动程序中为CWlOIsr;(2)数据传输处理模块网络数据的传输主要包括数据的发送和接收。无线网卡驱动程序对于要发送和接收的数据均是采用NDISPACKET包来描述的。NDISPACKET包的结构对于驱动程序来说是不透明的,NDIS库提供了一些必要的函数来提取包中的信息,并对提取的信息及分组进行操作。而每一个NDISPACKET包又是由一个或多个NDISBUFFER组成,在WindowsNT中,NDISBUFFER实际上是一个内存描述表(MDL)。图显示了NDISPACKET和NDISBUFFER数据结构之间的关系,以及每个NDISBUFFER代表的消息程序段。下面将分别描述数据发送模块和数据接受模块的实现。数据发送例程当协议层有分组要发到网络上时,NDIS库会调用适当的MinipotrSend模块,在本文讨论的驱动程序中为CWIOSend(),此模块当协议驱动程序调用NdisSend函数时由NDIS调用。首先把收到的分组放入发送队列中,然后按照先进先出的顺序将队列中所有的数据发到无线网卡的固件中。在发送数据之前必须先查看无线网卡是否有分配好的FID号,如果没有则不进行处理,当数据发送完毕之后,将该FID号重新放回可用的FID队列中。数据发送例程的流程图见图3.7。该例程主要包含的内部模块有:调用CardCopyDownPacket()先将数据帧拷贝到发送缓冲区,然后执行发送命令,将数据帧发到无线网卡的固件。调用NdisQueyrPacket()查询待发送的数据帧的信息。调用NdisQueryBuferQ获取待发送的数据帧的第一个缓冲区的地址和程度。调用NdisMSendComplete()向NDIS报告发送状态信息如果用户要求对数据帧进行加密,且在驱动程序初始化时指明是在驱动程序加密,则在把数据发送到无线网卡之前要先对数据帧进行加密。数据接收例程数据帧的接收是通过硬件中断来实现的。当无线网卡收到数据帧之后,会产生一个接收中断,这时就会调用驱动程序的中断服务例程MiniportISRO,对接收中断做相应的处理,从硬件接收数据并保存在预先申请的缓存区中,然后向NDIS报告收到了数据帧。对于中断服务例程,将在后面给以介绍。图给出了数据接收的模块流程图。该例程包括的主要模块有:硬件产生中断时,调用CWlOIsr()。调用中断的延迟处理例程CWIOHandlelnterrupt0从EvStat寄存器中读取中断,并进行处理。调用Cw10RcvDpc()保存接收到的数据帧,并调用NDISMEthIndicateReceive()向NDIS报告收到数据帧。(3)中断和DPC处理当无线网卡适配器发出中断时,操作系统会调用NDIS库的中断服务例程。本文所讨论的驱动程序在初始化时已经注册了MinipotrIsr例程CWlOIsr(),所以当硬件产生中断时,NDIS库会首先调用该例程,当该例程返回TRUE时,就会请求微端口驱动程序的MinipotrHandleInterrupt例程,根据收到的硬件中断的类型分配给相应的DPC处理。中断和DPC处理例程包含的主要模块有:MinipotrISR模块CWlOIsr()CWl0Isr()是本文讨论的驱动程序的中断服务程序,当硬件产生中断时,此模块会被调用,在处理完所有挂起的中断之前,阻塞新的中断请求。每一个NIC驱动程序都应该在此例程做尽可能少且必须的工作,而推迟每一个中断产生的I/0操作到MinipotrHandleInterrupt例程。当MinipotrISR返回控制,应记录下中断的信息,如果确定收到的中断来自无线网卡适配器,则设定变量InterruptRecognized为TRUE.MinipotrHandlelnterrupt模块Cw10Handlelnterrupt()Cw10Handlelnterrupt(是一个中断的延迟处理例程,它进行实际的帧接收工作。首先通过调用CARDGETINTERRUPTTYPE,返回无线网卡上等待的最重要的中断的类型,然后根据不同的中断类型分派到相应的DPC例程。无线网卡硬件中断的类型有如下三种:接收(Receive)、分配(Alloc)和信息中断(INFO).CWIORcvDpcQ当收到接收中断时,调用此DPC例程。它从无线网卡的指定缓冲区读取数据包,如果收到的是管理帧,则调用Process8021IMgmtFrameo进行处理;如果收到的数据帧是密文,且在驱动程序初始化时指明是在驱动程序解密,则要先对数据帧进行解密,然后再通知NDIS有分组数据到达。(4)无线网卡参数信息的查询和设置模块如果想对驱动程序的特征信息进行查询和设置,NDIS将会调用MiniportQuerylnformation例程进行信息查询,调用MinipotrSetInformation例程进行设置。NDIS使用对象标识符(ObjectIdentifier.OID)进行信息查询和设置.信息查询模块MiniportQueyrlnformation-CwlOQueryInformationo,NDIS将会调用此例程查询驱动程序的特征信息。图给出了其流程图。NDIS将根据查询的这些信息对发送和接收过程进行控制,比如发送下来的帧格式,帧的长度,发送的速度等。由于无线网卡不同于我们通常所用的以太网卡,因此本文讨论的驱动程序不仅支持驱动程序特征信息的查询,而且还提供对无线网卡特定信息的设定和查询,主要包括:OIDDOTIIMIB可以通过该OID访问802.11MIB库OID_CURREN几BSSID指示无线网卡当前接入的BSS的标识(即AP的MAC地址)OID_TXRATE可以通过该OID查询当前无线网卡的工作速率OID一ETWORK一TYPE指示无线网卡工作的网络模式,单区网和多区网OID_WEP-REQUIREDesMODE指示无线网卡是否工作在加密状态等等。信息设置模块MiniporSetInformation-CW1OSetInformation()MinipotrSetInformation例程允许上层绑定的协议驱动程序或NDIS改变NIC保存的特定的OIDs的值,比如改变接收多址帧的地址。上层驱动程序通过调用NdisRequest.NDIS把此调用转换成调用NIC驱动程序的MinipotrSetInformation例程然后NDIS再把返回值传递给相应的协议驱动程序。要想使无线网卡能够正常工作,必须对一些基本的参数进行设置,如SSID,数据传输速率等。因此使用相应的配置软件通过这一模块可以设置无线网卡的各项参数。2.3.3无线网卡驱动程序的编译和安装(I)编译和调试编译与调试:在WindowsNT下编译驱动程序的环境被称为DDK(DeviceDriverKit)ForMicrosotfWindowsNT,这是一个命令行下的工作环境。在安装DDK之前需要安装Win32SDK(SoftwareDevelopmentKit)以及MicrosotfVisualC+.安装DDK后,在DDK程序组下有Checked和Free两个编译环境,Checked环境是编译带调试信息的驱动程序,Free则是编译正式发布版本的环境。通常情况下设备驱动程序的编译采用命令行的方式。一般来说,成功编译一个最基本的设备驱动程序需要四个文件,驱动程序C语言源程序文件;RC文件(例如cwl0.rc),用来确定一些驱动程序的版本信息等;SOURCES文件,用来指定需要编译的文件以及需要连接的库文件;Makefile文件,只有一行的固定格式文件。编译链接器为Build.exe,他从配置文件Sources中读出待编译的程序的配置,包括源文件、目标文件等,从环境变量Include中得到引用文件的地址,然后调用VisualC+的编译链接器mnake.exe进行实际的编译链接工作。日志文件build.log,build.wrn和build.err中分别记录了编译链接中执行的命令行,遇到的警告和遇到的错误。编译完成后的文件后缀为.Sys.目前NT驱动程序的调试工具只有WINDBG和SOFTICE,WNIDBG的使用需要双机环境,本文使用Sotf-ICE.Soft-ICE是一种非常实用的调试工具,使用它可以进行源码级的调试。它拥有相当于硬件侦错器(hardware-level)的能力,使它能凌驾于DOS一般的除错程序之上。Sotf-ICE使用386的虚拟86模式(virtual86mode)将DOS所有程序放在一个虚拟机器(VirtualMachine)上,使得Sotf-ICE可以完全控制DOS的环境。可在程序的任意指令行、UO口在读/写时、到达某块内存范围,或是中断发生处设定断点,使驱动程序运行到断点时立即中断回到Sotf-ICE。而且每一个断点处都可以加上条件,使程序运行到断点并且满足所设定的条件才中断返回Soft-ICE.Sotf-ICE的所有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国银行三明市大田县2025秋招笔试数量关系题专练及答案
- 2025湖北武汉大学中南医院嘉鱼医院急需紧缺专业人才招聘30人模拟试卷及参考答案详解1套
- 2025年济宁市兖州区事业单位公开招聘工作人员(教育类)(9人)模拟试卷及答案详解(全优)
- fk引流课件教学课件
- FA基础知识培训课件
- 文库发布:Excel课件
- 信息化公司业务知识培训课件
- 新学期新征程主题班会说课稿
- epco培训课件教学课件
- 2025年事业单位护理实物题库及答案
- 人教版五年级数学上册第二单元位置达标测试卷(含答案)
- 国企安全环保培训会课件
- 2025年江苏省南京市中考英语真题卷含答案解析
- 物联网水表采购方案投标文件(技术方案)
- 养殖淡水鳜鱼创新创业项目商业计划书
- 炎症与心脑血管疾病
- 2025九省联考试题生物及答案
- UV转印技术简介
- 子宫内膜异位症
- 2025年从亚洲到阿拉伯海湾地区战略投资路径解析报告-易达资本
- 如何上好一节体育课讲座
评论
0/150
提交评论