版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子工程系电子工程系一、预备知识一、预备知识计算机网络技术基础计算机网络技术基础windowswindows网络体系结构网络体系结构 ndisndis规范简介规范简介二、实习内容二、实习内容功能要求功能要求ndisndis协议驱动程序设计协议驱动程序设计数据包的解析数据包的解析三、实习环境与要求三、实习环境与要求一、预备知识一、预备知识计算机网络技术基础计算机网络技术基础windowswindows网络体系结构网络体系结构 ndisndis规范简介规范简介计算机网络技术是计算机技术与通讯技术的结合。计算机网计算机网络技术是计算机技术与通讯技术的结合。计算机网络就是将不同地理位置的多个计算机系统
2、通过一定的通讯设络就是将不同地理位置的多个计算机系统通过一定的通讯设备和通讯线路相互连接,在网络应用软件的支持下实现数据备和通讯线路相互连接,在网络应用软件的支持下实现数据通讯和资源共享的计算机系统。通讯和资源共享的计算机系统。计算机网络通常可以分为两类:局域网和广域网计算机网络通常可以分为两类:局域网和广域网1、计算机网络技术基础、计算机网络技术基础f局域网局域网局域网是一种小范围的专用网络,一般范围不超过几公里。局域网是一种小范围的专用网络,一般范围不超过几公里。计算机需要特殊的计算机需要特殊的i/o接口设备连接到局域网中,这一设备被称为接口设备连接到局域网中,这一设备被称为网络适配器(网
3、络适配器(network adapter)或者网络接口卡()或者网络接口卡(network interface card)。)。应用最为广泛的局域网技术:应用最为广泛的局域网技术: ethernet以太网以太网f局域网局域网70年代由年代由xerox公司联合公司联合dec和和intel提出,后经提出,后经ieee标准化成为国际标准标准化成为国际标准ieee 802.3介质访问控制机制采用介质访问控制机制采用csma/cd(carrier sense multiple access, with collision detection )现代的操作系统均支持以太网协议现代的操作系统均支持以太网协议
4、 f广域网广域网广域网是一种大范围连接大量计算机的网络技术。广域广域网是一种大范围连接大量计算机的网络技术。广域网通讯线路一般都是由电信公司建设。网通讯线路一般都是由电信公司建设。internetinternet是目前最大的全球性广域网是目前最大的全球性广域网osi参考模型正如人们使用双方共同的语言才能进行交流一样,计算机正如人们使用双方共同的语言才能进行交流一样,计算机网络中通信双方也必须采用相同的协议才能进行通信。网络中通信双方也必须采用相同的协议才能进行通信。所谓所谓协议协议,就是当计算机连成网络时,规范它们之间通信,就是当计算机连成网络时,规范它们之间通信和交互作用的规则和技术过程。和
5、交互作用的规则和技术过程。 为了便于处理通信中的层次问题,国际标准化组织为了便于处理通信中的层次问题,国际标准化组织(iso)开发了一个参考模型,称为开放系统互连开发了一个参考模型,称为开放系统互连 (osi,open systems interconnection) 参考模型参考模型 开放一词的含义是:只要遵循开放一词的含义是:只要遵循osi标准,一个系统可以和标准,一个系统可以和位于世界上任何地方的、也遵循位于世界上任何地方的、也遵循osi标准的其他任何系统标准的其他任何系统进行连接。进行连接。在在osi参考模型中,每一层的功能是向上层提供服参考模型中,每一层的功能是向上层提供服务,而对下
6、层的实现进行抽象务,而对下层的实现进行抽象osi参考模型网络传输实际上是通过客户机的每一层往下传,然后在网络传输实际上是通过客户机的每一层往下传,然后在目标机上逐层上传直到相应的一层能够理解并应答客户目标机上逐层上传直到相应的一层能够理解并应答客户机的请求。机的请求。 处理两个网络应用程序之间的信息传输。处理两个网络应用程序之间的信息传输。 负责所传输消息的语法和语义的分析负责所传输消息的语法和语义的分析,处理数据的格式化。处理数据的格式化。 管理相互协作的应用程序之间的连接。管理相互协作的应用程序之间的连接。 从会话层接受数据,传递给网络层,从会话层接受数据,传递给网络层,并确保到达对方的信
7、息正确无误。并确保到达对方的信息正确无误。 负责建立分组头,处理路由,拥塞控制,负责建立分组头,处理路由,拥塞控制,以及网络互连。以及网络互连。 (dll) 发送和接收帧。发送和接收帧。负责传送比特流。负责传送比特流。osi参考模型osi参考模型的数据传输应用层应用层表示层表示层会话层会话层传输层传输层网络层网络层数据链路层数据链路层物理层物理层应用层应用层表示层表示层会话层会话层传输层传输层网络层网络层数据链路层数据链路层物理层物理层进程进程a进程进程b机器机器机器机器实际数据传输路径实际数据传输路径应用协议应用协议表示协议表示协议会话协议会话协议传输协议传输协议网络协议网络协议ah 数据数
8、据ph 数据数据 数据数据sh 数据数据th 数据数据nh 数据数据dh 数据数据 dtbitsosi参考模型是一种理想化的方案,很少系统完全实现了这参考模型是一种理想化的方案,很少系统完全实现了这一模型,然而,一模型,然而,osi参考模型为示范网络的功能结构提供了参考模型为示范网络的功能结构提供了可行的机制。两台机器在相同的层次上,使用同一种语言可行的机制。两台机器在相同的层次上,使用同一种语言(协议)对话。(协议)对话。osi参考模型tcp/ip协议概述 tcp/ip协议是协议是internet的技术基础的技术基础internet是一个广域网,是目前联通世界上绝大多数国是一个广域网,是目前
9、联通世界上绝大多数国家和地区的全球性信息系统。在家和地区的全球性信息系统。在internet上,可以实现上,可以实现低成本、高速率、交互式的信息查询、信息发布、通讯低成本、高速率、交互式的信息查询、信息发布、通讯联络以及协同作业等等现代化的工作、学习和生活。联络以及协同作业等等现代化的工作、学习和生活。osi参考模型 tcp/ip 参考模型 应用层 表示层 会话层 应用层 传输层 传输层 网络层 互联网络层 数据链路层 物理层 网络接口层 tcp/ip协议概述 互联网络层互联网络层 网际协议(网际协议(ip:internet protocol )网际协议是无连接的分组交换协议,承担寻址和路由网
10、际协议是无连接的分组交换协议,承担寻址和路由选择的任务选择的任务地址解析协议(地址解析协议(arp:address resolution protocol)arp协议负责由协议负责由ip地址到硬件地址(地址到硬件地址(mac地址)的转地址)的转换。换。 反向地址解析协议(反向地址解析协议(rarp:reverse address resolution protocol) 与与arp协议相反,协议相反,rarp协议完成由硬件地址到协议完成由硬件地址到ip地地址的转换。址的转换。tcp/ip协议概述 传输层传输层 传输控制协议传输控制协议 ( tcp 面向连接的数据传输面向连接的数据传输) ) t
11、cp负责可靠的面向连接的数据传输负责可靠的面向连接的数据传输用户数据报协议用户数据报协议 ( udp 面向无连接的数据传输面向无连接的数据传输) )负责端到端的数据传输,不需要建立连接负责端到端的数据传输,不需要建立连接tcp/ip协议概述 2、windows网络体系结构网络体系结构 网络网络api 为应用程序提供一种独立为应用程序提供一种独立于协议的方式用于网络通于协议的方式用于网络通信。网络信。网络api通常以用户态通常以用户态动态连接库(动态连接库(dll)的形)的形式提供给用户。式提供给用户。 命名管道(命名管道(named pipenamed pipe)和邮)和邮件槽(件槽(mail
12、slotmailslot) windowswindows套接字(套接字(winsock) netbios netbios 远程过程调用(远程过程调用(rpc) 通用互连网络文件系统(通用互连网络文件系统(cifs) 传输驱动程序接口(传输驱动程序接口(tdi)客户客户 是核心态的驱动程序,通常实现是核心态的驱动程序,通常实现了网络了网络api的核心态部分。的核心态部分。tdi客户根据客户根据windows传输驱动传输驱动程序接口标准格式化程序接口标准格式化i/o请求包请求包(irp),发送至协议驱动程序。),发送至协议驱动程序。tdi传输提供者(传输提供者(tdi transport prov
13、ider)又称为又称为tdi传送器,传送器,ndis协议驱协议驱动程序,以及协议驱动程序,是动程序,以及协议驱动程序,是工作在核心态的协议驱动程序。工作在核心态的协议驱动程序。他们接收从他们接收从tdi客户传来的客户传来的irp,然后处理这些然后处理这些irp中的请求。中的请求。tdi传送器根据不同的协议(例传送器根据不同的协议(例如如tcp,udp,ipx)将协议头)将协议头加入加入irp的数据中。的数据中。协议驱动程序协议驱动程序 网络网络api驱动程序接受驱动程序接受api 请请求,把它们转换为底层网络求,把它们转换为底层网络协议的传输请求。协议的传输请求。 api驱动程序依赖核心态的驱
14、动程序依赖核心态的传输协议驱动程序进行实际传输协议驱动程序进行实际的转换。的转换。 api和下层的网络协议是分和下层的网络协议是分开的,使得整个网络体系结开的,使得整个网络体系结构十分灵活,它允许每个构十分灵活,它允许每个api使用不同的网络协议。使用不同的网络协议。 为适配驱动程序提供了封装,隐为适配驱动程序提供了封装,隐藏了藏了windows2000核心态环境下核心态环境下的具体细节。的具体细节。ndis库为适配驱动库为适配驱动程序提供支持函数,而且也为程序提供支持函数,而且也为tdi传送器的使用提供了函数接传送器的使用提供了函数接口。口。ndis库库网络驱动程序接口规范网络驱动程序接口规
15、范( (ndis)允许协议驱动程序以设备无关允许协议驱动程序以设备无关的方式和网络适配器驱动程序的方式和网络适配器驱动程序通信。通信。遵守遵守ndis的网络适配器驱动程的网络适配器驱动程序被称为序被称为ndis小型端口驱动程小型端口驱动程序。序。ndisndis小型端口驱动程序小型端口驱动程序是工作在核心态的驱动程序,它负是工作在核心态的驱动程序,它负责将责将tdi传送器接入至特定的网络传送器接入至特定的网络适配器。适配器。ndis小型端口驱动程序与网络适小型端口驱动程序与网络适配器通信时使用配器通信时使用ndis库函数,这库函数,这些函数被映射到硬件抽象层(些函数被映射到硬件抽象层(hal)
16、的函数。的函数。网络网络api的例子的例子windows套接字套接字( (winsock) ) 服务器服务器 :socket bindlistenacceptread,recvwrite,sendclosesocket客户客户 :socketconnectwrite,sendread,recvclosesocketwinsock 的实现的实现3、ndis简介简介microsoft网络驱动程序接口规范(网络驱动程序接口规范(ndis)的设计)的设计目的是通过将不同的协议从网络接口卡上拆除,目的是通过将不同的协议从网络接口卡上拆除,使得用户可以访问不同的协议。在设计过程中,使得用户可以访问不同的协
17、议。在设计过程中,协议并不需要了解关于网络卡的任何信息。协议并不需要了解关于网络卡的任何信息。ndis程序库程序库(ndis.sys)提供了一个面向提供了一个面向nic驱动驱动程序的完全抽象的接口,网卡驱动程序与协议层程序的完全抽象的接口,网卡驱动程序与协议层驱动程序及操作系统通过这个接口进行通信。驱动程序及操作系统通过这个接口进行通信。 目前最新的目前最新的ndis是是5.1版本,版本,windows 2k及以后及以后版本的版本的ndis是是5.0。 ndisndis支持三种类型的网络驱动程序:小端口驱动程序,支持三种类型的网络驱动程序:小端口驱动程序,中间驱动程序和协议驱动程序。中间驱动程
18、序和协议驱动程序。ndis简介 ndis小端口驱动程序小端口驱动程序一个一个ndis小端口驱动程序(也称为一个小端口小端口驱动程序(也称为一个小端口nic驱动驱动程序)有两种基本功能:程序)有两种基本功能: 管理一个网络接口卡(管理一个网络接口卡(nic),包括通过),包括通过nic发送和接发送和接收数据收数据 与高级驱动程序接口,例如和中间驱动程序和传输协与高级驱动程序接口,例如和中间驱动程序和传输协议驱动程序。议驱动程序。 ndis库导出了一组函数库导出了一组函数(ndisxxx 函数函数) ,这,这些函数封装了所有的操作系统功能些函数封装了所有的操作系统功能 由小端口驱动程序调用由小端口
19、驱动程序调用 小端口驱动程序必须导出一组函数入口点小端口驱动程序必须导出一组函数入口点 (miniportxxx函数函数). 由由ndis调用调用ndis小端口驱动程序小端口驱动程序 小端口驱动程序与小端口驱动程序与ndis以及高层驱动程序以及高层驱动程序间的交互:间的交互: 发送发送 传输驱动程序调用一个传输驱动程序调用一个ndisxxx 函数函数. ndis通过调用适当的通过调用适当的miniportxxx函数将数据包传函数将数据包传送给小端口驱动程序送给小端口驱动程序. 小端口驱动程序通过调用适当的小端口驱动程序通过调用适当的ndisxxx函数将数函数将数据包转发给据包转发给nic.nd
20、is小端口驱动程序小端口驱动程序 小端口驱动程序与小端口驱动程序与ndis以及高层驱动程以及高层驱动程序间的交互:序间的交互: 接收接收 nic 发出一个硬件中断发出一个硬件中断. ndis调用调用 miniportxxx函数函数 小端口驱动程序从小端口驱动程序从nic 接收数据,然后通过调用接收数据,然后通过调用ndisxxx 函数向绑定的上层驱动程序表明接收的函数向绑定的上层驱动程序表明接收的数据包的存在数据包的存在ndis小端口驱动程序小端口驱动程序ndis中间驱动程序中间驱动程序中间驱动程序是那种典型的处于小端口驱动程序和传中间驱动程序是那种典型的处于小端口驱动程序和传输协议驱动程序之
21、间的驱动程序。由于它处于驱动程输协议驱动程序之间的驱动程序。由于它处于驱动程序层级的中间位置,所以中间驱动程序必须和上面的序层级的中间位置,所以中间驱动程序必须和上面的协议驱动程序和下面的小端口驱动程序都通讯协议驱动程序和下面的小端口驱动程序都通讯 在其下边界,导出协议在其下边界,导出协议入口点入口点 (protocolxxx 函数函数) 在其上边界,导出小端在其上边界,导出小端口入口点口入口点 (miniportxxx函数函数)协议驱动程序协议驱动程序协议驱动程序位于协议驱动程序位于ndis驱动程序的最高层,它通过中驱动程序的最高层,它通过中间驱动程序或直接与小端口驱动程序打交道,并向下间驱
22、动程序或直接与小端口驱动程序打交道,并向下导出一组导出一组protocolxxx函数。函数。通常在实现传输协议栈通常在实现传输协议栈 (例如例如tcp/ip, ipx)的传输驱动的传输驱动程序中作为最低层程序中作为最低层在上边界,协议驱动程序与协议栈中的高层驱动程序在上边界,协议驱动程序与协议栈中的高层驱动程序的接口是私有的的接口是私有的.协议驱动程序通过协议驱动程序通过ndis完成向小端口驱动程序或中间完成向小端口驱动程序或中间驱动程序的绑定,并使用它们收发网络数据包。驱动程序的绑定,并使用它们收发网络数据包。ndis简介ndis驱动程序的应用驱动程序的应用网络安全网络安全网络监测与分析网络
23、监测与分析容错容错二、实习内容二、实习内容功能要求功能要求ndisndis协议驱动程序设计协议驱动程序设计数据包的解析数据包的解析 * *能够从下层(准确的说是数据链路层)把网络能够从下层(准确的说是数据链路层)把网络 上所有的数据包抓下来。上所有的数据包抓下来。 * *有一个上层的应用程序负责解析抓到的数据包。有一个上层的应用程序负责解析抓到的数据包。 * *能够把解析结果显示给用户。能够把解析结果显示给用户。 1. 功能要求功能要求程序结构2、ndis协议驱动程序设计协议驱动程序设计ndisndis协议驱动程序源文件主要包括协议驱动程序源文件主要包括: :packet.cpacket.c为
24、为ndis协议驱动程序的主体,主要实协议驱动程序的主体,主要实现入口函数现入口函数driverentry和部分协议接口函数和部分协议接口函数openclos.copenclos.cread.cread.c - -主要实现功能代码处理函数和部分主要实现功能代码处理函数和部分write.cwrite.c协议接口函数协议接口函数上述代码编译出一个的名为上述代码编译出一个的名为packet.syspacket.sys的驱动程的驱动程序文件序文件驱动程序中要提供的几个主要函数驱动程序中要提供的几个主要函数 1)driverentry这是协议驱动程序的初始化函数,并且必须被命名为这是协议驱动程序的初始化函
25、数,并且必须被命名为driverentry。而其它由协议驱动程序导出的函数则可。而其它由协议驱动程序导出的函数则可以任意起名,因为以任意起名,因为ndis最终得到的只是这些函数的入最终得到的只是这些函数的入口地址。在系统初始化期间会调用口地址。在系统初始化期间会调用driverentry完成协完成协议驱动程序的加载。议驱动程序的加载。在在driverentry中通过调用中通过调用ndisregisterprotocol完成完成协议驱动程序的注册,该函数的第三个参数中填写了协议驱动程序的注册,该函数的第三个参数中填写了所有导出函数的入口地址。如果在所有导出函数的入口地址。如果在driverent
26、ry中申请中申请某种资源失败的话,则需要将先前得到的各种资源释某种资源失败的话,则需要将先前得到的各种资源释放掉并调用放掉并调用ndisderegisterprotocol返回适当的错误返回适当的错误信息。信息。 2)protocolxxx函数:函数:一些可选或者必须存在的函数,在一些可选或者必须存在的函数,在driverentry中进行中进行注册,然后一一实现。注册,然后一一实现。 主要完成下面的一些工作:主要完成下面的一些工作:支持即插即用;支持即插即用;对下层驱动程序和网卡进行绑定;对下层驱动程序和网卡进行绑定;在网络中接收包;在网络中接收包;在接收不完全的情况下传送剩余部分;在接收不完
27、全的情况下传送剩余部分;申请内存;申请内存;3)功能代码处理函数:)功能代码处理函数:这 些 函 数 的 入 口 地 址 被 填 写 在这 些 函 数 的 入 口 地 址 被 填 写 在 d r i v e r o b j e c t 的的majorfunction字段中。其中,每个函数都有一个相应的字段中。其中,每个函数都有一个相应的功能代码,并且与上层应用程序中所使用的功能代码,并且与上层应用程序中所使用的win32 api相相对应。对应。 举例来说,功能代码为举例来说,功能代码为irp_mj_create的注册函数为的注册函数为packetopen,那么当上层应用程序调用,那么当上层应用
28、程序调用createfile时,最时,最终完成相应工作的就是终完成相应工作的就是packetopen函数;而功能代码为函数;而功能代码为i r p _ m j _ d e v i c e _ c o n t r o l 的 注 册 函 数 为的 注 册 函 数 为p a c k e t i o c o n t r o l , 那 么 当 上 层 应 用 程 序 调 用, 那 么 当 上 层 应 用 程 序 调 用deviceiocontrol时,就应由时,就应由packetiocontrol完成上层所指完成上层所指定的任务。定的任务。这是上下层之间的重要接口。这是上下层之间的重要接口。数据包的
29、组织和管理数据包的组织和管理在在ndis中,数据的接收与发送都是以包为单位进行的。一个包中,数据的接收与发送都是以包为单位进行的。一个包由以下几部分组成:由以下几部分组成:一个一个packet descritptor。其所含信息包括整个包所占用的。其所含信息包括整个包所占用的物理页面的数量、包的长度、指向第一个和最后一个物理页面的数量、包的长度、指向第一个和最后一个buffer descriptor的指针以及的指针以及packet pool的句柄等等。的句柄等等。一组一组buffer descriptor。每个。每个buffer descriptor用来描述用来描述一片存储区域,其中包括起始虚
30、拟地址、偏移量、该存储区域一片存储区域,其中包括起始虚拟地址、偏移量、该存储区域的大小以及指向下一个的大小以及指向下一个buffer descriptor的指针等信息。的指针等信息。由由buffer descriptor所描述的虚拟存储区域,该区域可能所描述的虚拟存储区域,该区域可能横跨几个页面。这些页面最终被映射到物理内存中。横跨几个页面。这些页面最终被映射到物理内存中。 ndis协议驱动程序重要功能的实现协议驱动程序重要功能的实现 1) 初始化初始化 driverentry()函数是整个驱动程序的入口,它是在驱动程序被加载函数是整个驱动程序的入口,它是在驱动程序被加载的时候由系统自动执行的
31、。这个函数里面主要是进行一些驱动的时候由系统自动执行的。这个函数里面主要是进行一些驱动程序初始化的操作。程序初始化的操作。主要处理步骤:主要处理步骤:1.在在global结构里面记录函数传入的结构里面记录函数传入的registerpath参数。参数。2.调用调用iocreatedevice为这个驱动程序创建一个为这个驱动程序创建一个deviceobject,记,记录在录在 globals.controldeviceobject里面,这个里面,这个deviceobject是为是为了今后控制这个驱动程序用的。(上层应用可以调用了今后控制这个驱动程序用的。(上层应用可以调用deviceiocontr
32、ol来对驱动程序的一些参数进行设置)来对驱动程序的一些参数进行设置)packet.c driverentry3.为上面所建立的为上面所建立的deviceobject建立建立symbollink。symbollink的作的作用是为了让上层的应用程序可以调用到所建立的用是为了让上层的应用程序可以调用到所建立的deviceobject。(。(由于由于windows的层次关系,上层应用无法直接控制核心态的驱动的层次关系,上层应用无法直接控制核心态的驱动程序,必须通过符号连接实现对核心的调用程序,必须通过符号连接实现对核心的调用 )4.逐一设置逐一设置protocolchar结构中的每一个域。这些域一些
33、是驱动结构中的每一个域。这些域一些是驱动程序所必需的版本号、名字等信息,另外一些是函数指针,它程序所必需的版本号、名字等信息,另外一些是函数指针,它们指定了一些们指定了一些ndis自动执行的函数的入口地址。这里指定的每自动执行的函数的入口地址。这里指定的每一个函数在程序中必须有它的具体实现。其中有些函数指针可一个函数在程序中必须有它的具体实现。其中有些函数指针可以为以为null,表示不指定这个函数。但是,表示不指定这个函数。但是,ndis要求一些函数要求一些函数是必须指定的,它们包括:是必须指定的,它们包括:bindadapterhandler、unbindadapterhandler、ope
34、nadaptercompletehandler 、closeadaptercompletehandler、receivehandler 、receivecompletehandler、transfercompletehandler、sendcompletehandler 、resetcompletehandler 、requestcompletehandler statushandler 、statuscompletehandler 、pnpeventhandler ndis协议驱动程序重要功能的实现协议驱动程序重要功能的实现 1) 初始化初始化 5.调用调用ndisregisterproto
35、col函数注册这个驱动程序,这个函数执行之后函数注册这个驱动程序,这个函数执行之后,这个驱动程序被加入到系统的设备列表中,以后的应用程序可以使,这个驱动程序被加入到系统的设备列表中,以后的应用程序可以使用这个驱动程序了。用这个驱动程序了。6.指定驱动程序的主功能(指定驱动程序的主功能(majorfunction)代码处理函数。)代码处理函数。majorfunction是一个数组,它主要指定在上层应用调用是一个数组,它主要指定在上层应用调用createfile, readfile, writefile, deviceiocontrol和和closehandle等函数的时候,等函数的时候,下层驱动
36、程序怎样处理。本程序主要指定了下层驱动程序怎样处理。本程序主要指定了irp_mj_create、irp_mj_close、irp_mj_read、irp_mj_write、irp_mj_cleanup和和irp_mj_device_control几个函数,其几个函数,其他的函数可以省略。他的函数可以省略。ndis协议驱动程序重要功能的实现协议驱动程序重要功能的实现 1) 初始化初始化 7.指定驱动程序卸载的时候的处理函数指定驱动程序卸载的时候的处理函数driverobject-driverunload = packetunload;8.返回返回9.如果遇到错误,进行错误处理。错误处理的主要内容
37、就是判断错误出如果遇到错误,进行错误处理。错误处理的主要内容就是判断错误出现的位置以及已经分配的资源,对已经分配的资源进行释放。现的位置以及已经分配的资源,对已经分配的资源进行释放。ndis协议驱动程序重要功能的实现协议驱动程序重要功能的实现 2) 绑定绑定 packetbindadapter()函数是驱动程序中必不可少的函数,函数是驱动程序中必不可少的函数,它是操作系统自动调用的函数。在驱动程序加载的时候,它是操作系统自动调用的函数。在驱动程序加载的时候,操作系统自动查找当前机器上安装的网卡驱动程序(操作系统自动查找当前机器上安装的网卡驱动程序(nic driver),并对每一个网卡自动运行
38、这个函数,其目的是),并对每一个网卡自动运行这个函数,其目的是在驱动程序中对每个网卡进行记录,以备以后的使用。因在驱动程序中对每个网卡进行记录,以备以后的使用。因此,这个函数中的主要内容就是实现对网卡的登记注册。此,这个函数中的主要内容就是实现对网卡的登记注册。packet.c packetbindadapter具体实现步骤如下:具体实现步骤如下:1.从从devicename中取得网卡的名字,并分配空间存储起来中取得网卡的名字,并分配空间存储起来2.调用调用iocreatedevice为这个网卡建立一个设备对象(为这个网卡建立一个设备对象(deviceobject)3.创建创建deviceob
39、ject-deviceextention为为open_instance结构,用来记录结构,用来记录这个设备的一切信息。这个设备的一切信息。4.为这个设备对象建立符号联结(为这个设备对象建立符号联结(symbol_link)5.调用调用ndisallocatepacketpool为这个设备分配包缓冲池为这个设备分配包缓冲池6.初始化初始化open_instance结构(结构(open变量)的一些域变量)的一些域7.调用调用ndisopenadapter完成这个设备的初始化工作完成这个设备的初始化工作8.设置设置open_instance结构中的一些域的初值结构中的一些域的初值9.把这个设备加入到
40、把这个设备加入到globals.adapterlist的队列中去的队列中去10. 错误处理错误处理ndis协议驱动程序重要功能的实现协议驱动程序重要功能的实现 2) 绑定绑定 ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 packet.c packetiocontrol实现对驱动程序以及它所绑定的设备的控制。究竟是对驱动程序本实现对驱动程序以及它所绑定的设备的控制。究竟是对驱动程序本身还是对它绑定的设备是由传入的参数身还是对它绑定的设备是由传入的参数deviceobject决定,如果它决定,如果它等于等于global-controldeviceobject,那么它
41、就是对驱动程序的控,那么它就是对驱动程序的控制,否则则是对指定绑定设备的控制。制,否则则是对指定绑定设备的控制。程序开始,首先确定控制类型。由于用户态和核心态程序的信息交程序开始,首先确定控制类型。由于用户态和核心态程序的信息交换是通过换是通过irp来实现的,所以这个功能代码是存放在来实现的,所以这个功能代码是存放在irp的的io堆栈堆栈单元中。(单元中。(irpsp-parameters.deviceiocontrol.iocontrolcode) 该函数主要包含如下处理步骤:该函数主要包含如下处理步骤:1.枚举网络适配器枚举网络适配器2.记录上层应用程序的记录上层应用程序的start按钮是
42、否按下按钮是否按下3.设置缓冲区大小设置缓冲区大小4.重置适配器重置适配器5.实现实现ndis请求。请求。ndis请求包括:请求包括:(1)设置)设置oid(2)查询)查询oidndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 、枚举网络适配器:、枚举网络适配器:这个功能主要是通过这个功能主要是通过packetgetadapterlist函数来实现。这个功能函数来实现。这个功能在在packetiocontrol函数中简单实现了以下几个功能:函数中简单实现了以下几个功能:1.判断设备变量是否为全局控制设备变量判断设备变量是否为全局控制设备变量(global-contro
43、ldeviceobject),如果不是,说明上层调用错误。,如果不是,说明上层调用错误。返回错误信息。返回错误信息。2.调用调用packetgetadapterlist寻找网络适配器列表,放到输寻找网络适配器列表,放到输出缓冲区中。出缓冲区中。irp-associatedirp.systembuffer 3.执行标准语句组完成执行标准语句组完成irpirp-iostatus.status = statusirp-iostatus.information = datalengthiocompleterequest(irp, io_no_increment)ndis协议驱动重要功能的实现协议驱动重
44、要功能的实现 3) i/o控制控制 、记录上层应用程序的、记录上层应用程序的start按钮是否按下:按钮是否按下:这个功能主要通过修改设备结构中的变量这个功能主要通过修改设备结构中的变量start来实现。主要通过来实现。主要通过以下几个步骤:以下几个步骤:1.取设备信息结构变量取设备信息结构变量open = deviceobject-deviceextension; 2.判断判断start域的值,根据要求修改域的值,根据要求修改 3.完成完成irp,返回,返回 ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 、设置缓冲区大小:、设置缓冲区大小:这个功能的实现与这个功
45、能的实现与2类似,主要是通过修改设备结构中的变量类似,主要是通过修改设备结构中的变量bufsize来实现,主要有以下几个步骤:来实现,主要有以下几个步骤: 1.取设备信息结构变量取设备信息结构变量open = deviceobject-deviceextension; 2.取要设置的取要设置的bufsize的值(在的值(在irp-associatedirp.systembuffer中),修改中),修改open-bufsize。 3.完成完成irp,返回,返回 ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 、重置适配器:、重置适配器: 这个功能主要是调用系统函数这个
46、功能主要是调用系统函数ndisreset来实现。不过在此之前,这个函来实现。不过在此之前,这个函数把当前的这个重置请求加入到了数把当前的这个重置请求加入到了resetirplist中,这样做的目的主中,这样做的目的主要是帮助要是帮助packetresetcomplete函数找到函数找到irp 注意,当注意,当ndis执行完执行完reset操作要完成操作要完成irp的时候,它必须知道是哪个的时候,它必须知道是哪个irp要求的要求的reset操作。而操作。而irp是作为参数传到是作为参数传到packetiocontrol函数中的,函数中的,packetresetcomplete无法知道这个无法知道
47、这个irp。这样就需要一个数据结构记。这样就需要一个数据结构记录这个录这个irp,这个数据结构就是,这个数据结构就是resetirplist。在。在packetiocontrol函数函数中,把当前中,把当前irp加入到加入到resetirplist中,然后执行中,然后执行ndisreset后马上返回后马上返回。过了一段时间,。过了一段时间,reset操作完成,操作完成,ndis自动调用自动调用packetresetcomplete函数,从函数,从resetirplist取出这个取出这个irp,执行标准,执行标准语句组语句组 irp-iostatus.information = 0; iocom
48、pleterequest(irp, io_no_increment);完成完成irp。 ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 、重置适配器:、重置适配器: 需要注意的是,需要注意的是,reset操作并不一定总是完不成的,那可能在调用操作并不一定总是完不成的,那可能在调用ndisreset函数的一刹那完成。这时,函数的一刹那完成。这时,ndisreset传出来的状态变量传出来的状态变量status就不再是就不再是ndis_status_pending了。如果出现这种情况,了。如果出现这种情况,ndis将不自动调用将不自动调用packetresetcomple
49、te函数执行后续操作。所以,函数执行后续操作。所以,如果这种情况发生,程序员必须显式的指定驱动程序调用如果这种情况发生,程序员必须显式的指定驱动程序调用packetresetcomplete。 ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 在在reset的操作之前,程序调用了的操作之前,程序调用了iomarkirppending(irp)函数。这个函数。这个函数的作用是什么?函数的作用是什么? 在一个上层应用请求一个系统调用的时候,系统就对驱动程序发送一在一个上层应用请求一个系统调用的时候,系统就对驱动程序发送一个个irp来告诉它上层应用的这个请求,所有的信息就被
50、记录在这来告诉它上层应用的这个请求,所有的信息就被记录在这个个irp中。但是,当这个函数结束返回的时候,系统自动认为这中。但是,当这个函数结束返回的时候,系统自动认为这个个irp已经完成了,并对这个已经完成了,并对这个irp标记完成。事实上,这并不一定标记完成。事实上,这并不一定是真实的,这个是真实的,这个irp很有可能通过以后的函数(如:很有可能通过以后的函数(如:complete类类的函数)完成。这时,在前一个函数返回之前,必须运行的函数)完成。这时,在前一个函数返回之前,必须运行iomarkirppending()函数,标记这个函数,标记这个irp为为pending。这样,当函。这样,当
51、函数返回的时候,系统就不会认为这个数返回的时候,系统就不会认为这个irp已经完成。要等到以后已经完成。要等到以后的函数调用的函数调用iocompleterequest函数的时候,才认为这个函数的时候,才认为这个irp是完是完成了的。这个就是使用这个函数的原因。另外,当一个成了的。这个就是使用这个函数的原因。另外,当一个irp被标被标记为记为pending以后,当前的函数必须返回以后,当前的函数必须返回status_pending以配以配合系统的处理。合系统的处理。 、重置适配器:、重置适配器:ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 、实现、实现ndis请求请
52、求 :ndis请求主要有两类:(请求主要有两类:(1)设置)设置oid、(、(2)查询)查询oid这两个功能主要是通过调用系统函数这两个功能主要是通过调用系统函数ndisrequest实现的,具体步骤实现的,具体步骤如下:如下:(1)从系统缓冲区中取出要进行操作的)从系统缓冲区中取出要进行操作的oid结构结构oiddata=irp-associatedirp.systembuffer(2)分配一个)分配一个prequest变量,用来存储变量,用来存储irp和当前的和当前的request内容内容(oid的内容)的内容)(3)判断)判断oid的数据结构长度是否正确的数据结构长度是否正确(4)判断请
53、求是设置)判断请求是设置oid还是查询还是查询oid,并针对相应的请求进行相,并针对相应的请求进行相应的变量设置应的变量设置(5)调用)调用ndisrequest(6)错误处理)错误处理(7)类似)类似reset请求,如果请求,如果ndisrequest已经完成(已经完成(status不是返回不是返回的的ndis_status_pending),那么驱动程序要显式的调用),那么驱动程序要显式的调用packetrequestcomplete函数完成函数完成irp。 ndis协议驱动重要功能的实现协议驱动重要功能的实现 3) i/o控制控制 设计思路设计思路自然的设计思想是每当上层应用程序请求读取
54、数据时,就为该请求自然的设计思想是每当上层应用程序请求读取数据时,就为该请求生成一个相应的生成一个相应的irp,并将此,并将此irp置于一个读取等待队列之中。当置于一个读取等待队列之中。当nic从网络上接收到数据包时,由从网络上接收到数据包时,由ndis负责调用相应的接收函数。负责调用相应的接收函数。接收函数从读取等待队列的首部取出一个接收函数从读取等待队列的首部取出一个irp,并将从网络上接收,并将从网络上接收到的数据拷贝到由该到的数据拷贝到由该irp所指定的缓冲区中。至此,上层应用程序所指定的缓冲区中。至此,上层应用程序便成功接收到了它所需要的数据。便成功接收到了它所需要的数据。 这种接收
55、方式的天生缺陷就是丢包。如果上层应用程序一直没有读这种接收方式的天生缺陷就是丢包。如果上层应用程序一直没有读取数据的请求,那么取数据的请求,那么nic从网络上接收到的数据就会直接被丢弃。从网络上接收到的数据就会直接被丢弃。 ndis协议驱动重要功能的实现协议驱动重要功能的实现 4) 数据接收数据接收 设计思路设计思路ndis协议驱动重要功能的实现协议驱动重要功能的实现 4) 数据接收数据接收 本程序的设计思路是协议驱动程序负责维护一个接收缓冲区,该缓冲本程序的设计思路是协议驱动程序负责维护一个接收缓冲区,该缓冲区以队列的形式组织。当区以队列的形式组织。当nic通知通知ndis已从网络上接收到数
56、据包时,已从网络上接收到数据包时,可以先将这些数据缓存起来。当上层应用程序需要读取数据时,该读可以先将这些数据缓存起来。当上层应用程序需要读取数据时,该读操作的数据源不是直接从网络得到,而是经过有效管理的存放着数据操作的数据源不是直接从网络得到,而是经过有效管理的存放着数据的缓冲区。这样,丢包的问题便得以解决。的缓冲区。这样,丢包的问题便得以解决。当然,如果上层应用程序还是一直没有读取数据的请求,或者上层应当然,如果上层应用程序还是一直没有读取数据的请求,或者上层应用程序处理数据的速度低于用程序处理数据的速度低于nic从网络上接收数据的速度,再或者网从网络上接收数据的速度,再或者网络出现峰值流
57、量时,缓冲区自然会逐渐被填满,最终还是会出现丢包络出现峰值流量时,缓冲区自然会逐渐被填满,最终还是会出现丢包的情况。但是在正常情况下,这种增设缓冲的方法已经足以避免丢包的情况。但是在正常情况下,这种增设缓冲的方法已经足以避免丢包情况的发生了。情况的发生了。ndis协议驱动重要功能的实现协议驱动重要功能的实现 4) 数据接收数据接收 当当nic从网络上接收到数据并通知从网络上接收到数据并通知ndis时,作为已时,作为已经在经在protocolchar结构中注册过的函数,结构中注册过的函数,ndis将调将调用用packetreceiveindicate或或packetreceivepacket二者
58、二者之一作为接收处理函数将之一作为接收处理函数将nic从网络上接收到的数从网络上接收到的数据缓存起来。其中,据缓存起来。其中,packetreceiveindicate作为协议作为协议驱动程序的驱动程序的protocolreceive函数是必须要提供的,函数是必须要提供的,而而packetreceivepacket作为协议驱动程序的作为协议驱动程序的protocolreceivepacket函数提供与否是可选的。二者函数提供与否是可选的。二者的主要区别在于当的主要区别在于当nic支持一次接收多个数据包时支持一次接收多个数据包时使用使用protocolreceivepacket更富效率。更富效率
59、。 read.c、数据包的解析、数据包的解析上层应用程序上层应用程序这部分主要实现的是把从下层读到的包加以解析,这部分主要实现的是把从下层读到的包加以解析,并把结果显示出来的工作。并把结果显示出来的工作。testapp.c:上层的骨干程序。包含了:上层的骨干程序。包含了winmain入入口,实现了整个用户窗口的大体结构,消息循环口,实现了整个用户窗口的大体结构,消息循环以及和一些和下层的接口。以及和一些和下层的接口。packet32.c:实现了在:实现了在testapp.c中用到的一些函中用到的一些函数。数。childwin.c:实现了一个子窗口,该子窗口用于显:实现了一个子窗口,该子窗口用于
60、显示解析结果。示解析结果。analyze.c:一个专门用于解析的函数,实现了包:一个专门用于解析的函数,实现了包的定界,种类分析以及一些重要特征(如的定界,种类分析以及一些重要特征(如ip地址,地址,包的长度)的解析。包的长度)的解析。数据包的解析数据包的解析上层应用程序上层应用程序接口驱动程序上下层之间的接口实际上就是主功能代码。程序里驱动程序上下层之间的接口实际上就是主功能代码。程序里主要用到了五个主功能代码,分别是主要用到了五个主功能代码,分别是irp_mj_create,irp_mj_close,irp_mj_read,irp_mj_write,irp_mj_device_contro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理技术操作培训:导尿管护理
- 基于云计算的搬运机器人管理平台开发
- 旅游公司导游部经理培训要点
- 2026海南卫星海洋应用研究院有限公司招聘7人备考题库一套附答案详解
- 2026贵州贵阳观山湖中学招聘中小学教师备考题库带答案详解(黄金题型)
- 2026广西百色市右江区城东社区卫生服务中心招聘公益性岗位2人备考题库(真题汇编)附答案详解
- 2026西安银行总行科技部、数据管理部相关岗位招聘备考题库附完整答案详解【各地真题】
- 2026海南海口市美兰区校园招聘教师45人备考题库(一)附参考答案详解【达标题】
- 2026中国农业科学院油料作物研究所油料基因工程与转基因安全评价创新团队科研助理招聘1人备考题库(培优a卷)附答案详解
- 2026四川成都市龙泉驿区东山国际小学教师招聘12人备考题库及参考答案详解(黄金题型)
- CQI-17Solder钎焊系统评估(中文版)
- AQ 1071-2009 煤矿用非金属瓦斯输送管材安全技术要求(正式版)
- 电子行业专题报告:先进封装专题八CoWoS-L-下一代大尺寸高集成封装方案
- 著作权授权书模板
- 《景阳冈》-部编版语文五年级下册
- 学校文印室外包服务 投标方案(技术方案)
- 综合实践活动(4年级下册)第4课时 换季衣物巧收纳-课件
- GB/T 42903-2023金属材料蠕变裂纹及蠕变-疲劳裂纹扩展速率测定方法
- 幼儿园优质公开课:中班健康《健康精灵》课件
- 肾囊肿围手术期护理查房
- GB/T 43091-2023粉末抗压强度测试方法
评论
0/150
提交评论