NDIS开发
- 格式:pdf
- 大小:221.89 KB
- 文档页数:59
嵌入式Linux系统中NDIS编译及使用说明(V2.12及以上版本):首先,获取NDIS驱动包:versionX.XX.zip其次,配置APN,为了3G和4G网络下都可以上网,需做两路APN设置,以CMNET 为例,设置如下:AT+CGDCONT=1,"IP","CMNET"AT+CGDCONT=2,"IP","CMNET"这个NDIS拨号不涉及到AT指令。
流程大致如下:1.驱动编译ndis_driver/src下相关文档拷贝到drivers/net/usb下,修改Makefile: lc_ether-objs += qmi_oper.o qmi_util.o\lc_cdc_ether.oobj-m += lc_ether.o编译成模块lc_ether.ko。
注:如果同时还需使用其他接口,比如发AT指令或者PPP拨号,则还需修改:(1)kernle/drivers/usb/serial/usb-serial.cint usb_serial_probe( …lock_kernel();if( interface->cur_altsetting->desc.bInterfaceNumber>=4)/ /添加return -EDOM; //添加type = search_serial_device(interface);……(2)kernle/drivers/usb/serial/option.c中添加VID和PID:{ USB_DEVICE( 0x1c9e, 0x9b05 ) } //添加(3) 配置内核时选上“USB Generic Serial Driver”和“USB driver for GSM and CDMA modems”,及PPP相关。
2.编译应用ndis_manager修改build.sh内CC为文件系统所用交叉编译器,然后执行脚本编译生成ndis_manager/libndis_dail.so。
目录1NDIS中间层驱动程序 (5)1.1NDIS中间层驱动程序(NDIS I NTERMEDIATE D RIVERS)概述 (5)1.2 1.2NDIS中间层驱动程序的用途 (7)1.3 1.3NDIS中间层驱动程序的开发环境 (7)2NDIS中间层驱动程序的开发 (7)2.1 2.1可分页和可丢弃代码 (7)2.2共享资源的访问同步 (8)2.3中间层驱动程序的D RIVER E NTRY函数 (9)2.3.1注册NDIS中间层驱动程序 (10)2.3.1.1注册中间层驱动程序的Miniport (10)2.3.1.2注册中间层驱动程序的协议 (14)注册下边界面向无连接的中间层驱动程序的ProtocolXxx函数 (15)注册下边界面向连接的中间层驱动程序的ProtocolXxx函数 (17)2.4中间层驱动程序的动态绑定 (19)2.4.1打开中间层驱动程序下层的适配器 (20)2.4.2微端口(Miniport)初始化 (22)2.4.3中间层驱动程序查询和设置操作 (23)2.4.3.1发布设置和查询请求 (24)2.4.3.2响应设置和查询请求 (25)2.4.4作为面向连接客户程序注册中间层驱动程序 (26)2.5中间层驱动程序数据包管理 (29)2.5.1重用数据包 (32)2.6中间层驱动程序的限制 (33)2.7中间层驱动程序接收数据 (34)2.7.1下边界面向无连接的中间层驱动程序接收数据 (34)2.7.1.1在中间层驱动程序中实现ProtocolReceivePacket处理程序 (36)2.7.1.2在中间层驱动程序中实现ProtocolReceive处理程序 (37)2.7.1.3下边界面向无连接中间层驱动程序接收OOB数据信息 (38)2.7.2下边界面向连接的中间层驱动程序接收数据 (39)2.7.2.1在中间层驱动程序中实现ProtocolCoReceivePacket处理程序 (39)2.7.2.2在下边界面向连接的中间层驱动程序中接收OOB数据信息 (40)2.7.3向高层驱动程序指2.8.4 示接收数据包 (40)2.8通过中间层驱动程序传输数据包 (41)2.9处理中间层驱动程序的P N P事件和PM事件 (45)2.9.1处理OID_PNP_XXX查询和设置 (46)2.9.2中间层驱动程序ProtocolPnPEvent处理程序的实现 (47)2.9.3处理规定的电源请求 (49)2.9.3.1睡眠状态的电源设置请求 (49)2.9.3.2工作状态的电源设置请求 (50)2.10中间层驱动程序复位操作 (51)2.11中间层驱动程序拆除绑定操作 (52)2.12中间层驱动程序状态指示 (53)3负载平衡和失效替换 (54)3.1关于LBFO (55)3.2 3.2指 (56)3.3指定对LBFO的支持 (56)3.4在微端口驱动程序上实现LBFO (57)3.4.1初始化微端口束 (57)3.4.2平衡微端口驱动程序的工作量 (58)3.4.3在主微端口失效后提升一个次微端口 (58)4安装网络组件 (59)4.1用于安装网络组件的组件和文件 (59)4.2创建网络INF文件 (60)4.2.1网络INFS文件名的约定 (61)4.2.2的约定........................................................................................... 错误!未定义书签。
python ndis通信方法Python是一种功能强大的编程语言,广泛应用于数据分析、机器学习、人工智能等领域。
在网络通信中,Python也提供了丰富的库和模块,方便开发者进行NDIS(Network Driver Interface Specification,网络驱动程序接口规范)通信。
本文将介绍Python中的NDIS通信方法,以及如何在Python中使用这些方法进行网络通信。
一、NDIS简介NDIS是一种网络驱动程序接口规范,它定义了网络驱动程序与网络协议栈之间的接口,使得不同的网络驱动程序可以与不同的网络协议栈进行通信。
NDIS提供了一组函数和数据结构,用于实现网络驱动程序的功能,包括数据包传输、中断处理、错误处理等。
在Windows系统中,NDIS是网络驱动程序与操作系统之间的接口规范。
二、Python中的NDIS通信方法Python提供了多种库和模块,用于实现网络通信。
其中,socket 是Python中最常用的网络通信模块之一,它提供了一组函数和方法,用于创建、连接、发送和接收网络数据。
通过socket模块,可以实现基于NDIS的网络通信。
1. 创建Socket对象在Python中,可以使用socket模块的socket()函数创建一个Socket对象。
Socket对象代表一个网络连接,通过它可以进行网络通信。
创建Socket对象时,需要指定网络协议和网络类型。
```pythonimport socket# 创建Socket对象s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)```2. 连接服务器通过Socket对象的connect()方法,可以连接到服务器。
需要指定服务器的IP地址和端口号。
```python# 连接服务器s.connect(('server_ip', port))```3. 发送和接收数据通过Socket对象的send()和recv()方法,可以发送和接收数据。
用NT DDK开发协议驱动程序王大伟杨凯锋胡熠洪佩琳摘要:本文针对基于Windows NT平台的协议驱动程序的开发方法进行讨论,并给出一个开发实例进行具体说明。
关键词:协议驱动程序、DDK、NDIS一.协议驱动程序简介微软公司为Windows系列平台上的网络驱动程序开发者专门制定了NDIS规范(Network Driver Interface Specification)。
根据NDIS规范,Windows NT平台上的网络驱动程序主要有三类:网卡驱动程序、中介协议驱动程序和上层协议驱动程序。
网络驱动程序的层次结构参见参考文献【1】。
网卡驱动程序位于驱动程序层次的最底层,它直接管理硬件,屏蔽底层物理硬件的细节,向上层驱动程序提供一个抽象的服务接口。
协议驱动程序加载在网卡驱动程序之上,利用网卡驱动程序提供的服务实现各种网络协议的功能。
协议驱动程序可以在其上边界实现TDI(Transport Driver Interface)接口为网络用户提供服务。
譬如分配分组,从用户应用程序把数据拷贝到分组中,然后调用NDIS提供的函数把分组发送给下层驱动程序。
它在下边界提供一个协议接口,接收并解释从下层驱动程序接收到的分组。
微软公司为开发者编写驱动程序提供了DDK(Device DriverKit)工具包。
根据不同的平台分为NT DDK和Windows 95 DDK。
在DDK中,包含了依据NDIS规范开发网络驱动程序的工具。
关于DDK的介绍,以及用DDK开发驱动程序的步骤参见参考文献【1】。
二.协议驱动程序的结构协议驱动程序包括驱动程序对象和驱动程序所提供的入口函数集合。
一个协议驱动程序必须绑定到小端口网卡驱动程序或者中介驱动程序(此时相当于一个虚拟的小端口网卡驱动程序)之上,它可以绑定到一个或者多个底层驱动程序之上。
协议驱动程序在其下边界提供一系列的ProtocolXxx接口函数,并通过NDIS发送和接收网络分组。
目录简介 (2)结构 (2)WDM (2)内部 (2)_NDIS_WRAPPER_HANDLE (3)_NDIS_PROTOCOL_BLOCK (3)_NDIS_M_DRIVER_BLOCK (3)_NDIS_MINIPORT_BLOCK (4)_NDIS_OPEN_BLOCK (8)_NDIS51_MINIPORT_CHARACTERISTICS (10)_NDIS50_PROTOCOL_CHARACTERISTICS (11)_NDIS_MINIPORT_INTERRUPT (12)_NDIS_PACKET (12)_NDIS_PACKET_PRIVATE (12)函数 (13)初始化 (13)PNP (13)中断 (14)包 (14)发送 (14)接收 (15)请求 (16)注册表 (16)类 (16)注册表 (16)绑定 (17)简介NDIS为Network Device Interface Specification的缩写,是Windows下的网卡驱动开发框架。
和协议驱动都通过NDIS提供的接口和对方通讯,如下图所示:protocol callbacks|--------------|NDIS lib call | || v微端口驱动 ----> NDIS <---- 协议驱动/|\ || | NDIS lib call|-------------|miniport callbacks结构WDM//miniportDRIVER_OBJECT - NDIS_M_DRIVER_BLOCK(驱动扩展)DEVICE_OBJECT - NDIS_MINIPORT_BLOCK(设备扩展)内部//绑定关系NDIS_PROTOCOL_BLOCK <- NDIS_OPEN_BLOCK -> NDIS_MINIPORT_BLOCKndisProtocolList|_ NDIS_PROTOCOL_BLOCK // 协议驱动|_ OpenQueue // 通过这个列表知道某个协议绑定到了哪些微端口设备ndisMiniDriverList|_ NDIS_M_DRIVER_BLOCK // 微端口驱动(DriverEntry)|_ MiniportQueue // 微端口设备实例(ndisPnPAddDevice)|_ OpenQueue // 通过这个列表知道某个微端口设备绑定了哪些协议_NDIS_WRAPPER_HANDLE这是初始化函数NdisMInitializeWrapper返回的句柄NDIS!_NDIS_WRAPPER_HANDLE+0x000 DriverObject : Ptr32 _DRIVER_OBJECT+0x004 ServiceRegPath : _UNICODE_STRING_NDIS_PROTOCOL_BLOCKNDIS!ndisProtocolList列表上的结构,一个对象代表一个协议驱动,这个结构是NdisRegisterProtocol函数返回的句柄NDIS!_NDIS_PROTOCOL_BLOCK+0x000 OpenQueue : Ptr32 _NDIS_OPEN_BLOCK+0x004 Ref : _REFERENCE+0x00c DeregEvent : Ptr32 _KEVENT+0x010 NextProtocol : Ptr32 _NDIS_PROTOCOL_BLOCK // 链表 +0x014 ProtocolCharacteristics : _NDIS50_PROTOCOL_CHARACTERISTICS // 驱动提供信息+0x080 WorkItem : _WORK_QUEUE_ITEM // 参见ndisCheckProtocolBindings+0x090 Mutex : _KMUTANT+0x0b0 MutexOwner : Uint4B+0x0b4 BindDeviceName : Ptr32 _UNICODE_STRING // 参见ndisInitializeBinding+0x0b8 RootDeviceName : Ptr32 _UNICODE_STRING // 同上 +0x0bc AssociatedMiniDriver : Ptr32 _NDIS_M_DRIVER_BLOCK // 参见NdisIMAssociateMiniport+0x0c0 BindingAdapter : Ptr32 _NDIS_MINIPORT_BLOCK // 参见ndisInitializeBinding_NDIS_M_DRIVER_BLOCKNDIS!ndisMiniDriverList列表上的结构,在NdisMRegisterMiniport或NdisIMRegisterLayeredMiniport中创建,一个对象代表一个微端口驱动NDIS!_NDIS_M_DRIVER_BLOCK+0x000 NextDriver : Ptr32 _NDIS_M_DRIVER_BLOCK // 列表挂接点+0x004 MiniportQueue : Ptr32 _NDIS_MINIPORT_BLOCK // 打开的设备实例列表,// 参见ndisQueueMiniportOnDriver+0x008 NdisDriverInfo : Ptr32 _NDIS_WRAPPER_HANDLE // NDIS 句柄+0x00c AssociatedProtocol : Ptr32 _NDIS_PROTOCOL_BLOCK // 参见NdisIMAssociateMiniport+0x010 DeviceList : _LIST_ENTRY+0x018 PendingDeviceList : Ptr32 _NDIS_PENDING_IM_INSTANCE+0x01c UnloadHandler : Ptr32 void+0x020 MiniportCharacteristics : _NDIS51_MINIPORT_CHARACTERISTICS // 驱动提供信息+0x09c MiniportsRemovedEvent : _KEVENT+0x0ac Ref : _REFERENCE+0x0b4 Flags : Uint2B+0x0b8 IMStartRemoveMutex : _KMUTANT+0x0d8 DriverVersion : Uint4B_NDIS_MINIPORT_BLOCK这个结构在NDIS!ndisMiniportList列表上,在NDIS创建WDM设备对象时创建,是WDM设备对象扩展区的一部分。
开发地理信息系统基础软件的需求分析与设计需求分析和设计是开发地理信息系统基础软件的关键步骤之一。
在本文中,我们将详细探讨如何进行地理信息系统基础软件的需求分析和设计,并介绍一些常用的技术和方法。
1.介绍地理信息系统基础软件的背景和意义地理信息系统(Geographic Information System,简称GIS)是一种用于收集、管理、分析和展示地理数据的计算机系统。
地理信息系统基础软件是构建GIS系统的重要组成部分,它提供了数据管理、空间分析、地图展示等基本功能。
地理信息系统基础软件的开发对于实现地理数据的有效管理和分析具有重要意义。
它可以帮助人们更好地理解和利用地理信息,以支持决策制定和规划管理。
2.需求分析需求分析是确定地理信息系统基础软件功能和性能要求的过程。
它需要从用户的角度出发,明确软件的功能需求、性能需求和约束条件。
在需求分析阶段,需要深入了解用户的需求,包括用户对于数据管理、空间分析和地图展示等功能的期望。
同时,还需要考虑软件的性能需求,如数据处理速度、用户界面友好性等。
需求分析的主要任务包括需求收集、需求分析和需求规格说明。
需求收集阶段通过与用户交流、调研、访谈等方法,获取用户需求。
需求分析阶段对需求进行归类和整理,并确定软件的功能和性能需求。
需求规格说明阶段将需求编写成规格说明文档,以便于后续的设计和开发工作。
3.设计在需求分析的基础上,进行软件的设计工作。
软件设计是制定软件结构和组织的过程,包括系统架构设计、模块设计和用户界面设计等。
系统架构设计是软件设计的核心环节,它确定了系统的整体结构和各个模块的关系。
在地理信息系统基础软件的设计中,应该考虑数据管理、空间分析和地图展示等模块之间的协调与配合。
模块设计是将系统划分为若干个独立的功能模块,并确定模块之间的接口和交互方式。
每个模块应该有清晰的功能定义和输入输出规范。
用户界面设计是保证用户友好性和易用性的重要环节。
地理信息系统基础软件的用户界面应该简洁明了,操作简单,同时提供必要的帮助和提示信息。
NDIS & NDIS HOOK 大笔记公司的防火墙马上就要被整合到新版本的"xxx"里面了(还是尽量少的提及公司的东西).通过在公司做的这个ARP防火墙,我对NDIS技术也算有了进一步的认识.现在结合手上的资料,整理一些笔记.希望能起到抛砖引玉的效果.(本文不涉及技术细节的问题哈)单刀直入.进入主题.NDIS是微软提供的一套比较成熟的框架,他是在Miniport和Protocol 之间插入一个中间层.所以NDIS也就是一个中间层驱动(IMD).而NDIS HOOK 主要是采用修改内核的的方式,实现了发送和接收数据的拦截.两种技术各有千秋,就其稳定性而言,NDIS是微软提供的标准接口,技术比较成熟,所以稳定性比较高,但是因为他要同时注册一个协议驱动和一个微端口驱动,加上其加载过程中复杂的注册表操作,所以要实现他的动态加载相当麻烦.(微软只提供了以 INF文件的方式加载ndis的驱动).然而软驱动就相对灵活,它可以动态的加载.但是它的稳定性相对NDIS会差一些.(当然,您是牛人的话,也可以写出足够稳定的ndis hook的驱动).另外NDIS HOOK做出来的足够的小.NDIS HOOK主要HOOK了一些Ndis相关的库函数,修改了协议链表里面的派发函数,这样就使得通过网卡的数据会先经过你指定的函数,从而达到实现.以下分别详细说一下NDIS和NDIS hook:如果你要做一个NDIS的中间层驱动,其实你完全完全可以在Passthru的基础上进行修改,没有必要自己再去开发一套NDIS的框架,因为你做出来的框架不一定比微软的好.假如你还希望获得多的扩展功能的话,你可以去里面下载一个PassthruEx ,它是由一虾米公司(公司名字不记得了)扩展的Passthru代码,相当好用.这个框架已经完全的实现数据包的拦截,你只需要将数据包正确的解析出来, 然后加上你自己的过滤协议,就可以完成一个简单的防火墙了.(入门以后你回过头来看那些东西其实还是相当简单的.)这里给出Passthru接收数据流程图,你可以结合DDK的文档,整理一下大体的思路:同样给出发送端的流程图:你通过DDK查看它的相关函数理清楚它的流程.你不必关心每一个函数,其实我做那个东西就关心了五个函数MPSetInformation ,MPSend ,MPSendPackets ,PtReceive,PtReceivePacket.除了MPSetInformation 是进行一些相关设置.例如设置网卡混杂模式等等.其他的几个函数的作用就不用多说了吧~~~关于NDIS的文档比较多,应该这个不成问题.如果你使用这个框架的话,你可以花费更多的时间来考虑过滤规则的问题.而不是如何去实现一个过滤.关于NDIS HOOK:古老的钩子艺术,记得那本ROOTKIT书上讲述的,局限钩子技术的使用的,仅仅是你的想象能力而已.所以在防火墙方面,钩子技术也展现了自己无所不能的能力.大家都知道,NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,并调用NDIS API函数NdisRegisterProtocol进行注册。
ndis driver 实例NDIS 驱动程序实例简介NDIS(网络驱动程序接口规范)是一种用于 Windows 操作系统的网络驱动程序的规范。
它定义了网络适配器和操作系统之间通信的标准接口。
NDIS 驱动程序充当操作系统和网络适配器的桥梁,允许它们相互通信并处理网络数据。
NDIS 驱动程序类型有两种类型的 NDIS 驱动程序:MAC 驱动程序:负责在网络适配器和操作系统之间传输数据帧。
它处理物理层和数据链路层操作。
协议驱动程序:实现特定的网络协议,例如 TCP/IP 或IPX/SPX。
它们处理网络层和传输层操作。
NDIS 驱动程序架构NDIS 驱动程序遵循分层的架构,其中每个层处理特定功能: NDIS 微型端口驱动程序:与网络适配器的硬件直接交互。
NDIS 迷你端口驱动程序:充当 NDIS 微型端口驱动程序和NDIS 中层之间的抽象层。
NDIS 中层:负责协调微型端口和协议驱动程序之间的通信。
NDIS 上层:包括协议驱动程序和其他应用程序,使用 NDIS 服务来访问网络。
NDIS 驱动程序开发NDIS 驱动程序是用 C 或 C++ 语言开发的。
它们需要遵循NDIS 规范并通过 Microsoft 认证测试计划 (WHQL) 的认证才能在Windows 操作系统上安装。
NDIS 驱动程序的职责NDIS 驱动程序负责执行以下任务:初始化网络适配器并配置其操作参数。
处理数据帧在计算机和网络适配器之间的传输。
实现特定的网络协议并处理网络层和传输层操作。
与操作系统和其他驱动程序交换信息以协调网络操作。
处理电源管理和错误恢复事件。
示例:Wi-Fi NDIS 驱动程序Wi-Fi NDIS 驱动程序是一个特定类型的 NDIS 驱动程序,负责处理 Wi-Fi 网络连接。
它实现 IEEE 802.11 标准并允许计算机连接到无线网络。
Wi-Fi NDIS 驱动程序通常由网络适配器制造商提供。
NDIS 驱动程序的应用NDIS 驱动程序广泛用于各种设备,包括:以太网网络适配器无线网络适配器 (Wi-Fi、蓝牙)调制解调器虚拟私有网络 (VPN) 适配器负载平衡器NDIS 驱动程序是网络通信的基石,为操作系统和网络适配器之间有效地交换数据提供了框架。
基于ndis protocol driver技术介绍
基于NDIS(网络设备接口规范)协议驱动程序是一种用于开发网络设备驱动程序的技术。
NDIS协议驱动程序使网络设备能够与操作系统进行通信,以便数据包的传输和网络连接的管理。
NDIS协议驱动程序的主要功能包括以下几个方面:
1. 硬件抽象层:NDIS协议驱动程序提供了一个硬件抽象层,将不同类型的网络设备抽象为统一的接口。
这样,操作系统就可以通过相同的接口与不同类型的网络设备进行通信,而无需考虑具体的硬件细节。
2. 协议支持:NDIS协议驱动程序提供了对常用网络协议(如TCP/IP、IPX/SPX等)的支持。
它通过实现相应的协议驱动,使得网络设备可以通过这些协议与其他设备通信。
3. 数据包传输:NDIS协议驱动程序负责管理网络设备和操作系统之间的数据包传输。
它将从网络设备接收到的数据包传递给上层协议驱动程序,或者将从上层协议驱动程序接收到的数据包发送到网络设备。
4. 网络连接管理:NDIS协议驱动程序负责管理网络设备的连接状态。
它可以监测网络设备的连接状态,并通知操作系统和应用程序有关连接状态的变化。
5. 性能管理:NDIS协议驱动程序可提供有关网络设备性能的信息,例如网络流量、传输速度等。
这些信息可以帮助操作系
统和应用程序调整网络配置和优化网络性能。
需要注意的是,开发基于NDIS协议驱动程序的技术需要熟悉操作系统的内核编程和网络协议的相关知识。
对于普通应用程序开发者而言,了解NDIS协议驱动程序的工作原理和基本概念可以帮助他们更好地理解网络设备驱动程序的工作机制。
1引言从应用角度看,防火墙基本上可以分为两种:网络级的防火墙和个人防火墙。
由于Windows操作系统是目前使用最为广泛的PC操作系统,因此在Windows操作系统下开发的个人防火墙产品数不胜数。
然而,所有基于Windows操作系统的个人防火墙,其核心技术一般是基于Windows操作系统下网络数据包的拦截技术。
但是这些技术或多或少的存在着某些缺陷,如基于SPI(ServiceProviderInterface)技术的只能捕获应用层的数据,基于TDI(TransportDriversInterface)技术的不能接收更为底层的数据包(如ICMP),基于中间层驱动程序技术的防火墙安装却又十分麻烦,而且很容易造成网络瘫痪。
而这里讨论的NDIS HOOK技术则很好的避免了这些问题。
首先介绍了NDIS的结构与NDID HOOK原理,然后论述了Windows2000/NT操作系统下如何利用NDIS HOOK(并非中间层驱动程序)技术来实现个人防火墙的方法。
2NDIS系统结构图1NDIS拓扑结构NDIS(NetworkDriverInterfaceSpecification)是Mi crosoft和3Com公司开发的网络驱动程序接口规范。
它为Windows下网络驱序程序的开发带来许多方便,编写符合NDIS规范的驱动程序时,只要调用NDIS函数,而不用考虑操作系统的内核以及与其他驱动程序的接口问题,为操作系统对不同网络的支持提供了方便。
Windows使用NDIS函数库实现NDIS接口,所有的网络通信最终必须通过NDIS完成。
NDIS 负责上下层驱动程序间服务原语和驱动程序入口之间的转换,分派消息通知,保证符合NDIS 的驱动程序无需知道其它驱动程序的入口就可以与之通信。
NDIS横跨传输层、网络层和数据链路层,NDIS的结构如图1所示。
由图1可以看出,微软提供了以下几种标准接口编程方式:(1)小端口驱动程序(Miniportdrivers)(2)中间驱动程序(Intermediatedrivers)(3)协议驱动程序(Protocoldrivers)(4)TDI传输层过滤驱动程序TDIFilter,常见的TcpFilterDriver即属此类。
NDIS开发指南NDIS (Network Device Interface Specification) 开发指南引言:NDIS (Network Device Interface Specification) 是微软公司开发的一种网络设备驱动程序接口规范,为网络适配器厂商提供了一种方便、可扩展的开发方式。
NDIS 目前被广泛应用于 Windows 系统,并具有很高的兼容性和稳定性。
本文将为开发人员提供关于 NDIS 的详细信息,如何开发适配器驱动程序以及一些常见的开发技巧。
一、NDIS介绍:NDIS是一种面向网络设备的开放性的驱动程序接口规范,其主要功能是将操作系统与具体的网络适配器分离开来,以提供统一的网络通信接口。
NDIS提供了一套标准的接口函数,使得适配器驱动程序可以与上层的网络协议栈进行交互,同时也可以与硬件设备进行通信。
利用NDIS提供的接口,开发人员可以比较方便地开发出符合规范的适配器驱动程序。
二、NDIS开发环境:1. 开发语言:NDIS 驱动程序可以使用 C/C++ 或者其他支持Windows 内核编程的语言进行编写。
2. 开发工具:推荐使用 Microsoft Visual Studio 作为开发工具,同时需要安装 Windows 驱动程序开发工具包 (Windows Driver Kit)。
三、NDIS驱动程序开发:1. 驱动程序架构:NDIS 驱动程序通常由两部分组成,分别是 NDIS Miniport 驱动程序和 NDIS 协议驱动程序。
Miniport 驱动程序负责管理适配器硬件和实现与协议栈的交互,而协议驱动程序则负责实现具体的网络协议功能。
2. Miniport 驱动程序开发:Miniport 驱动程序可以通过继承 NDIS Miniport 驱动程序接口类 (NDIS Miniport Driver Interface) 来实现自己的功能。
开发人员需要实现一系列的接口函数,包括驱动程序的初始化、处理接收和发送数据等。
目录1NDIS中间层驱动程序 (2)1.1NDIS中间层驱动程序(NDIS Intermediate Drivers)概述 (2)1.2NDIS中间层驱动程序的用途 (4)1.3NDIS中间层驱动程序的开发环境 (4)2NDIS中间层驱动程序的开发 (4)2.1可分页和可丢弃代码 (4)2.2共享资源的访问同步 (5)2.3中间层驱动程序的DriverEntry函数 (5)2.3.1注册NDIS中间层驱动程序 (6)2.3.1.1注册中间层驱动程序的Miniport (6)2.3.1.2注册中间层驱动程序的协议 (8)2.4中间层驱动程序的动态绑定 (11)2.4.1打开中间层驱动程序下层的适配器 (12)2.4.2微端口(Miniport)初始化 (12)2.4.3中间层驱动程序查询和设置操作 (13)2.4.3.1发布设置和查询请求 (14)2.4.3.2响应设置和查询请求 (15)2.4.4作为面向连接客户程序注册中间层驱动程序 (15)2.5中间层驱动程序数据包管理 (17)2.5.1.1重用数据包 (18)2.6中间层驱动程序的限制 (19)2.7中间层驱动程序接收数据 (19)2.7.1下边界面向无连接的中间层驱动程序接收数据 (19)2.7.1.1在中间层驱动程序中实现ProtocolRe ceivePacket处理程序 (20)2.7.1.2在中间层驱动程序中实现ProtocolReceive处理程序 (21)2.7.1.3下边界面向无连接中间层驱动程序接收OOB数据信息 (22)2.7.2下边界面向连接的中间层驱动程序接收数据 (22)2.7.2.1在中间层驱动程序中实现ProtocolCoReceivePacket处理程序 (23)2.7.2.2在下边界面向连接的中间层驱动程序中接收OOB数据信息 (23)2.7.3向高层驱动程序指示接收数据包 (23)2.8通过中间层驱动程序传输数据包 (23)2.8.1传递介质相关信息 (25)2.9处理中间层驱动程序的PnP事件和PM事件 (26)2.9.1处理OID_PNP_XXX查询和设置 (26)2.9.2中间层驱动程序ProtocolPnPEvent处理程序的实现 (27)2.9.3处理规定的电源请求 (28)2.9.3.1睡眠状态的电源设置请求 (28)2.9.3.2工作状态的电源设置请求 (29)2.10中间层驱动程序复位操作 (29)2.11中间层驱动程序拆除绑定操作 (30)2.12中间层驱动程序状态指示 (31)3负载平衡和失效替换 (31)3.1关于LBFO (31)3.2指定对LBFO的支持 (32)3.3在微端口驱动程序上实现LBFO (32)3.3.1初始化微端口束 (33)3.3.2平衡微端口驱动程序的工作量 (33)3.3.3在主微端口失效后提升一个次微端口 (34)4安装网络组件 (34)4.1用于安装网络组件的组件和文件 (34)4.2创建网络INF文件 (35)4.2.1网络INFS文件名的约定 (35)4.2.2网络INF文件的版本节 (35)4.2.3网络INF文件的模型节 (36)4.2.4INF文件的DDInstall节 (37)4.2.5删除节 (38)4.2.6ControlFlags节 (39)4.2.7网络INF文件的add-registry-sections (39)表格 1 缩略语表项目英文描述中文描述NDIS Network Driver Interface Specification网络驱动程序接口标准IMD Intermediate Drivers中间层驱动TDI Transport driver Interface传输驱动程序接口NIC Network Interface Card 网络接口卡SP Service Pack 服务包LAN Local Area Network局域网LAN-E LAN Emulation 局域网仿真NAT Network Address Translation 网络地址转换LBFO Load Balancing And Fail-Over 负载平衡和失效替换DDK Device Drivers Kit 设备驱动程序开发包SMPSymmetry Multiprocessing 对称多处理OS Operating System 操作系统IDE Integrated Development Environment集成开发环境1 NDIS中间层驱动程序 1.1 NDIS中间层驱动程序(NDIS Intermediate Drivers)概述微软Windows网络驱动程序接口标准(NDIS 4.0)和Windows NT 4.0(SP3)引入了一种新的NDIS驱动程序,它可以嵌在NDIS 传输驱动程序TDI(如,TCP/IP)和底层的NDIS网络接口驱动程序的中间。
这种新类型的驱动程序被称为NDIS中间层驱动,如图表1。
NDIS(网络驱动器接口标准)中间层驱动程序在其上边界导出MiniportXxx函数,在其下边界导出ProtocalXxx函数。
该驱动程序在其上边界仅提供面向无连接通信支持,而在其下边界,则即可支持面向无连接通信,也可支持面向连接通信。
中间层驱动程序的微端口部分(上边界)必须是非串行的,系统将依赖这些非串行驱动程序,而不是NDIS对MiniportXxx函数的操作进行串行化处理和对内部生成的输出包进行排队操作,这样驱动程序只要保持很小的临界区(每次只能有一个线程执行该代码)就能提供性能良好的全双工操作。
但是这些非串行Miniport要受到更多也更严格的设计要求的限制,往往要为此付出更多的调试和测试时间。
中间层驱动程序是一种典型的层次结构程序,它基于一个或多个NDIS NIC驱动程序,其上层是一个向上层提供TDI(传输驱动程序接口)支持的传输驱动程序(也可能是多层结构)。
从理论上讲,一个中间层驱动程序也可以是基于其他中间层驱动程序或作为其他中间层驱动程序的低层出现的,尽管这种方案未必能展现更好的性能。
中间层驱动程序的一个示例是LAN仿真中间层驱动程序,其上层是一个早期传输驱动程序,下层是一个非LAN介质的微端口 NIC驱动程序。
该驱动程序从上层接收LAN格式的数据包并将其转换为本地网卡的介质格式,然后将其发送到那个NIC的NDIS 微端口。
接收数据时,该驱动程序将低层网卡驱动程序送来的数据包转换为LAN兼容格式,最后向上层传输驱动程序提交这些转换过的数据包。
例如,NDISWAN就具有一些上述特征。
NDISWAN将数据包从上层的传输LAN格式转换为WAN数据包格式,或者将数据包从低层的网卡驱动WAN格式转换为LAN数据包格式。
另外,如果低层NIC硬件不支持这些功能,那么NDISWAN也可提供诸如压缩、加密和端对端协议(PPP)等的数据格式化功能。
NDISWAN为在NDIS API和网卡驱动程序之间进行通信提供了一个专用接口,同时,NDISWAN也将协议绑定映射为活动连接请求。
另一个中间层驱动程序的例子是ATM LANE (LAN仿真)驱动程序,它将数据包从上层无连接的传输格式转换为下层面向连接的网卡支持的ATM格式。
图1.1说明了中间层驱动程序结构Before Installing NDIS Intermediate DriverAfter InstallingNDIS Intermediate Driver 图表 1 中间层驱动程序结构NDIS中间层驱动程序在NDIS中起着转发上层驱动程序送来的数据包,并将其向下层驱动程序发送的接口功能。
当中间层驱动程序从下层驱动程序接收到数据包时,它要么调用NdisMXxxIndicateReceive函数,要么调用NdisMindicateReceivePacket函数向上层指示该数据包。
中间层驱动程序通过调用NDIS打开和建立一个对低层NIC驱动程序或者NDIS中间层驱动程序的绑定。
中间层驱动程序提供MiniportSetInformation和MiniportQueryInformation函数来处理高层驱动程序的设置和查询请求,某些情况下,可能还要将这些请求向低层NDIS驱动程序进行传递,如果其下边界是面向无连接的可通过调用NidsRequest实现这一功能,如果其下边界是面向连接的则通过调用NidsCoRequest实现该功能。
中间层驱动程序通过调用NDIS提供的函数向网络低层NDIS驱动程序发送数据包。
例如,下边界面向无连接的中间层驱动程序必须调用NdisSend或NdisSendPackets来发送数据包或者包数组,而在下边界面向连接的情况下就必须调用NdisCoSendPackets来发送包数组数据包。
如果中间层驱动程序是基于非NDIS NIC驱动程序的,那么在调用中间层驱动程序的MiniportSend或Miniport(Co)SendPackets函数之后,发送接口对NDIS将是不透明的。
NDIS提供了一组隐藏低层操作系统细节的NdisXxx函数和宏。
例如,中间层驱动程序可以调用NdisMInitializeTimer来创建同步时钟,可以调用NdisInitializeListHead创建链表。
中间层驱动程序使用符合NDIS标准的函数,来提高其在支持Win32接口的微软操作系统上的可移植性。
1.2 NDIS中间层驱动程序的用途NDIS中间层驱动有几个方面的用途,包括:• 局域网仿真(LAN Emulation) – NDIS中间层驱动可以使一个非局域网NIC驱动(如,ATM)犹如一个局域网NIC驱动(如,Ethernet)。
• 包过滤(Packet Filtering)- 可以拦截和修改高层TDI(传输驱动程序)和底层N I C驱动程序之间的网络包(Packets):• 通过或过滤掉(Pass/Drop Packets)• 延迟或重新排序( Delay/Reorder Packets)• 加密或解密(Packet Encryption/Decryption)• 压缩或解压(Packet Compression/Decompression)• 路由包(Route Packets):• NAT网络地址转换(Network Address Translation)• LBFO负载平衡和失效替换(Adapter Load Balancing And Fail-Over)1.3 NDIS中间层驱动程序的开发环境OS : Microsoft Windows 2000 ServerIDE: Microsoft Visual C++ V6.0DDK : Windows 2000 Device Drivers Kit2 NDIS中间层驱动程序的开发2.1 可分页和可丢弃代码每一个MiniportXxx函数或ProtocolXxx函数都运行在一个特定的IRQL上,在中间层驱动程序中这些函数可使用的IRQL从PASSIVE_LEVEL一直到DISPATCH_LEVEL(包括DISPATCH_LEVEL)。