logo资料库

NDIS开发指南.doc

第1页 / 共94页
第2页 / 共94页
第3页 / 共94页
第4页 / 共94页
第5页 / 共94页
第6页 / 共94页
第7页 / 共94页
第8页 / 共94页
资料共94页,剩余部分请下载后查看
1NDIS中间层驱动程序
1.1NDIS中间层驱动程序(NDIS Intermediate Drivers)概述
1.21.2 NDIS中间层驱动程序的用途
1.31.3 NDIS中间层驱动程序的开发环境
2NDIS中间层驱动程序的开发
2.1可分页和可丢弃代码
2.2共享资源的访问同步
2.3中间层驱动程序的DriverEntry函数
2.3.1注册NDIS中间层驱动程序
2.3.1.1注册中间层驱动程序的Miniport
2.3.1.2注册中间层驱动程序的协议
注册下边界面向无连接的中间层驱动程序的ProtocolXxx函数
注册下边界面向连接的中间层驱动程序的ProtocolXxx函数
2.4中间层驱动程序的动态绑定
2.4.1打开中间层驱动程序下层的适配器
2.4.2微端口(Miniport)初始化
2.4.3中间层驱动程序查询和设置操作
2.4.3.1发布设置和查询请求
2.4.3.2响应设置和查询请求
2.4.4作为面向连接客户程序注册中间层驱动程序
2.5中间层驱动程序数据包管理
2.5.1重用数据包
2.6中间层驱动程序的限制
2.7中间层驱动程序接收数据
2.7.1下边界面向无连接的中间层驱动程序接收数据
2.7.1.1在中间层驱动程序中实现ProtocolReceivePacket处理程序
2.7.1.2在中间层驱动程序中实现ProtocolReceive处理程序
2.7.1.3下边界面向无连接中间层驱动程序接收OOB数据信息
2.7.2下边界面向连接的中间层驱动程序接收数据
2.7.2.1在中间层驱动程序中实现ProtocolCoReceivePacket处理程序
2.7.2.2在下边界面向连接的中间层驱动程序中接收OOB数据信息
2.7.3向高层驱动程序指2.8.4 示接收数据包
2.8通过中间层驱动程序传输数据包
2.9处理中间层驱动程序的PnP事件和PM事件
2.9.1处理OID_PNP_XXX查询和设置
2.9.2中间层驱动程序ProtocolPnPEvent处理程序的实现
2.9.3处理规定的电源请求
2.9.3.1睡眠状态的电源设置请求
2.9.3.2工作状态的电源设置请求
2.10中间层驱动程序复位操作
2.11中间层驱动程序拆除绑定操作
2.12中间层驱动程序状态指示
3负载平衡和失效替换
3.1关于LBFO
3.23.2 指
3.3指定对LBFO的支持
3.4在微端口驱动程序上实现LBFO
3.4.1初始化微端口束
3.4.2平衡微端口驱动程序的工作量
3.4.3在主微端口失效后提升一个次微端口
4安装网络组件
4.1用于安装网络组件的组件和文件
4.2创建网络INF文件
4.2.1网络INFS文件名的约定
4.2.2网络INF文件的版本节
4.2.3网络INF文件的模型节
4.2.4INF文件的DDInstall节
4.2.5删除节
4.2.6ControlFlags节
4.2.7网络INF文件的add-registry-sections
1.2.7.1设置静态参数
1.2.7.2 为WAN适配器说明WAN端点
1.2.7.3为ISDN适配器说明ISDN键和值
1.2.7.4安装多协议WAN NICs
1.2.7.5请求安装另一个网络组件
1.2.7.6说明NetCLient组件的名字和提供者
1.2.7.7增加HelpText值
1.2.7.8为通知对象增加注册值
1.2.7.9向Ndi键增加服务相关值
1.2.7.10说明绑定接口
1.2.7.11为高级属性页说明配置参数
1.2.7.12为网络适配器说明定制属性页
1.2.7.13说明过滤器服务值
1.2.7.14说明束成员关系
1.2.8 DDInstall.Service节
1.2.9 NetworkProrider和PrintProvider节
1.2.9.1包含一个NetworkProvider节
1.2.9.2 包括一个PrintProvider节
1.2.10 Winsock节
1.2.11网络组件安装需求总结
1.2.11.1网络适配器的安装需求
1.2.11.2网络协议安装要求
1.2.11.3中间层网络驱动程序的安装需求
1.2.11.4网络过滤器驱动程序的安装需求
1.2.11.5网络客户的安装需求
1.2.11.6网络服务的安装请求
目 录 1 NDIS 中间层驱动程序....................................................................................................................5 1.1 1.2 1.3 NDIS 中间层驱动程序(NDIS INTERMEDIATE DRIVERS)概述............................................... 5 1.2 NDIS 中间层驱动程序的用途..........................................................................................7 1.3 NDIS 中间层驱动程序的开发环境..................................................................................7 2 NDIS 中间层驱动程序的开发........................................................................................................7 2.1 2.1 可分页和可丢弃代码........................................................................................................7 2.2 共享资源的访问同步.............................................................................................................. 8 2.3 中间层驱动程序的 DRIVERENTRY 函数.................................................................................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 处理中间层驱动程序的 PNP 事件和 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 的约定............................................................................................错误!未定义书签。 4.2.3 网络INF 文件的版本节............................................................................................... 61 4.2.4 网络INF 文件的模型节............................................................................................... 63 4.2.5 INF 文件的DDInstall 节.................................................................................................. 63 4.2.6 删除节............................................................................................................................66 4.2.7 ControlFlags 节................................................................................................................. 66 4.2.8 网络INF 文件的add-registry-sections........................................................................ 67 1.2.7.1 设置静态参数.....................................................................................................................68 1.2.7.2 为WAN 适配器说明WAN 端点.......................................................................................68 1.2.7.3 为ISDN 适配器说明ISDN 键和值...................................................................................69 1.2.7.4 安装多协议WAN NICs ......................................................................................................72 1.2.7.5 请求安装另一个网络组件.................................................................................................73 1.2.7.6 说明NetCLient 组件的名字和提供者.............................................................................. 74 1.2.7.7 增加HelpText 值................................................................................................................75 1.2.7.8 为通知对象增加注册值.....................................................................................................75 1.2.7.9 向Ndi 键增加服务相关值.................................................................................................76 1.2.7.10 说明绑定接口...................................................................................................................77 1.2.7.11 为高级属性页说明配置参数...........................................................................................79 1.2.7.12 为网络适配器说明定制属性页.......................................................................................80 1.2.7.13 说明过滤器服务值...........................................................................................................80 1.2.7.14 说明束成员关系...............................................................................................................82 1.2.8 DDInstall.Service 节..............................................................................................................83 1.2.9 NetworkProrider 和PrintProvider 节...................................................................................84 1.2.9.1 包含一个NetworkProvider 节...........................................................................................84 1.2.9.2 包括一个PrintProvider 节............................................................................................... 85 1.2.10 Winsock 节...........................................................................................................................85 1.2.11 网络组件安装需求总结......................................................................................................87 1.2.11.1 网络适配器的安装需求...................................................................................................87 1.2.11.2 网络协议安装要求...........................................................................................................89 1.2.11.3 中间层网络驱动程序的安装需求...................................................................................89
1.2.11.4 网络过滤器驱动程序的安装需求...................................................................................90 1.2.11.5 网络客户的安装需求.......................................................................................................92 1.2.11.6 网络服务的安装请求.......................................................................................................93
表格 1 项目 NDIS IMD TDI NIC SP LAN LAN-E NAT LBFO DDK SMP OS IDE 缩略语表 英文描述 Network Driver Interface Specification Intermediate Drivers Transport driver Interface Network Interface Card Service Pack Local Area Network LAN Emulation Network Address Translation Load Balancing And Fail-Over Device Drivers Kit Symmetry Multiprocessing Operating System Integrated Development Environment 中文描述 网络驱动程序接口标准 中间层驱动 传输驱动程序接口 网络接口卡 服务包 局域网 局域网仿真 网络地址转换 负载平衡和失效替换 设备驱动程序开发包 对称多处理 操作系统 集成开发环境
1 NDIS 中间层驱动程序 1.1NDIS 中间层驱动程序(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 说明了中间层驱动程序结构 图表 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.21.2 NDIS 中间层驱动程序的用途 NDIS 中间层驱动有几个方面的用途,包括: 局域网仿真(LAN Emulation)– NDIS 中间层驱动可以使一个非局域网 NIC 驱动(如, ATM)犹如一个局域网 NIC 驱动(如,Ethernet)。 包过滤(Packet Filtering) - 可以拦截和修改高层 TDI(传输驱动程序)和底层 NIC 驱动程序之间的网络包(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.31.3 NDIS 中间层驱动程序的开发环境 OS : Microsoft Windows 2000 Server IDE : Microsoft Visual C++ V6.0 DDK : Windows 2000 Device Drivers Kit 2 NDIS 中间层驱动程序的开发 2.1可分页和可丢弃代码 每一个 MiniportXxx 函数或 ProtocolXxx 函数都运行在一个特定的 IRQL 上,在中间层 驱动程序中这些函数可使用的 IRQL 从 PASSIVE_LEVEL 一直到 DISPATCH_LEVEL(包括
DISPATCH_LEVEL)。 总 是 运 行 在 IRQL PASSIVE_LEVEL 上 的 中 间 层 驱 动 程 序 函 数 可 通 过 调 用 NDIS_PAGEABLE_FUNCTION 宏将其标记为可分页代码。驱动程序设计者应尽可能的将程 序 代 码 设 计 为 可 分 页 的 , 为 那 些 必 须 驻 留 内 存 代 码 释 放 系 统 空 间 。 运 行 在 IRQL PASSIVE_LEVEL 的驱动程序函数,当其既不调用运行在 IRQL >=DISPATCH_LEVEL 的任 何函数,也不被运行在 IRQL >=DISPATCH_LEVEL 的任何函数调用时,可将其标注为可分 页 的 。 例 如 , 一 个 获 取 自 旋 锁 的 函 数 , 而 获 取 自 旋 锁 将 促 使 获 取 线 程 提 升 到 IRQL DISPATCH_LEVEL 上 运 行 。 一 个 运 行 在 IRQL PASSIVE_LEVEL 的 函 数 , 如 ProtocolBindAdapter , 如 果 被 标 注 为 可 分 页 的 , 就 不 能 再 调 用 运 行 在 IRQL >=DISPATCH_LEVEL NDIS 的函数。关于运行在 IRQL 上的 NDIS 函数的更多信息, 请参阅在线 DDK 的“Network Drivers Reference”,其中列出了每一个 NdisXxx 函数的 IRQL。 中 间层 驱动 程 序的 DriverEntry 函 数以 及只 在 DriverEntry 中 调用 的代 码 ,应 该 用 NDIS_INIT_FUNCTION 宏将其设定为仅用作系统初始化功能。假定 NDIS_INIT_FUNCTION 宏标识的代码仅在系统初始化时运行,这样该部分代码将只有在初始化时才会被映射,在 DriverEntry 返回后,NDIS_INIT_FUNCTION 宏标识的这部分代码将被丢弃。 2.2共享资源的访问同步 如果驱动程序分配的资源能够被两个驱动程序函数同时共享,或者中间层驱动程序能 够运行在 SMP(对称多处理)机器上,这样相同的驱动程序函数能够从多个处理器同时访 问该资源,那么对这些共享资源的访问必须进行同步。例如,驱动程序维持一个共享队列, 使用自旋锁来对队列的访问进行同步,自旋锁在队列创建之前调用 NdisAllocateSpinLock 进 行初始化。 当然,也不必过分地保护共享资源,例如,对于队列,一些读操作不进行串行化也是 可以成功执行的。但任何针对队列链接的操作都必须进行同步。自旋锁应该尽量少使用,并 且每次都要尽可能缩短其使用的时间。关于自旋锁更深入的讨论可参阅“Kernel_Mode Drivers Design Guide”。
分享到:
收藏