NIDS驱动设计

上传人:s9****2 文档编号:570120502 上传时间:2024-08-02 格式:PPT 页数:89 大小:1.37MB
返回 下载 相关 举报
NIDS驱动设计_第1页
第1页 / 共89页
NIDS驱动设计_第2页
第2页 / 共89页
NIDS驱动设计_第3页
第3页 / 共89页
NIDS驱动设计_第4页
第4页 / 共89页
NIDS驱动设计_第5页
第5页 / 共89页
点击查看更多>>
资源描述

《NIDS驱动设计》由会员分享,可在线阅读,更多相关《NIDS驱动设计(89页珍藏版)》请在金锄头文库上搜索。

1、NIDS驱动设计驱动设计NDIS协议驱动程序设计一、预备知识一、预备知识计算机网络技术基础计算机网络技术基础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参考模型的数据传输应用层应用层表示层表示层会话层会话层传输层传输层网络层网络层数据链路层数据链路层物理层物理层应用层应用层表示层表示层会话层会话层传输层传输层网络层网络层数据链路

8、层数据链路层物理层物理层进程进程A进程进程B机器机器机器机器实际数据传输路径实际数据传输路径应用协议应用协议表示协议表示协议会话协议会话协议传输协议传输协议网络协议网络协议AH 数据数据PH 数据数据 数据数据SH 数据数据TH 数据数据NH 数据数据DH 数据数据 DTBitsOSI参考模型是一种理想化的方案,很少系统完全实现了这参考模型是一种理想化的方案,很少系统完全实现了这一模型,然而,一模型,然而,OSI参考模型为示范网络的功能结构提供了参考模型为示范网络的功能结构提供了可行的机制。两台机器在相同的层次上,使用同一种语言可行的机制。两台机器在相同的层次上,使用同一种语言(协议)对话。(

9、协议)对话。OSI参考模型TCP/IP协议概述 TCP/IP协议是协议是Internet的技术基础的技术基础Internet是是一一个个广广域域网网,是是目目前前联联通通世世界界上上绝绝大大多多数数国国家家和和地地区区的的全全球球性性信信息息系系统统。在在Internet上上,可可以以实实现现低低成成本本、高高速速率率、交交互互式式的的信信息息查查询询、信信息息发发布布、通通讯讯联络以及协同作业等等现代化的工作、学习和生活。联络以及协同作业等等现代化的工作、学习和生活。TCP/IP协议概述 互联网络层互联网络层 网际协议(网际协议(IP:Internet Protocol )网际协议是无连接的

10、分组交换协议,承担寻址和路由网际协议是无连接的分组交换协议,承担寻址和路由选择的任务选择的任务地址解析协议(地址解析协议(ARP:Address Resolution Protocol)ARP协议负责由协议负责由IP地址到硬件地址(地址到硬件地址(MAC地址)的转地址)的转换。换。 反向地址解析协议(反向地址解析协议(RARP:Reverse Address Resolution Protocol) 与与ARP协议相反,协议相反,RARP协议完成由硬件地址到协议完成由硬件地址到IP地地址的转换。址的转换。TCP/IP协议概述 传输层传输层 传输控制协议传输控制协议 ( TCP 面向连接的数据传

11、输面向连接的数据传输) ) TCP负责可靠的面向连接的数据传输负责可靠的面向连接的数据传输用户数据报协议用户数据报协议 ( UDP 面向无连接的数据传输面向无连接的数据传输) )负责端到端的数据传输,不需要建立连接负责端到端的数据传输,不需要建立连接TCP/IP协议概述 2、Windows网络体系结构网络体系结构 网络网络API 为为应应用用程程序序提提供供一一种种独独立立于于协协议议的的方方式式用用于于网网络络通通信信。网网络络API通通常常以以用用户户态态动动态态连连接接库库(DLL)的的形形式提供给用户。式提供给用户。命名管道(命名管道(Named PipeNamed Pipe)和邮和邮

12、件槽(件槽(MailslotMailslot)WindowsWindows套接字(套接字(WinSock)NetBIOS NetBIOS 远程过程调用(远程过程调用(RPC) 通用互连网络文件系统通用互连网络文件系统(CIFS) 传输驱动程序接口(传输驱动程序接口(TDI)客户客户 是是核核心心态态的的驱驱动动程程序序,通通常常实实现现了网络了网络API的核心态部分。的核心态部分。TDI客客户户根根据据Windows传传输输驱驱动动程程序序接接口口标标准准格格式式化化I/O请请求求包包(IRP),发送至协议驱动程序。),发送至协议驱动程序。TDI传输提供者(传输提供者(TDI transpor

13、t Provider)又称为又称为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.NDIS小端口驱动程序小端口驱动程序小

20、端口驱动程序与小端口驱动程序与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为为NDIS协议驱动程序的主体,主要实协议驱动程序的主体

24、,主要实现入口函数现入口函数DriverEntry和部分协议接口函数和部分协议接口函数openclos.copenclos.cread.cread.c - -主要实现主要实现功能代码处理函数和功能代码处理函数和部分部分write.cwrite.c协议接口函数协议接口函数上述代码编译出一个的名为上述代码编译出一个的名为packet.syspacket.sys的驱动程的驱动程序文件序文件驱动程序中要提供的几个主要函数驱动程序中要提供的几个主要函数 1)DriverEntry这这是是协协议议驱驱动动程程序序的的初初始始化化函函数数,并并且且必必须须被被命命名名为为DriverEntry。而而其其它它

25、由由协协议议驱驱动动程程序序导导出出的的函函数数则则可可以以任任意意起起名名,因因为为NDIS最最终终得得到到的的只只是是这这些些函函数数的的入入口口地地址址。在在系系统统初初始始化化期期间间会会调调用用DriverEntry完完成成协协议驱动程序的加载。议驱动程序的加载。在在DriverEntry中中通通过过调调用用NdisRegisterProtocol完完成成协协议议驱驱动动程程序序的的注注册册,该该函函数数的的第第三三个个参参数数中中填填写写了了所所有有导导出出函函数数的的入入口口地地址址。如如果果在在DriverEntry中中申申请请某某种种资资源源失失败败的的话话,则则需需要要将将

26、先先前前得得到到的的各各种种资资源源释释放放掉掉并并调调用用NdisDeregisterProtocol返返回回适适当当的的错错误误信息。信息。 2)ProtocolXxx函数:函数:一些可选或者必须存在的函数,在一些可选或者必须存在的函数,在DriverEntry中进行中进行注册,然后一一实现。注册,然后一一实现。 主要完成下面的一些工作:主要完成下面的一些工作:支持即插即用;支持即插即用;对下层驱动程序和网卡进行绑定;对下层驱动程序和网卡进行绑定;在网络中接收包;在网络中接收包;在接收不完全的情况下传送剩余部分;在接收不完全的情况下传送剩余部分;申请内存;申请内存;3)功能代码处理函数:)

27、功能代码处理函数:这这 些些 函函 数数 的的 入入 口口 地地 址址 被被 填填 写写 在在 DriverObject的的MajorFunction字字段段中中。其其中中,每每个个函函数数都都有有一一个个相相应应的的功功能能代代码码,并并且且与与上上层层应应用用程程序序中中所所使使用用的的Win32 API相相对应。对应。 举举例例来来说说,功功能能代代码码为为IRP_MJ_CREATE的的注注册册函函数数为为PacketOpen,那那么么当当上上层层应应用用程程序序调调用用CreateFile时时,最最终终完完成成相相应应工工作作的的就就是是PacketOpen函函数数;而而功功能能代代码

28、码为为IRP_MJ_DEVICE_CONTROL的的注注册册函函数数为为PacketIoControl, 那那 么么 当当 上上 层层 应应 用用 程程 序序 调调 用用DeviceIoControl时时,就就应应由由PacketIoControl完完成成上上层层所所指指定的任务。定的任务。这是上下层之间的重要接口。这是上下层之间的重要接口。数据包的组织和管理数据包的组织和管理在在NDIS中中,数数据据的的接接收收与与发发送送都都是是以以包包为为单单位位进进行行的的。一一个个包包由以下几部分组成:由以下几部分组成:一一个个packet descritptor。其其所所含含信信息息包包括括整整个

29、个包包所所占占用用的的物物理理页页面面的的数数量量、包包的的长长度度、指指向向第第一一个个和和最最后后一一个个buffer descriptor的指针以及的指针以及packet pool的句柄等等。的句柄等等。一一组组buffer descriptor。每每个个buffer descriptor用用来来描描述述一一片片存存储储区区域域,其其中中包包括括起起始始虚虚拟拟地地址址、偏偏移移量量、该该存存储储区区域域的大小以及指向下一个的大小以及指向下一个buffer descriptor的指针等信息。的指针等信息。由由buffer descriptor所所描描述述的的虚虚拟拟存存储储区区域域,该该

30、区区域域可可能能横跨几个页面。这些页面最终被映射到物理内存中。横跨几个页面。这些页面最终被映射到物理内存中。 NDIS协议驱动程序重要功能的实现协议驱动程序重要功能的实现 1) 初始化初始化 DriverEntry()函数是整个驱动程序的入口,它是在驱动程序被加载函数是整个驱动程序的入口,它是在驱动程序被加载的时候由系统自动执行的。这个函数里面主要是进行一些驱动的时候由系统自动执行的。这个函数里面主要是进行一些驱动程序初始化的操作。程序初始化的操作。主要处理步骤:主要处理步骤:1.在在Global结构里面记录函数传入的结构里面记录函数传入的RegisterPath参数。参数。2.调用调用IoC

31、reateDevice为这个驱动程序创建一个为这个驱动程序创建一个DeviceObject,记,记录在录在 Globals.ControlDeviceObject里面,这个里面,这个DeviceObject是为是为了今后控制这个驱动程序用的。(上层应用可以调用了今后控制这个驱动程序用的。(上层应用可以调用DeviceIoControl来对驱动程序的一些参数进行设置)来对驱动程序的一些参数进行设置)packet.c DriverEntry3.为上面所建立的为上面所建立的DeviceObject建立建立SymbolLink。SymbolLink的作的作用是为了让上层的应用程序可以调用到所建立的用是

32、为了让上层的应用程序可以调用到所建立的DeviceObject。(由于(由于Windows的层次关系,上层应用无法直接控制核心态的驱的层次关系,上层应用无法直接控制核心态的驱动程序,必须通过符号连接实现对核心的调用动程序,必须通过符号连接实现对核心的调用 )4.逐一设置逐一设置protocolChar结构中的每一个域。这些域一些是驱动结构中的每一个域。这些域一些是驱动程序所必需的版本号、名字等信息,另外一些是函数指针,它程序所必需的版本号、名字等信息,另外一些是函数指针,它们指定了一些们指定了一些NDIS自动执行的函数的入口地址。这里指定的每自动执行的函数的入口地址。这里指定的每一个函数在程序

33、中必须有它的具体实现。其中有些函数指针可一个函数在程序中必须有它的具体实现。其中有些函数指针可以为以为NULL,表示不指定这个函数。但是,表示不指定这个函数。但是,NDIS要求一些函数要求一些函数是必须指定的,它们包括:是必须指定的,它们包括:BindAdapterHandler、UnbindAdapterHandler、OpenAdapterCompleteHandler 、CloseAdapterCompleteHandler、ReceiveHandler 、ReceiveCompleteHandler、TransferCompleteHandler、SendCompleteHandler

34、 、ResetCompleteHandler 、RequestCompleteHandler StatusHandler 、StatusCompleteHandler 、PnPEventHandler NDIS协议驱动程序重要功能的实现协议驱动程序重要功能的实现 1) 初始化初始化 5.调调用用NdisRegisterProtocol函函数数注注册册这这个个驱驱动动程程序序,这这个个函函数数执执行行之之后后,这这个个驱驱动动程程序序被被加加入入到到系系统统的的设设备备列列表表中中,以以后后的的应应用用程程序序可可以以使使用用这个驱动程序了。这个驱动程序了。6.指指 定定 驱驱 动动 程程 序序

35、 的的 主主 功功 能能 ( MajorFunction) 代代 码码 处处 理理 函函 数数 。MajorFunction是是一一个个数数组组,它它主主要要指指定定在在上上层层应应用用调调用用CreateFile, ReadFile, WriteFile, DeviceIoControl和和CloseHandle等等函函数数的的时时候候,下下层层驱驱动动程程序序怎怎样样处处理理。本本程程序序主主要要指指定定了了IRP_MJ_CREATE、IRP_MJ_CLOSE、IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLEANUP和和IRP_MJ_DEVICE_CONTROL几几个

36、个函函数数,其其他的函数可以省略。他的函数可以省略。NDIS协议驱动程序重要功能的实现协议驱动程序重要功能的实现 1) 初始化初始化 7.指定驱动程序卸载的时候的处理函数指定驱动程序卸载的时候的处理函数DriverObject-DriverUnload = PacketUnload;8.返回返回9.如果遇到错误,进行错误处理。错误处理的主要内容就是判断错误出如果遇到错误,进行错误处理。错误处理的主要内容就是判断错误出现的位置以及已经分配的资源,对已经分配的资源进行释放。现的位置以及已经分配的资源,对已经分配的资源进行释放。NDIS协议驱动程序重要功能的实现协议驱动程序重要功能的实现 2) 绑定

37、绑定 PacketBindAdapter()函数是驱动程序中必不可少的函数,函数是驱动程序中必不可少的函数,它是操作系统自动调用的函数。在驱动程序加载的时候,它是操作系统自动调用的函数。在驱动程序加载的时候,操作系统自动查找当前机器上安装的网卡驱动程序(操作系统自动查找当前机器上安装的网卡驱动程序(NIC Driver),并对每一个网卡自动运行这个函数,其目的是),并对每一个网卡自动运行这个函数,其目的是在驱动程序中对每个网卡进行记录,以备以后的使用。因在驱动程序中对每个网卡进行记录,以备以后的使用。因此,这个函数中的主要内容就是实现对网卡的登记注册。此,这个函数中的主要内容就是实现对网卡的登

38、记注册。packet.c PacketBindAdapter具体实现步骤如下:具体实现步骤如下:1.从从DeviceName中取得网卡的名字,并分配空间存储起来中取得网卡的名字,并分配空间存储起来2.调用调用IoCreateDevice为这个网卡建立一个设备对象(为这个网卡建立一个设备对象(DeviceObject)3.创建创建deviceobject-deviceExtention为为Open_Instance结构,用来记录结构,用来记录这个设备的一切信息。这个设备的一切信息。4.为这个设备对象建立符号联结(为这个设备对象建立符号联结(Symbol_Link)5.调用调用NdisAlloca

39、tePacketPool为这个设备分配包缓冲池为这个设备分配包缓冲池6.初始化初始化Open_Instance结构(结构(open变量)的一些域变量)的一些域7.调用调用NdisOpenAdapter完成这个设备的初始化工作完成这个设备的初始化工作8.设置设置Open_Instance结构中的一些域的初值结构中的一些域的初值9.把这个设备加入到把这个设备加入到Globals.AdapterList的队列中去的队列中去10.错误处理错误处理NDIS协议驱动程序重要功能的实现协议驱动程序重要功能的实现 2) 绑定绑定 NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 pa

40、cket.c PacketIoControl实现对驱动程序以及它所绑定的设备的控制。究竟是对驱动程序本实现对驱动程序以及它所绑定的设备的控制。究竟是对驱动程序本身还是对它绑定的设备是由传入的参数身还是对它绑定的设备是由传入的参数DeviceObject决定,如果它决定,如果它等于等于Global-ControlDeviceObject,那么它就是对驱动程序的控制,那么它就是对驱动程序的控制,否则则是对指定绑定设备的控制。否则则是对指定绑定设备的控制。程序开始,首先确定控制类型。由于用户态和核心态程序的信息交程序开始,首先确定控制类型。由于用户态和核心态程序的信息交换是通过换是通过IRP来实现的

41、,所以这个功能代码是存放在来实现的,所以这个功能代码是存放在IRP的的IO堆栈堆栈单元中。(单元中。(irpSp-Parameters.DeviceIoControl.IoControlCode) 该函数主要包含如下处理步骤:该函数主要包含如下处理步骤:1.枚举网络适配器枚举网络适配器2.记录上层应用程序的记录上层应用程序的Start按钮是否按下按钮是否按下3.设置缓冲区大小设置缓冲区大小4.重置适配器重置适配器5.实现实现NDIS请求。请求。NDIS请求包括:请求包括:(1)设置)设置OID(2)查询)查询OIDNDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 、枚

42、举网络适配器:、枚举网络适配器:这个功能主要是通过这个功能主要是通过PacketGetAdapterList函数来实现。这个功能函数来实现。这个功能在在PacketIoControl函数中简单实现了以下几个功能:函数中简单实现了以下几个功能:1.判断设备变量是否为全局控制设备变量判断设备变量是否为全局控制设备变量(Global-ControlDeviceObject),如果不是,说明上层调用错误。,如果不是,说明上层调用错误。返回错误信息。返回错误信息。2.调用调用PacketGetAdapterList寻找网络适配器列表,放到输寻找网络适配器列表,放到输出缓冲区中。出缓冲区中。Irp-Ass

43、ociatedIrp.SystemBuffer 3.执行标准语句组完成执行标准语句组完成IRPIrp-IoStatus.Status = statusIrp-IoStatus.Information = dataLengthIoCompleteRequest(Irp, IO_NO_INCREMENT)NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 、记录上层应用程序的、记录上层应用程序的Start按钮是否按下:按钮是否按下:这个功能主要通过修改设备结构中的变量这个功能主要通过修改设备结构中的变量Start来实现。主要通过来实现。主要通过以下几个步骤:以下几个步骤:1

44、.取设备信息结构变量取设备信息结构变量open = DeviceObject-DeviceExtension; 2.判断判断Start域的值,根据要求修改域的值,根据要求修改 3.完成完成IRP,返回,返回 NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 、设置缓冲区大小:、设置缓冲区大小:这个功能的实现与这个功能的实现与2类似,主要是通过修改设备结构中的变量类似,主要是通过修改设备结构中的变量bufsize来实现,主要有以下几个步骤:来实现,主要有以下几个步骤: 1.取设备信息结构变量取设备信息结构变量open = DeviceObject-DeviceExten

45、sion; 2.取要设置的取要设置的bufsize的值(在的值(在Irp-AssociatedIrp.SystemBuffer中),修改中),修改open-bufsize。 3.完成完成IRP,返回,返回 NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 、重置适配器:、重置适配器: 这个功能主要是调用系统函数这个功能主要是调用系统函数NdisReset来实现。不过在此之前,这个函数来实现。不过在此之前,这个函数把当前的这个重置请求加入到了把当前的这个重置请求加入到了ResetIrpList中,这样做的目的主要是中,这样做的目的主要是帮助帮助PacketResetCo

46、mplete函数找到函数找到IRP 注意,当注意,当NDIS执行完执行完Reset操作要完成操作要完成IRP的时候,它必须知道是哪个的时候,它必须知道是哪个IRP要求的要求的Reset操作。而操作。而IRP是作为参数传到是作为参数传到PacketIoControl函数中的,函数中的,PacketResetComplete无法知道这个无法知道这个IRP。这样就需要一个数据结构记。这样就需要一个数据结构记录这个录这个IRP,这个数据结构就是,这个数据结构就是ResetIrpList。在。在PacketIoControl函数函数中,把当前中,把当前IRP加入到加入到ResetIrpList中,然后执

47、行中,然后执行NdisReset后马上返回。后马上返回。过了一段时间,过了一段时间,Reset操作完成,操作完成,NDIS自动调用自动调用PacketResetComplete函数,从函数,从ResetIrpList取出这个取出这个IRP,执行标准语句组,执行标准语句组 irp-IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT);完成完成IRP。 NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 、重置适配器:、重置适配器: 需要注意的是,需要注意的是,Reset操作并不一定总是完不成的,

48、那可能在调用操作并不一定总是完不成的,那可能在调用NdisReset函数的一刹那完成。这时,函数的一刹那完成。这时,NdisReset传出来的状态变量传出来的状态变量status就不再是就不再是NDIS_STATUS_PENDING了。如果出现这种情况,了。如果出现这种情况,NDIS将不自动调用将不自动调用PacketResetComplete函数执行后续操作。所以,函数执行后续操作。所以,如果这种情况发生,程序员必须显式的指定驱动程序调用如果这种情况发生,程序员必须显式的指定驱动程序调用PacketResetComplete。 NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/

49、O控制控制 在在Reset的操作之前,程序调用了的操作之前,程序调用了IoMarkIrpPending(Irp)函数。这个函数。这个函数的作用是什么?函数的作用是什么? 在一个上层应用请求一个系统调用的时候,系统就对驱动程序发送一在一个上层应用请求一个系统调用的时候,系统就对驱动程序发送一个个IRP来告诉它上层应用的这个请求,所有的信息就被记录在这来告诉它上层应用的这个请求,所有的信息就被记录在这个个IRP中。但是,当这个函数结束返回的时候,系统自动认为这中。但是,当这个函数结束返回的时候,系统自动认为这个个IRP已经完成了,并对这个已经完成了,并对这个IRP标记完成。事实上,这并不一定标记完

50、成。事实上,这并不一定是真实的,这个是真实的,这个IRP很有可能通过以后的函数(如:很有可能通过以后的函数(如:Complete类类的函数)完成。这时,在前一个函数返回之前,必须运行的函数)完成。这时,在前一个函数返回之前,必须运行IoMarkIrpPending()函数,标记这个函数,标记这个IRP为为Pending。这样,当函数返回的时候,系。这样,当函数返回的时候,系统就不会认为这个统就不会认为这个IRP已经完成。要等到以后的函数调用已经完成。要等到以后的函数调用IoCompleteRequest函数的时候,才认为这个函数的时候,才认为这个IRP是完成了的。这是完成了的。这个就是使用这个

51、函数的原因。另外,当一个个就是使用这个函数的原因。另外,当一个IRP被标记为被标记为Pending以后,当前的函数必须返回以后,当前的函数必须返回STATUS_PENDING以配合系统的处以配合系统的处理。理。 、重置适配器:、重置适配器:NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 、实现、实现NDIS请求请求 :NDIS请求主要有两类:(请求主要有两类:(1)设置)设置OID、(、(2)查询)查询OID这两个功能主要是通过调用系统函数这两个功能主要是通过调用系统函数NdisRequest实现的,具体步骤实现的,具体步骤如下:如下:(1)从系统缓冲区中取出要进行

52、操作的)从系统缓冲区中取出要进行操作的OID结构结构OidData=Irp-AssociatedIrp.SystemBuffer(2)分配一个)分配一个pRequest变量,用来存储变量,用来存储IRP和当前的和当前的Request内容内容(OID的内容)的内容)(3)判断)判断OID的数据结构长度是否正确的数据结构长度是否正确(4)判断请求是设置)判断请求是设置OID还是查询还是查询OID,并针对相应的请求进行相,并针对相应的请求进行相应的变量设置应的变量设置(5)调用)调用NdisRequest(6)错误处理)错误处理(7)类似)类似Reset请求,如果请求,如果NdisRequest已经

53、完成(已经完成(status不是返回不是返回的的NDIS_STATUS_PENDING),那么驱动程序要显式的调用),那么驱动程序要显式的调用PacketRequestComplete函数完成函数完成IRP。 NDIS协议驱动重要功能的实现协议驱动重要功能的实现 3) I/O控制控制 设计思路设计思路自然的设计思想是每当上层应用程序请求读取数据时,就为该请求自然的设计思想是每当上层应用程序请求读取数据时,就为该请求生成一个相应的生成一个相应的IRP,并将此,并将此IRP置于一个读取等待队列之中。当置于一个读取等待队列之中。当NIC从网络上接收到数据包时,由从网络上接收到数据包时,由NDIS负责

54、调用相应的接收函数。负责调用相应的接收函数。接收函数从读取等待队列的首部取出一个接收函数从读取等待队列的首部取出一个IRP,并将从网络上接收,并将从网络上接收到的数据拷贝到由该到的数据拷贝到由该IRP所指定的缓冲区中。至此,上层应用程序所指定的缓冲区中。至此,上层应用程序便成功接收到了它所需要的数据。便成功接收到了它所需要的数据。 这种接收方式的天生缺陷就是丢包。如果上层应用程序一直没有读这种接收方式的天生缺陷就是丢包。如果上层应用程序一直没有读取数据的请求,那么取数据的请求,那么NIC从网络上接收到的数据就会直接被丢弃。从网络上接收到的数据就会直接被丢弃。 NDIS协议驱动重要功能的实现协议

55、驱动重要功能的实现 4) 数据接收数据接收 设计思路设计思路NDIS协议驱动重要功能的实现协议驱动重要功能的实现 4) 数据接收数据接收 本程序的设计思路是协议驱动程序负责维护一个接收缓冲区,该缓冲本程序的设计思路是协议驱动程序负责维护一个接收缓冲区,该缓冲区以队列的形式组织。当区以队列的形式组织。当NIC通知通知NDIS已从网络上接收到数据包时,已从网络上接收到数据包时,可以先将这些数据缓存起来。当上层应用程序需要读取数据时,该读可以先将这些数据缓存起来。当上层应用程序需要读取数据时,该读操作的数据源不是直接从网络得到,而是经过有效管理的存放着数据操作的数据源不是直接从网络得到,而是经过有效

56、管理的存放着数据的缓冲区。这样,丢包的问题便得以解决。的缓冲区。这样,丢包的问题便得以解决。当然,如果上层应用程序还是一直没有读取数据的请求,或者上层应当然,如果上层应用程序还是一直没有读取数据的请求,或者上层应用程序处理数据的速度低于用程序处理数据的速度低于NIC从网络上接收数据的速度,再或者网从网络上接收数据的速度,再或者网络出现峰值流量时,缓冲区自然会逐渐被填满,最终还是会出现丢包络出现峰值流量时,缓冲区自然会逐渐被填满,最终还是会出现丢包的情况。但是在正常情况下,这种增设缓冲的方法已经足以避免丢包的情况。但是在正常情况下,这种增设缓冲的方法已经足以避免丢包情况的发生了。情况的发生了。N

57、DIS协议驱动重要功能的实现协议驱动重要功能的实现 4) 数据接收数据接收 当当NIC从网络上接收到数据并通知从网络上接收到数据并通知NDIS时,作为已时,作为已经在经在protocolChar结构中注册过的函数,结构中注册过的函数,NDIS将调将调用用PacketReceiveIndicate或或PacketReceivePacket二者二者之一作为接收处理函数将之一作为接收处理函数将NIC从网络上接收到的数据从网络上接收到的数据缓存起来。其中,缓存起来。其中,PacketReceiveIndicate作为协议驱作为协议驱动程序的动程序的ProtocolReceive函数是必须要提供的,而函

58、数是必须要提供的,而PacketReceivePacket作为协议驱动程序的作为协议驱动程序的ProtocolReceivePacket函数提供与否是可选的。二者函数提供与否是可选的。二者的主要区别在于当的主要区别在于当NIC支持一次接收多个数据包时使支持一次接收多个数据包时使用用ProtocolReceivePacket更富效率。更富效率。 read.c、数据包的解析、数据包的解析上层应用程序上层应用程序这部分主要实现的是把从下层读到的包加以解析,这部分主要实现的是把从下层读到的包加以解析,并把结果显示出来的工作。并把结果显示出来的工作。 Testapp.c:上层的骨干程序。包含了:上层的骨

59、干程序。包含了winmain入入口,实现了整个用户窗口的大体结构,消息循环口,实现了整个用户窗口的大体结构,消息循环以及和一些和下层的接口。以及和一些和下层的接口。Packet32.c:实现了在:实现了在testapp.c中用到的一些函中用到的一些函数。数。Childwin.c:实现了一个子窗口,该子窗口用于显:实现了一个子窗口,该子窗口用于显示解析结果。示解析结果。Analyze.c:一个专门用于解析的函数,实现了包:一个专门用于解析的函数,实现了包的定界,种类分析以及一些重要特征(如的定界,种类分析以及一些重要特征(如ip地址,地址,包的长度)的解析。包的长度)的解析。数据包的解析数据包的

60、解析上层应用程序上层应用程序接口驱驱动动程程序序上上下下层层之之间间的的接接口口实实际际上上就就是是主主功功能能代代码码。程程序序里里主主要要用用到到了了五五个个主主功功能能代代码码,分分别别是是IRP_MJ_CREATE,IRP_MJ_CLOSE,IRP_MJ_READ,IRP_MJ_WRITE,IRP_MJ_DEVICE_CONTROL,分分别别对对应应于于以以下下Win32 API:CreateFile,CloseHandle,ReadFile,WriteFile和和DeviceIoControl。应应用用程程序序通通过过调调用用这这5个个Win32 API可可以以告告诉诉下下层层驱驱动

61、动程程序序做做些什么。些什么。数据包解析的依据数据包解析的依据数据链路层数据链路层 以太网的帧格式以太网的帧格式 PR:同步位,用于收发双方的时钟同步,同时也指明了:同步位,用于收发双方的时钟同步,同时也指明了传输的速率(传输的速率(10M和和100M的时钟频率不一样,所以的时钟频率不一样,所以100M网网卡可以兼容卡可以兼容10M网卡),是网卡),是56位的二进制数位的二进制数101010101010.SD: 分隔位分隔位,表示下面跟着的是真正的数据表示下面跟着的是真正的数据,而不是同步而不是同步时钟时钟,为为8位的位的10101011,跟同步位不同的是最后跟同步位不同的是最后2位是位是11

62、而不而不是是10.PRSDDASATYPEDATAPADFCS56位8位 48位48位16位461500字节可选32位以太网的帧格式以太网的帧格式 DA:目的地址目的地址,以太网的地址为以太网的地址为48位位(6个字节个字节)二进制地址二进制地址,表表明该帧传输给哪个网卡明该帧传输给哪个网卡.如果为如果为FFFFFFFFFFFF,则是广播地址则是广播地址,广播地址的数据可以被任何网卡接收到广播地址的数据可以被任何网卡接收到. SA:源源地地址址,48位位,表表明明该该帧帧的的数数据据是是哪哪个个网网卡卡发发的的,即即发发送送端端的网卡地址的网卡地址,同样是同样是6个字节个字节.TYPE:类类型

63、型字字段段,表表明明该该帧帧的的数数据据是是什什么么类类型型的的数数据据,不不同同的的协协议议的的类类型型字字段段不不同同。如如:0800H 表表示示数数据据为为IP包包,0806H 表表示示数数据据为为ARP包包(小小于于0600H的的值值是是用用于于IEEE802的的,表表示示数数据包的长度。)据包的长度。) PRSDDASATYPEDATAPADFCS56位8位 48位48位16位461500字节可选32位以太网的帧格式以太网的帧格式 -DATA:数据段:数据段 -PAD:填充位。当数据段的数据不足:填充位。当数据段的数据不足46字节时,后面补字节时,后面补000000.(当然也可以补其

64、它值当然也可以补其它值)-FCS:32位数据校验位位数据校验位.为为32位的位的CRC校验校验,该校验由网卡自动该校验由网卡自动计算计算,自动生成自动生成,自动校验自动校验,自动在数据段后面填入自动在数据段后面填入.对于数据的校对于数据的校验算法验算法,我们无需了解我们无需了解.PRSDDASATYPEDATAPADFCS56位8位 48位48位16位461500字节可选32位以太网的帧格式以太网的帧格式 事实上事实上,PR,SD,PAD,FCS这几个数据段我们不用理它这几个数据段我们不用理它 ,它是它是由网卡自动产生的由网卡自动产生的,我们要理的是我们要理的是DA,SA,TYPE,DATA四

65、个四个段的内容段的内容.-任何两个网卡的物理地址都是不一样的任何两个网卡的物理地址都是不一样的,是世界上唯一的是世界上唯一的,网卡地址由专门机构分配网卡地址由专门机构分配.不同厂家使用不同地址段不同厂家使用不同地址段,同一厂同一厂家的任何两个网卡的地址也是唯一的家的任何两个网卡的地址也是唯一的.根据网卡的地址段根据网卡的地址段(网网卡地址的前三个字节卡地址的前三个字节),可以知道网卡的生产厂家可以知道网卡的生产厂家.有些网卡有些网卡的地址也可以由用户去设定的地址也可以由用户去设定,但一般不需要但一般不需要. PRSDDASATYPEDATAPADFCS56位8位 48位48位16位461500

66、字节可选32位网络层网络层IP报头 数据包解析的依据数据包解析的依据网络层网络层TCP报头 数据包解析的依据数据包解析的依据网络层网络层UDP报头 数据包解析的依据数据包解析的依据解析实现解析实现解解析析工工作作是是建建立立在在已已读读出出的的二二进进制制比比特特流流上上的的,解解析析的的实实现现过程如下:过程如下:首首先先判判断断数数据据包包的的13,14字字,实实际际上上也也就就是是看看包包是是否否是是我我们们需需要要解解析析的的ARP或或者者IP报报文文。如如果果不不是是我我们们仍仍然然要要把把这这个个数数值值存存起起来来,因因为为这这时时这这两两个个字字节节将将是是包包的的长长度度(显

67、显然然,这这种种包不是以太网的标准结构)。包不是以太网的标准结构)。如如果果是是ARP包包,我我们们将将从从后后面面的的字字节节中中提提取取出出源源端端和和目目的的端端的的以以太太网网地地址址和和IP地地址址,并并且且指指针针自自加加至至下下一一个个数数据据包包的的头头(ARP包定长为包定长为60字节)。字节)。解析实现解析实现如如果果是是IP包包,我我们们又又需需要要进进一一步步分分情情况况讨讨论论。有有可可能能是是ICMP,IGMP,UDP或或者者TCP,这这些些都都将将通通过过从从IP报报头头开开始始计计算算的的第第10字字节节体体现现出出来来。ICMP是是01,IGMP是是02,TCP

68、是是06,而而UDP是是17,所所以以我我们们用用一一个个数数组组IPType来来存存这这个个数数值值。我我们们注注意意到到,TCP和和UDP中中,端端口口是是一一个个比比较较重重要要的的参参考考数数据,所以我们用两个数组据,所以我们用两个数组SouPort和和DesPort存储端口号。存储端口号。该窗口根据用户的菜单选择进行相应的处理:该窗口根据用户的菜单选择进行相应的处理:包括选定网卡,读包,写包,选定读包种类等包括选定网卡,读包,写包,选定读包种类等、数据包的解析、数据包的解析上层应用程序上层应用程序、数据包的解析、数据包的解析上层应用程序上层应用程序为学习为学习WindowsWindo

69、ws驱动程序的学生提供了一个健壮驱动程序的学生提供了一个健壮的程序和详尽的文档,其教育价值将十分显著的程序和详尽的文档,其教育价值将十分显著 商业价值也不可低估商业价值也不可低估实习的意义实习的意义 三、实习环境与要求三、实习环境与要求驱动程序实验环境驱动程序实验环境C编译器编译器DDK(Driver Development Kit)调试器调试器8/2/202475C C编译器编译器DDK缺省假定编译器是缺省假定编译器是Microsoft Visual C+(MSVC),),并按照使用并按照使用MSVC对相关的头文件进行了优化,因此建议对相关的头文件进行了优化,因此建议采用采用MSVC作为编译

70、器。作为编译器。Microsoft Visual C+ 6.0Microsoft Visual C+ .Net DDKDDKDDK的安装十分简单,只需运行的安装十分简单,只需运行DDK提供的安装程序提供的安装程序Setup,然后按照提示完成安装就可以了。,然后按照提示完成安装就可以了。DDK必须在必须在MSVC之后安装,否则之后安装,否则DDK的的Setenv.bat批处理文件在运行时将不能建立正确的环境。批处理文件在运行时将不能建立正确的环境。 安装安装DDK后,在后,在DDK程序组下有程序组下有checked和和free两个编译两个编译环境,环境,checked环境用于编译带调试信息的驱动

71、程序,环境用于编译带调试信息的驱动程序,free环境则用于编译正式发布版本的驱动程序。环境则用于编译正式发布版本的驱动程序。 DDKDDKDDK的目录结构:的目录结构:bin可执行文件可执行文件help关于关于DDK的各种帮助文件的各种帮助文件inc编译驱动程序所需的各种头文件编译驱动程序所需的各种头文件src各类驱动程序例子的源代码各类驱动程序例子的源代码 DDKDDKsrc子目录下包含了几十个真实的驱动程序例子的源代码,子目录下包含了几十个真实的驱动程序例子的源代码,这些例子几乎覆盖了驱动程序编程的方方面面。这些例子几乎覆盖了驱动程序编程的方方面面。如果在如果在Windows操作系统正式发

72、行版中一个实际的驱动程操作系统正式发行版中一个实际的驱动程序与序与DDK的例子驱动程序同名,那么例子驱动程序往往就的例子驱动程序同名,那么例子驱动程序往往就是实际驱动程序的源代码。是实际驱动程序的源代码。所以,所以,DDK提供的例子是学习编写驱动程序的最好资源。提供的例子是学习编写驱动程序的最好资源。 DDKDDK驱动程序的编译受驱动程序的编译受DDK提供的提供的BUILD工具控制。工具控制。成功编译一个驱动程序需要在要被编译的源文件目录下面成功编译一个驱动程序需要在要被编译的源文件目录下面提供三个文本文件(三个文件都没有扩展名):提供三个文本文件(三个文件都没有扩展名):MAKEFILESO

73、URCESDIRSBUILD从这三个文件读取输入,并且创建从这三个文件读取输入,并且创建BUILD.LOG、BUILD.ERR等文件作为输出,如果一切正常,执行等文件作为输出,如果一切正常,执行BUILD的最后结果是创建驱动程序的可执行版本,其文件的最后结果是创建驱动程序的可执行版本,其文件类型是类型是.SYS。DDKDDK在在DDK的的src子目录的每个例子下都可以找到这三个文件,子目录的每个例子下都可以找到这三个文件,为了方便,可以将其复制到自己编写的驱动程序源文件所为了方便,可以将其复制到自己编写的驱动程序源文件所在的目录,然后用文本编辑器按照自己的需要对其进行修在的目录,然后用文本编辑

74、器按照自己的需要对其进行修改即可。改即可。 DDKDDKMAKEFILE对所有驱动程序对所有驱动程序MAKEFILE都是一样的,并且在都是一样的,并且在MAKEFILE 中中Microsoft警告不要编辑这个文件。警告不要编辑这个文件。 DDKDDKSOURCES包含一些宏,用以指导包含一些宏,用以指导BUILD工具如何生成驱动程序工具如何生成驱动程序可执行文件、从那里获得输入以及在哪里进行输出。可执行文件、从那里获得输入以及在哪里进行输出。 DDKDDKSOURCESlTARGETNAME:用于指定生成的设备驱动程序名称,不需要文件用于指定生成的设备驱动程序名称,不需要文件扩展名,本例所产生

75、的文件为扩展名,本例所产生的文件为packet.sys。lTARGETPATH:用于指定生成的设备驱动程序可执行文件存放的用于指定生成的设备驱动程序可执行文件存放的路径,路径,BUILD工具根据工具根据checked和和free两个编译环境在两个编译环境在obj之后自动填之后自动填加加chk或或fre。lTARGETTYPE=DRIVER:BUILD工具能够生成许多不同的目标工具能够生成许多不同的目标对象,设备驱动程序选用对象,设备驱动程序选用DRIVER。lSOURCES:用于指定需被编译的全部源文件名称,文件扩展名不用于指定需被编译的全部源文件名称,文件扩展名不能省略,文件名之间用空格分开

76、。能省略,文件名之间用空格分开。lINCLUDES:本参数是可选的本参数是可选的, 用于指定除用于指定除DDK提供的头文件以外提供的头文件以外其他头文件的搜索路径。其他头文件的搜索路径。 lTARGETLIBS:本参数是可选的本参数是可选的, 用于指定除用于指定除DDK提供的库文件以提供的库文件以外其他其他库文件的搜索路径。外其他其他库文件的搜索路径。 DDKDDKDIRS包含包含BUILD工具要处理的一列目录,这些目录必须是工具要处理的一列目录,这些目录必须是当前目录的子目录,在这些目录下面,当前目录的子目录,在这些目录下面,BUILD将查找将查找另外的另外的DIRS文件或是文件或是MAKE

77、FILE和和SOURCES文件。文件。 DDKDDK驱动程序的编译驱动程序的编译单击开始单击开始所有程序所有程序 Development Kits Windows DDK Build Enviroments Win XP Checked Build Enviroment,将出现一个控制台窗口。,将出现一个控制台窗口。使用使用cd命令进入待编译驱动程序所在的目录,键入命令进入待编译驱动程序所在的目录,键入build命令即可编译。命令即可编译。运行运行build命令只编译需要重新编译的文件命令只编译需要重新编译的文件, 而而build -c命令则强迫编译器重新编译所有的文件。命令则强迫编译器重新编译所有的文件。 驱动程序的编译与安装驱动程序的编译与安装DEMO实习要求实习要求基本要求基本要求提高要求提高要求个人防火墙个人防火墙网络流量分析网络流量分析电子工程系电子工程系马洪兵马洪兵

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号