NDIS协议驱动(三)

news2024/11/17 17:31:51

协议驱动程序源自发送请求并处理基础驱动程序的接收指示。 在单个函数调用中,NDIS 协议驱动程序可以在每个 NET_BUFFER_LIST 结构上发送具有多个 NET_BUFFER 结构的多个NET_BUFFER_LIST结构。 在接收路径中,协议驱动程序可以接收NET_BUFFER_LIST结构的列表。

协议驱动程序必须管理发送缓冲池。 正确管理此类池需要预先分配足够的缓冲区空间来优化系统性能。

协议驱动程序缓冲区管理

协议驱动程序必须管理 NET_BUFFER_LIST 结构池,并 NET_BUFFER 发送操作的结构池。 若要创建这些池,驱动程序会调用以下函数:

  • NdisAllocateNetBufferListPool
  • NdisAllocateNetBufferPool

协议驱动程序可以使用以下函数从池中分配结构:

  • NdisAllocateNetBufferAndNetBufferList
  • NdisAllocateNetBufferList
  • NdisAllocateNetBuffer

调用 NdisAllocateNetBufferAndNetBufferList 比调用 NdisAllocateNetBufferList 和 NdisAllocateNetBuffer 更高效。 但是, NdisAllocateNetBufferAndNetBufferList 仅在NET_BUFFER_LIST结构上创建一个NET_BUFFER结构。 若要使用 NdisAllocateNetBufferAndNetBufferList,驱动程序必须在调用 NdisAllocateNetBufferListPool 时将 AllocateNetBuffer 参数设置为 TRUE。

协议驱动程序可以使用 OID 请求来查询基础驱动程序的回填和上下文空间要求。 协议驱动程序应确定处于 “打开” 或“ 正在重启” 状态的绑定的回填和上下文要求。 驱动程序应为整个堆栈分配足够的回填和上下文空间。 如有必要,协议驱动程序可以释放池并将其重新分配为 “正在重启” 状态。

协议驱动程序使用以下函数来释放池:

  • NdisFreeNetBufferListPool;
  • NdisFreeNetBufferPool;

协议驱动程序使用以下函数释放从池中分配的结构:

  • NdisFreeNetBufferList;
  • NdisFreeNetBuffer;

在释放关联的NET_BUFFER_LIST结构之前,驱动程序应释放使用 NdisAllocateNetBuffer 分配NET_BUFFER结构。 当驱动程序为关联的NET_BUFFER_LIST结构调用 NdisFreeNetBufferList 时,将释放使用 NdisAllocateNetBufferAndNetBufferList 分配的NET_BUFFER结构。

从协议驱动程序发送数据

下图演示了协议驱动程序发送操作,该操作涉及驱动程序堆栈中的协议驱动程序、NDIS 和基础驱动程序:

协议驱动程序调用 NdisSendNetBufferLists 函数以发送 在NET_BUFFER_LIST 结构列表中定义的网络数据。

协议驱动程序必须将每个NET_BUFFER_LIST结构的 SourceHandle 成员设置为传递给 NdisBindingHandle 参数的相同值。 绑定句柄提供在基础微型端口驱动程序调用 NdisMSendNetBufferListsComplete 后,NDIS 将NET_BUFFER_LIST结构返回到协议驱动程序所需的信息。

在调用 NdisSendNetBufferLists 之前,协议驱动程序可以设置随 NET_BUFFER_LIST_INFO宏一 起发送请求的信息。 基础驱动程序可以使用 NET_BUFFER_LIST_INFO 宏检索此信息。

一旦协议驱动程序调用 NdisSendNetBufferLists,就会放弃NET_BUFFER_LIST结构和所有关联资源的所有权。 NDIS 调用 ProtocolSendNetBufferListsComplete 函数将结构和数据返回到协议驱动程序。 在将列表传递给 ProtocolSendNetBufferListsComplete 之前,NDIS 可以将多个发送请求中的结构和数据收集到NET_BUFFER_LIST结构的单个链接列表中。

在 NDIS 调用 ProtocolSendNetBufferListsComplete 之前,协议驱动程序发起的发送的当前状态是未知的。 协议驱动程序在调用 NdisSendNetBufferLists 时暂时释放为发送请求分配的所有资源的所有权。 在 NDIS 将结构返回到 ProtocolSendNetBufferListsComplete 之前,协议驱动程序绝不应尝试检查NET_BUFFER_LIST结构或任何关联数据。

ProtocolSendNetBufferListsComplete 执行完成发送操作所需的任何后处理。 例如,协议驱动程序可以通知请求协议驱动程序发送网络数据的客户端发送操作已完成。

当 NDIS 调用 ProtocolSendNetBufferListsComplete 时,协议驱动程序将重新获得与 NetBufferLists 参数指定的NET_BUFFER_LIST结构关联的所有资源的所有权。 ProtocolSendNetBufferListsComplete 可以释放这些资源 (例如,通过调用 NdisFreeNetBuffer 和 NdisFreeNetBufferList) ,或准备在后续调用 NdisSendNetBufferLists 时重复使用。

尽管 NDIS 始终按照传递给 NdisSendNetBufferLists 的协议确定顺序将协议提供的网络数据提交到基础微型端口驱动程序,但基础驱动程序可以随机顺序完成发送请求。 也就是说,每个绑定的协议驱动程序都可以依赖于 NDIS 将协议驱动程序按 FIFO 顺序传递到 NdisSendNetBufferLists 的网络数据提交到基础驱动程序。 但是,任何协议驱动程序都不能依赖基础驱动程序以相同的顺序调用 NdisMSendNetBufferListsComplete 。

在协议驱动程序中接收数据

下图演示了一个基本的接收操作,该操作涉及驱动程序堆栈中的协议驱动程序、NDIS 和基础驱动程序:

NDIS 调用协议驱动程序的 ProtocolReceiveNetBufferLists 函数来处理来自基础驱动程序的接收指示。 NDIS 在基础驱动程序调用接收指示函数后调用 ProtocolReceiveNetBufferLists , (例如 ,NdisMIndicateReceiveNetBufferLists) 来指示接收的网络数据或环回数据。

如果未设置 ProtocolReceiveNetBufferLists 的 ReceiveFlags 参数中的NDIS_RECEIVE_FLAGS_RESOURCES标志,则协议驱动程序将保留NET_BUFFER_LIST结构的所有权,直到调用 NdisReturnNetBufferLists 函数。 如果 NDIS 设置 NDIS_RECEIVE_FLAGS_RESOURCES 标志,则协议驱动程序无法保留 NET_BUFFER_LIST 结构和关联的资源。 set NDIS_RECEIVE_FLAGS_RESOURCES 标志指示基础驱动程序在接收资源上运行不足。 在这种情况下, ProtocolReceiveNetBufferLists 函数应将接收的数据复制到协议分配的存储中,并尽快返回。

注意 NDIS 可以更改基础驱动程序指示的标志。 例如,如果微型端口驱动程序在 NdisMIndicateReceiveNetBufferLists 函数的 ReceiveFlags 参数中设置NDIS_RECEIVE_FLAGS_RESOURCES标志,则 NDIS 可以复制指示的数据,并将副本传递到已清除NDIS_RECEIVE_FLAGS_RESOURCES标志的 ProtocolReceiveNetBufferLists。

注意 如果设置了 NDIS_RECEIVE_FLAGS_RESOURCES 标志,则协议驱动程序必须在链接列表中保留原始 NET_BUFFER_LIST 结构集。 例如,当设置此标志时,驱动程序可能会处理结构,并一次一个地在堆栈上指示它们,但在函数返回之前,它必须还原原始链接列表。

协议驱动程序调用 NdisReturnNetBufferLists 函数,以释放 NET_BUFFER_LIST 结构列表以及关联的 NET_BUFFER 结构和网络数据的所有权。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔部署Java+Vue前后端分离项目

1. 服务器 服务器选择Linux的CentOS7的版本 2. 宝塔Linux面板 2.1 百度搜索宝塔 2.2 进去之后点击立即免费安装 2.3 选择Linux在线安装,输入服务器信息进行安装(也可以选择其他方式) 安装完成之后会弹一个宝塔的应用面板,并附带有登录名称和密码&…

Hugging face win使用教程(二)

1. 将环境迁移到win,可以直接下载修改好的cuda环境https://download.csdn.net/download/liangjiubujiu/89368302?spm1001.2014.3001.5503 2. 修改hugging face的缓存路径 3. 重启pycharm 4. 编写测试代码,注意可能由于网络链接问题,需要关…

OSINT 与心理学:通过开源情报进行剖析和行为分析

在不断发展的心理学领域,人们越来越认识到通过应用开源情报 (OSINT) 方法取得进步的潜力。OSINT 主要以其在安全和情报领域的应用而闻名,并且越来越多地展示其在心理分析和行为分析方面的潜力。本文探讨了 OSINT 和心理学的迷人交叉点,研究如…

基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................................... …

AURIX TC3xx单片机介绍-启动过程介绍3

如下的内容是英文为主,对于TC3xx芯片启动原理不清楚的,可以给我留言,我来解答你们的问题! 3.2.1 Reset类型识别 Reset类型的识别是用来判断上次的复位是Application Reset还是System Reset还是CPU0 Reset。基于复位的原因,启动软件会运行不同的分支逻辑。复位原因可以通…

每日两题 / 131. 分割回文串 42. 接雨水(LeetCode热题100)

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 数据量较小&#xff0c;考虑直接暴力&#xff0c;每次dfs&#xff1a;以bg作为左区间&#xff0c;往右遍历&#xff0c;找到一段回文串区间后&#xff0c;将回文串插入vector<string>&#xff0c;并以下一个下标…

【最优化方法】实验一 熟悉MATLAB基本功能

实验一  熟悉MATLAB基本功能 实验的目的和要求&#xff1a;在本次实验中&#xff0c;通过亲临使用MATLAB&#xff0c;对该软件做一全面了解并掌握重点内容。 实验内容&#xff1a; &#xff11;、全面了解MATLAB系统 &#xff12;、实验常用工具的具体操作和功能 学习建…

PHP:phpmyadmin 将查询数据导出csv

1、输入你的SQL查询出结果 2、查出数据以后拖到最下方【导出】 3、导出CSV

cs61B-sp21 | lab6

cs61B-sp21 | lab6 TODO 1 在 CapersRepository.java 中 static final File CAPERS_FOLDER null; // TODO Hint: look at the join // function in Utils在 Utils.java 我们找到 join 函数&#xff0c;第一个 join 的作用是将 first 和 others 连接起来形成一个路径…

部署LAMP环境

红帽9搭建LAMP 安装Apache 2.安装数据库服务 3.安装php (1)使用IP访问/phpinfo.php 4.安装phpMyAdmin &#xff08;1&#xff09;数据库端口改为学号后五位 &#xff08;2&#xff09;登录phpmyadmin 5.SSH增加一个端口10022&#xff0c;fttp增加两个端口10080和8080 &#xf…

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心&#xff01; 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…

HNU-人工智能-作业3

人工智能-作业3 计科210X 甘晴void 202108010XXX 1.贝叶斯网络 根据图所给出的贝叶斯网络&#xff0c;其中&#xff1a;P(A)0.5&#xff0c;P(B|A)1&#xff0c; P(B|A)0.5&#xff0c; P(C|A)1&#xff0c; P(C|A)0.5&#xff0c;P(D|BC)1&#xff0c;P(D|B, C)0.5&#xff…

链式法则:神经网络前向与反向传播的基石

在深度学习的浪潮中&#xff0c;神经网络以其强大的学习和预测能力&#xff0c;成为解决复杂问题的有力工具。而神经网络之所以能够不断学习和优化&#xff0c;离不开两个核心过程&#xff1a;前向传播和反向传播。其中&#xff0c;链式法则作为微积分学中的一个基本概念&#…

闲鱼电商运营高级课程,一部手机学会闲鱼开店赚钱

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89360471 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-9、怎么寻找优质的货源店铺.mp4 11-10、怎么去选择商品图片.mp4 12-11、商品图片的注意避免事项.mp4 13-12、怎么写标题.mp4 …

C++ 基于vs2019创建并使用动态链接库(dll)

库的基本认识 静态库&#xff08;Static Library&#xff09; 基本概念&#xff1a;静态库是在编译时链接到目标程序中的库文件。它包含了程序运行所需的所有函数和数据&#xff0c;这些函数和数据会被直接嵌入到最终生成的可执行文件中。静态库通常以.a&#xff08;在Unix-l…

三步走,Halo DB 安装指引

前文介绍了国产数据库新星 Halo 数据库是什么&#xff0c; 哈喽&#xff0c;国产数据库&#xff01;Halo DB! ★ HaloDB是基于原生PG打造的新一代高性能安全自主可控全场景通用型统一数据库。 业内首次创造性的提出插件式内核架构设计&#xff0c;通过配置的方式&#xff0c;适…

美光拟投巨资在日本广岛建DRAM厂,目标2027年底投产

美光科技&#xff08;Micron Technology&#xff09;据日本媒体报道&#xff0c;计划在日本广岛县新建一座DRAM芯片生产工厂&#xff0c;目标最快于2027年底投入运营。这一举措标志着美光在增强其内存芯片生产能力方面的又一重大步伐。 报道称&#xff0c;新工厂的总投资规模预…

【CALayer-CALayer的基本属性 Objective-C语言】

一、接下来,我们来说这个Layer啊, 1.首先,Layer能接触到的,就是我们之前说截图啊,就是我们self.view里面,有一个layer属性, [self.view.layer renderInContext:(CGContextRef t)]; 那个里面,有一个layer属性,然后呢,是CALayer类型的, 接下来,我们就来学习一…

union all 以及标量子查询执行计划

SELECT 1, (SELECT ID1 FROM TE WHERE IDA.ID2) FROM .TA A WHERE COLA X UNION ALL SELECT 1, (SELECT ID2 FROM TD WHERE IDA.ID1) FROM .TB A WHERE COLA X UNION ALL SELECT 1,COL2 AS PARENT_UUID FROM .TC a WHERE COLA X 三个union all 看着像是5个table joi…

做好开源快速开发平台研发创新 助力行业高效发展!

随着信息化时代的到来&#xff0c;科技的力量无处不在。为了提高办公效率&#xff0c;很多大中型企业倾向于使用更为先进的软件平台来助力企业降本增效。在众多助力神器之中&#xff0c;开源快速开发平台低代码技术平台深得广大新老客户朋友的喜爱&#xff0c;它与生俱来的优势…