NDIS网络接口

在windows发行版本中,真的存在一个 ndis.sys 的驱动文件,和我们认知的不太一样,它真的是一个DLL,NDIS 库打包在 Ndis.sys(一个内核模式导出库)中,作为一组函数,强调宏以获得最佳性能。 导出库是一个.sys文件,其功能类似于动态链接库。所有 NDIS 驱动程序都将自身链接到 NDIS 库。 

WDK 提供 Ndis.h 作为微型端口驱动程序的main头文件。 此文件定义微型端口驱动程序、NDIS 库函数和常见数据结构的入口点。

为了支持管理信息库 (MIB) ,NDIS 管理本地计算机的网络接口信息集合。 NDIS 接口提供程序向 NDIS 提供有关某些网络接口的信息。 NDIS 提供代理接口提供程序,用于注册接口并处理微型端口适配器和Filter模块的接口提供程序请求。 因此,不需要将 NDIS 驱动程序设置为网络接口提供程序。

但是,所有 NDIS 网络驱动程序类型都可以注册为接口提供程序。 此类驱动程序注册网络接口并提供回调函数来响应接口 OID 请求。 NDIS 接口提供程序通常提供有关 NDIS 无法直接访问且不受 NDIS 代理接口提供程序支持的接口的信息。 例如,MUX 中间驱动程序可以在其虚拟微型端口和基础适配器之间具有内部接口。

NDIS 网络接口服务

NDIS 网络接口编程接口为每个接口生成本地唯一标识符 ( NET_LUID) 。 NET_LUID值:

  • 计算机重启时必须保留。 接口提供程序必须使NET_LUIDs持久性,即使关联的接口不是永久性的。 例如,此持久性允许接口提供程序在发生计算机电源故障时释放NET_LUID索引;
  • (24 位值生成本地唯一的接口索引,该值也称为每个接口的 IfIndex。 IfIndex 值具有以下属性:
  • 必须与 RFC 2863中的接口类型  IfType 相关联。
  • 在本地计算机上必须是唯一的。
  • 可以转换为文本表示形式,因为NET_LUID等效于 RFC 2863中的 ifName 接口名称。
  • 24 位值生成本地唯一的接口索引,该值也称为每个接口的 IfIndex首选低数字。 例如,NDIS 重复使用可用的最低接口索引。
  • 当计算机重启时,IfIndex 值不会保留。
  • NET_LUID值与 IfIndex 值之间存在一对一对应关系。
  • 在接口索引、NET_LUID值和“友好名称”之间映射 (例如,在网络连接文件夹) 中显示的友好名称。
  • 定义驱动程序堆栈中接口的分层顺序。
  • 查询和设置 NDIS 驱动程序管理以及 RFC 2863 和 2864 指定的接口属性和表。
NDIS 网络接口体系结构

NDIS 提供一组服务来支持网络接口和接口堆栈。 在 WDK 中,这组服务称为 NDIS 网络接口 (NDISIF) 服务。

下图显示了 NDIS 6.0 及更高版本的 NDISIF 体系结构:

体系结构的 NDISIF 组件包括:

  • NDIS IF 服务: 一个 NDIS 组件,用于处理接口提供程序和接口的注册,实现 OID 查询并为接口提供程序设置服务,并提供其他 NDISIF 服务。
  • NDIS IF 提供程序接口:NDIS IF 服务组件提供的接口,使 NDIS 驱动程序能够实现接口提供程序。
  • NDIS 代理接口提供程序:一个 NDIS 组件,它代表每个微型端口适配器的 NDIS 微型端口驱动程序 (实现 NDISIF 提供程序服务,) 并为每个Filter模块) (Filter驱动程序。
  • 接口提供程序为 NDIS 代理接口提供程序组件无法提供的接口提供 NDISIF 提供程序服务的 NDIS 驱动程序 。例如,MUX 中间驱动程序可以在其虚拟微型端口和基础适配器之间具有内部接口。NDIS 代理接口提供程序使用标准 NDIS 微型端口驱动程序和 NDIS Filter驱动程序接口为微型端口适配器和Filter模块提供 NDISIF 服务。 因此,微型端口驱动程序和Filter驱动程序不需要注册为接口提供程序。
NDIS 接口提供程序操作

所有 NDIS 驱动程序都可以注册为接口提供程序。 每当驱动程序 或 NDIS 代理接口提供程序检测到引入计算机的新接口时,它都会分配 NET_LUID 索引,注册接口,并将关联的NET_LUID值保留在持久性存储 (如注册表) 。 以下列表介绍了如何向计算机引入新接口的几个示例:

安装网络适配器(中间驱动程序的虚拟适配器或物理适配器)。 在这种情况下,NDIS 代理接口提供程序管理接口。

附加Filter模块。 在这种情况下,NDIS 代理接口提供程序管理接口。

MUX 中间驱动程序内部绑定。 MUX 中间驱动程序应实现 NDIS 提供程序服务来处理这种情况,因为内部接口对 NDIS 不可见。

当计算机随后重新启动时,如果接口是永久性的,则接口提供程序不应为同一接口分配新的 NET_LUID ;相反,接口提供程序应使用以前存储NET_LUID值来注册相同的接口。 此外,即使接口不是永久性的,如果计算机电源故障,接口提供程序也必须释放NET_LUID索引。 因此,接口提供程序应将NET_LUID存储在持久性存储 中,例如注册表。

如果接口提供程序检测到某个接口正在关闭,则应取消注册该接口。

注意 NDIS 代理提供程序在卸载微型端口适配器时取消注册微型端口适配器的接口,并在分离模块时筛选模块。

例如,如果接口提供程序检测到接口正在完全删除 ,则会通知 NDIS 代理提供程序正在卸载微型端口适配器,接口提供程序将取消注册该接口并释放NET_LUID索引。 分离Filter模块时,NDIS 代理提供程序还会释放NET_LUID索引。

在运行时,接口提供程序处理它们注册的接口的 OID 请求。 NDIS 代理接口提供程序可能会向基础驱动程序发出 OID 请求以获取接口信息。

注册为接口提供程序

NDIS 接口提供程序是一个软件组件,它提供和管理 NDIS 网络接口的信息。 例如,协议驱动程序、MUX 中间驱动程序和 NDIS 是接口提供程序。 (NDIS 为微型端口驱动程序和Filter驱动程序提供代理接口提供程序。但是,微型端口驱动程序和Filter驱动程序也可以是接口提供程序。每个接口提供程序调用 NdisIfRegisterProvider 函数以注册为网络接口提供程序。

如果对 NdisIfRegisterProvider 的调用成功,NdisIfRegisterProvider 会在 pNdisProviderHandle 参数指定的地址处返回句柄。 调用方在后续调用中使用此句柄(例如,注册接口的时候)。 ProviderCharacteristics 参数指向一个 NDIS_IF_PROVIDER_CHARACTERISTICS 结构,该结构包含提供程序的入口点来处理 OID 查询和设置请求。 NDIS_IF_PROVIDER_CHARACTERISTICS 包括以下查询和设置函数:

  • ProviderQueryObject
  • ProviderSetObject

NDIS 驱动程序可以调用 NdisIfDeregisterProvider 函数以取消注册作为网络接口提供程序。 例如,卸载 NDIS 驱动程序时,应将其取消注册为接口提供程序。 接口提供程序必须确保在调用 NdisIfDeregisterProvider 之前未注册任何接口。 提供程序在调用 NdisIfDeregisterProviderProvider 后,不得使用它在 NdisIfDeregisterProvider 的 NdisProviderHandle 参数中传递的提供程序句柄。 

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值