没有合适的资源?快使用搜索试试~ 我知道了~
NDIS_中间层驱动程序(IMD)开发人员指南
3星 · 超过75%的资源 需积分: 11 43 下载量 33 浏览量
2013-10-08
20:12:43
上传
评论
收藏 521KB DOC 举报
温馨提示
试读
61页
NDIS_中间层驱动程序(IMD)开发人员指南,熟悉和开始NDIS驱动程序的开发
资源推荐
资源详情
资源评论
目 录
1 NDIS 中间层驱动程序................................................................................................................................3
1.1 NDIS 中间层驱动程序(NDIS Intermediate Drivers)概述...............................................................3
1.2 NDIS 中间层驱动程序的用途.........................................................................................................4
1.3 NDIS 中间层驱动程序的开发环境.................................................................................................5
2 NDIS 中间层驱动程序的开发....................................................................................................................5
2.1 可分页和可丢弃代码.......................................................................................................................5
2.2 共享资源的访问同步.......................................................................................................................5
2.3 中间层驱动程序的 DriverEntry 函数..............................................................................................6
2.3.1 注册 NDIS 中间层驱动程序.................................................................................................7
2.3.1.1 注册中间层驱动程序的 Miniport.............................................................................7
2.3.1.2 注册中间层驱动程序的协议....................................................................................9
2.4 中间层驱动程序的动态绑定.........................................................................................................11
2.4.1 打开中间层驱动程序下层的适配器..................................................................................12
2.4.2 微端口(Miniport)初始化.....................................................................................................13
2.4.3 中间层驱动程序查询和设置操作......................................................................................14
2.4.3.1 发布设置和查询请求..............................................................................................14
2.4.3.2 响应设置和查询请求..............................................................................................15
2.4.4 作为面向连接客户程序注册中间层驱动程序..................................................................16
2.5 中间层驱动程序数据包管理.........................................................................................................17
2.5.1.1 重用数据包..............................................................................................................19
2.6 中间层驱动程序的限制.................................................................................................................20
2.7 中间层驱动程序接收数据.............................................................................................................20
2.7.1 下边界面向无连接的中间层驱动程序接收数据..............................................................20
2.7.1.1 在中间层驱动程序中实现 ProtocolReceivePacket 处理程序...............................21
2.7.1.2 在中间层驱动程序中实现 ProtocolReceive 处理程序..........................................22
2.7.1.3 下边界面向无连接中间层驱动程序接收 OOB 数据信息....................................23
2.7.2 下边界面向连接的中间层驱动程序接收数据..................................................................23
2.7.2.1 在中间层驱动程序中实现 ProtocolCoReceivePacket 处理程序...........................24
2.7.2.2 在下边界面向连接的中间层驱动程序中接收 OOB 数据信息............................24
2.7.3 向高层驱动程序指示接收数据包......................................................................................24
2.8 通过中间层驱动程序传输数据包.................................................................................................25
2.8.1 传递介质相关信息..............................................................................................................26
2.9 处理中间层驱动程序的 PnP 事件和 PM 事件.............................................................................27
2.9.1 处理 OID_PNP_XXX 查询和设置.....................................................................................27
2.9.2 中间层驱动程序 ProtocolPnPEvent 处理程序的实现.......................................................28
2.9.3 处理规定的电源请求..........................................................................................................29
2.9.3.1 睡眠状态的电源设置请求......................................................................................29
2.9.3.2 工作状态的电源设置请求......................................................................................30
2.10 中间层驱动程序复位操作...........................................................................................................30
2.11 中间层驱动程序拆除绑定操作...................................................................................................31
2.12 中间层驱动程序状态指示...........................................................................................................32
3 负载平衡和失效替换................................................................................................................................32
3.1 关于 LBFO......................................................................................................................................33
3.2 指定对 LBFO 的支持.....................................................................................................................33
3.3 在微端口驱动程序上实现 LBFO..................................................................................................34
3.3.1 初始化微端口束..................................................................................................................34
3.3.2 平衡微端口驱动程序的工作量..........................................................................................35
3.3.3 在主微端口失效后提升一个次微端口..............................................................................35
4 安装网络组件............................................................................................................................................35
4.1 用于安装网络组件的组件和文件.................................................................................................35
4.2 创建网络 INF 文件.........................................................................................................................36
4.2.1 网络 INFS 文件名的约定...................................................................................................36
4.2.2 网络 INF 文件的版本节.....................................................................................................37
4.2.3 网络 INF 文件的模型节.....................................................................................................38
4.2.4 INF 文件的 DDInstall 节.....................................................................................................38
4.2.5 删除节..................................................................................................................................40
4.2.6 ControlFlags 节....................................................................................................................40
4.2.7 网络 INF 文件的 add-registry-sections...............................................................................40
NCF_VIRTUAL,NCF_SOFTWARE_ENUMERATED,NCF_PHYSICAL,NCF_MULTIPORT_INSTANC
ED_ADAPTER,NCF_HAS_UI,NCF_HIDDEN,NCF_NOT_USER_REMOVABLE。.............................55
NCF_VIRTUAL,NCF_SOFTWARE_ENUMERATED 和 NCF_PHYSICAL 是相互排斥的。..............55
对于物理适配器,BusType 项是必需的。对 EISA 适配器,EisaCompressedID 项是必需的。这个项
说明了 EISA 压缩 ID 和适配器掩码。多端口网络适配器需要 Port1DeviceNumber 或
Port1FunctionNumber 项。............................................................................................................................55
成。如:MS_DLC。...................................................................................................................................60
表格 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
设备驱动程序开发包
SMP
Symmetry 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 说明了中间层驱动程序结构
图表 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(传输驱动程序)和底层 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.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
共享资源的访问同步
剩余60页未读,继续阅读
资源评论
- agan114232018-02-28还行吧 可以看看
znco_yang
- 粉丝: 0
- 资源: 32
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功