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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0基础学习区块链技术——链之间数据同步样例

我们可以在https://blockchaindemo.io/体验这个过程。 创建区块 默认第一个链叫Satoshi(中本聪)。链上第一个区块叫“创世区块”——Genesis Block。后面我们会看到创建的第二条链第一个区块也是如此。 新增链 新创建的链叫Debby。默认上面有一个创世区块。 然后我们让这…

可视化数据科学平台在信贷领域应用系列一:数据探索

引言 信贷风险数据建模是金融机构在数据量日益庞杂的时代进行信贷业务风控的关键技术。它能够帮助机构更好地控制风险、减少违约损失,并提高业务效率。通过不断优化建模方法和利用建模工具,金融机构的风险控制能力得到了显著提升。 在本文中,…

python数据分析——逻辑回归

参考资料:活用pandas库 逻辑回归 当响应变量为二值响应变量时,经常使用逻辑回归对数据建模。 # 导入pandas库 import pandas as pd # 导入数据集 acspd.read_csv(r"...\data\acs_ny.csv") # 展示数据列 print(acs.columns) # 展示数据集 pri…

MongoDB CRUD操作:可重试写入

MongoDB CRUD操作:可重试写入 文章目录 MongoDB CRUD操作:可重试写入使用的先决条件部署的限制支持的存储引擎3.6 MongoDB 驱动程序MongoDB 版本写确认 可重试写入和多文档事务启用可重试写入MongoDB驱动mongosh 可重试的写操作行为持续的网络错误故障切…

Python版《消消乐》,附源码

曾经风靡一时的消消乐,至今坐在地铁上都可以看到很多人依然在玩,想当年我也是大军中的一员,那家伙,吃饭都在玩,进入到高级的那种胜利感还是很爽的,连续消,无限消,哈哈,现…

开源数据库同步工具DBSyncer-数据库的连接

开源数据库同步工具DBSyncer使用的是什么数据库呢? 查看连接信息,如下: 如上图可知,DBSyncer支持两种方式的数据库连接方式, #storage #数据存储类型:disk(默认)/mysql(推荐生产环境使用) #disk-磁盘:/data/config(驱…

基于Java的敬老院管理系统设计和实现(论文 + 源码)

【免费】基于Java的敬老院管理系统设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89399326 基于Java的敬老院管理系统设计和实现 摘 要 新世纪以来,互联网与计算机技术的快速发展,我国也迈进网络化、集成化的信息大数据时代。对于大众而言,单机应用早…

Git版本控制:核心概念、操作与实践

Git是一种分布式版本控制系统,被广泛应用于软件开发过程中。本文将介绍Git的核心概念、常用操作以及最佳实践,帮助读者掌握Git的基本技巧,提高团队协作效率。 一、引言 在软件开发过程中,版本控制是至关重要的。它能帮助我们跟踪…

推导Hessian of XPBD

记 M后面新增的部分为H H − ∂ 2 C ∂ x 2 λ H - \frac{\partial^2 C}{\partial x^2} \lambda H−∂x2∂2C​λ 那么如何求C的二阶导数呢 使用 https://www.matrixcalculus.org/

java自学阶段二:JavaWeb开发--day80(项目实战2之苍穹外卖)

《项目案例—黑马苍穹外卖》 目录: 学习目标项目介绍前端环境搭建(前期直接导入老师的项目,后期自己敲)后端环境搭建(导入初始项目,新建仓库使用git管理项目,新建数据库,修改登录功能&#xff…

如何以定投策略投资场外个股期权?

场外个股期权为投资者提供了一种灵活且富有潜力的投资工具。与传统的投资方式不同,场外个股期权以其低门槛、高灵活性和潜在的较高回报吸引了众多投资者。对于希望长期稳健增值的投资者来说,利用定投策略来投资场外个股期权是一个值得考虑的选项。 文章…

mathematica中三维画图中标记函数的最大值点

示例代码&#xff1a; Clear["*"]; f[x_, y_] : -(x - 1)^2 - (y 1)^2;(*找到最大值点*) maxPoint Maximize[{f[x, y], -10 < x < 10 && -10 < y < 10 && x^2 y^2 < 10}, {x, y}](*绘制3D图形并标记最大值点*) Y1 Plot3D[f[x, y…

gravis,一个无敌的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - gravis。 Github地址&#xff1a;https://github.com/robert-haas/gravis 在数据科学和机器学习领域&#xff0c;数据的可视化是一个非常重要的环节。通过可视化&#xff…

每日一题33:数据统计之广告效果

一、每日一题 返回结果示例如下&#xff1a; 示例 1&#xff1a; 输入&#xff1a; Ads 表: ------------------------- | ad_id | user_id | action | ------------------------- | 1 | 1 | Clicked | | 2 | 2 | Clicked | | 3 | 3 | Viewed…

AI智能体|一分钟教你学会使用扣子Coze工作流

大家好&#xff0c;我是无界生长&#xff0c;国内最大AI付费社群“AI破局俱乐部”初创合伙人。这是我的第 38 篇原创文章——《AI智能体&#xff5c;一分钟教你学会使用扣子Coze工作流》 AI智能体&#xff5c;一分钟教你学会使用扣子Coze工作流本文详细解释了Coze工作流的基本…

C语言 | Leetcode C语言题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; int minCut(char* s) {int n strlen(s);bool g[n][n];memset(g, 1, sizeof(g));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) && g[i 1][j - 1];}}int f[n];for (int i 0; i <…

实习面试题(答案自敲)、

1、为什么要重写equals方法&#xff0c;为什么重写了equals方法后&#xff0c;就必须重写hashcode方法&#xff0c;为什么要有hashcode方法&#xff0c;你能介绍一下hashcode方法吗&#xff1f; equals方法默认是比较内存地址&#xff1b;为了实现内容比较&#xff0c;我们需要…

vscode+latex设置跳转快捷键

安装参考 https://blog.csdn.net/Hacker_MAI/article/details/130334821 设置默认recipe ctrl P 打开设置&#xff0c;搜索recipe 也可以点这里看看有哪些配置 2 设置跳转快捷键

一篇文章讲透数据结构之树and二叉树

一.树 1.1树的定义 树是一种非线性的数据结构&#xff0c;它是有n个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 在树中有一个特殊的结点&#xff0c;称为根结点&#xff0c;根结点…

python学习笔记-04

高级数据类型 一组按照顺序排列的值称为序列&#xff0c;python中存在三种内置的序列类型&#xff1a;字符串、列表和元组。序列可以支持索引和切片的操作&#xff0c;第一个索引值为0表示从左向右找&#xff0c;第一个索引值为负数表示从右找。 1.字符串操作 1.1 切片 切片…