NDIS网络接口

devtools/2024/9/25 5:33:33/

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 参数中传递的提供程序句柄。 


http://www.ppmy.cn/devtools/46461.html

相关文章

功能强大且专业的PDF转换软件PDF Shaper Professional 14.2

PDF Shaper Professional是一款适用于Windows的程序,可让您在计算机上处理PDF文件。 要开始使用PDF Shaper Professional,您需要在Windows计算机上下载并安装该程序。您还应该有合适的驱动程序和编解码器来处理计算机上的文本和图形。 安装程序后&#…

ansible批量漏洞升级openssh版本

1、ansible宿主机准备好环境,并写好hosts文件 [rootoxidized ansible]# cat hosts [all] 10.10.200.33 10.10.200.34 10.10.200.35跑playbook之前记得提前发送秘钥 ssh-copy-id 10.10.200.33/34/352、下载好安装包,然后编写yml [rootoxidized ansible]…

数字孪生在气象灾害防治中的重要贡献

数字孪生技术在气象灾害防治中正发挥着越来越重要的作用。数字孪生是指通过数字化方式在虚拟空间中构建与现实世界对应的虚拟模型,通过实时数据和模拟技术进行动态映射和交互。利用数字孪生技术,气象部门可以更高效、更精准地监测、预测和应对气象灾害&a…

Docker安装Bitbucket

centos7版本 [rootlocalhost ~]# cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31"…

NLP基础——语言模型(动手学深度学习)

语言模型 联合概率 给定文本序列 x 1 , ⋯ , x t x_1,\cdots,x_t x1​,⋯,xt​,语言模型的目标是估计联合概率 P ( x 1 , ⋯ , x t ) P(x_1,\cdots,x_t) P(x1​,⋯,xt​). 这里的 x t x_t xt​ 可以认为是文本序列在时间步 t t t 处的观测或标签,而…

前端知识1-4:性能优化进阶

性能优化进阶 Navigation Timing API navigationStart / end 表示从上一个文档卸载结束时 > 如果没有上一个文档,这个值和fetchStart相等 unloadEventStart / end 标识前一个网页unload的时间点 redirectStart / end 第一个http重定向发生和结束的时间 fetch…

【上海大学计算机组成原理实验报告】六、内存系统实验

一、实验目的 学习内存访问机制。理解代码和数据的分区存放原理和技术。 二、实验原理 根据实验指导书的相关内容,地址寄存器MAR用来存放要进行读或写的存储器EM的地址。其内容经数据总线DBUS写入,因此必须在数据总线上具有数据后,配合MAR允…

Python中4种读取JSON文件和提取JSON文件内容的方法

在Python中,有几种常用的方法可以用于读取JSON文件并提取数据。以下是四种主要的方法 使用iamn 1oad:0”:这个方法用于格一个包合S0N文档的字符串(enr、wtas典otea实列)反席列化 (0eseia28)为Pm0n%象。例如,如果你有一个ISON格式的字荷电,你…