NDIS小端口驱动(九)

news2024/10/6 22:25:46

PCIe设备难免会遇到一些重置设备的请求,例如重置总线的时候,但是由于NIC网卡的多样性,重置设备确实也有许多要注意的地方,另外还有一些包含WDM的NDIS驱动

微型端口驱动程序硬件重置

微型端口驱动程序必须向 NdisMRegisterMiniportDriver 注册 MiniportResetEx 函数。

MiniportResetEx 可以通过调用 NdisMResetComplete 以同步或异步方式完成,请参阅下图:

MiniportResetEx 应:

  • 禁用进一步的中断;
  • 清除与正在进行的任何发送关联的数据。 例如,在用于 DMA设备的总线主直接内存访问的环形缓冲区上,应清除用于发送缓冲区的指针。 反序列化和面向连接的微型端口驱动程序必须为任何排队发送请求返回NDIS_STATUS_REQUEST_ABORTED;
  • 将硬件状态和微型端口驱动程序的内部状态还原到重置操作之前存在的状态;

微型端口驱动程序负责还原设备的硬件状态,但多播地址、数据包筛选器、任务卸载设置和唤醒模式除外。 这些设置由微型端口驱动程序或 NDIS 还原。 微型端口驱动程序通过在 AddressingReset 参数中返回布尔值来确定谁负责还原这些设置。

如果微型端口驱动程序在 AddressingReset 参数中返回 FALSE,微型端口驱动程序会将其多播地址、数据包筛选器、任务卸载设置和唤醒模式还原到其初始状态。 如果微型端口驱动程序在 AddressingReset 中返回 TRUE,则 NDIS 调用无连接微型端口驱动程序的 MiniportOidRequest 函数或面向连接的微型端口驱动程序的 MiniportCoOidRequest 函数来设置以下配置设置:

  • 通过 OID_GEN_CURRENT_PACKET_FILTER的一组请求筛选网络数据包;
  • 通过 OID_802_3_MULTICAST_LIST集请求的多播地址列表;
  • 任务通过 OID_OFFLOAD_ENCAPSULATION集请求卸载封装设置;
  • 通过一组 OID_PNP_ADD_WAKE_UP_PATTERN请求的电源管理唤醒模式。 注意 从 NDIS 6.20 开始,微型端口驱动程序必须还原通过 OID_PM_ADD_WOL_PATTERN 设置的唤醒模式;
微型端口驱动程序停止处理程序

NDIS 微型端口驱动程序必须向 NdisMRegisterMiniportDriver 提供 MiniportHaltEx 函数。

MiniportHaltEx 应撤消 MiniportInitializeEx 执行的所有操作。 例如,NDIS 微型端口驱动程序可能:

  • 释放可用端口;
  • 释放 MiniportInitializeEx 声明的所有硬件资源;
  • 通过调用 NdisMDeregisterInterruptEx 释放中断资源;
  • 释放 MiniportInitializeEx 分配的任何内存;
  • 停止 NIC,除非 MiniportShutdownEx 函数已将 NIC 还原到其初始状态;

下图演示了卸载微型端口驱动程序。


MiniportHaltEx 应在返回之前完成卸载驱动程序所需的操作。 如果微型端口驱动程序具有任何未完成的接收指示 (即已收到它已指示到 NDIS 但 NDIS 尚未返回) 的网络数据, 则 MiniportHaltEx 不得返回,直到此类数据返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数。

上图显示了一组可由 MiniportHaltEx 函数进行的调用。 这些调用只是可以进行的调用的子集。 实际的调用集取决于微型端口驱动程序的先前操作。 如果微型端口驱动程序由于硬件问题或无法获取所需的资源而无法成功初始化网络适配器,则微型端口驱动程序可以在 MiniportInitializeEx 中执行这些相同的调用。 在这种情况下, MiniportInitializeEx 应通过撤消驱动程序以前的操作来卸载驱动程序。 否则, MiniportHaltEx 将撤消 MiniportInitializeEx 的操作。

以下列表描述了反向微型端口驱动程序可能执行的某些操作所需的调用:

  • 如果微型端口驱动程序注册了中断,则应调用 NdisMDeregisterInterruptEx;
  • 如果微型端口驱动程序设置了计时器或计时器,则应为其创建的每个计时器调用 NdisCancelTimerObject 。 如果调用 NdisCancelTimerObject 失败,则计时器可能已触发。 在这种情况下,微型端口驱动程序应等待计时器处理程序完成,然后再从 MiniportHaltEx 返回;
  • 如果微型端口驱动程序使用 NdisAllocateMemoryWithTagPriority 分配了任何内存,则应调用 NdisFreeMemory 来释放该内存;
  • 如果微型端口驱动程序使用 NdisMAllocateSharedMemory 或 NdisMAllocateSharedMemoryAsyncEx 分配了任何内存,则应调用 NdisMFreeSharedMemory 来释放该内存;
  • 如果微型端口驱动程序使用 NdisAllocateNetBufferPool 为数据包描述符池分配并初始化了存储,则它应调用 NdisFreeNetBufferPool 来释放该存储;
  • 如果微型端口驱动程序已分配或保留任何硬件资源,则应返回这些资源。 例如,如果微型端口驱动程序在 NIC 上映射了 I/O 端口范围,则应通过调用 NdisMDeregisterIoPortRange 释放端口;

 NDIS库的下端是WDM框架,或者说大部分内核库的底层都是WDM框架,不过,有一些是特殊的情况,例如1394其实也可以组局域网,好吧,这是非常冷门的知识。

具有 Microsoft Windows 驱动程序模型 (WDM) 较低接口的微型 端口驱动程序也称为 NDIS-WDM 微型端口驱动程序。 这种类型的微型端口驱动程序:

  • 使用 WDM 下边缘;
  • 可以调用 NDIS 和非 NDIS 函数。 但是,如果可能,微型端口驱动程序应调用 NDIS 函数;
  • 可以初始化一个微型端口实例,该实例用于控制连接到特定总线并通过该总线与这些设备通信的设备;

例如,控制通用串行总线 (USB) 或 IEEE 1394 (Firewire) 总线上的设备的微型端口驱动程序必须在其上边缘公开标准 NDIS 微型端口驱动程序接口,并将类接口用于其下边缘的特定总线。 此类微型端口驱动程序通过将 I/O 请求数据包 (IRP) 发送到总线来与连接到总线的设备通信。

包含 WDM 下边缘的微型端口驱动程序

具有 WDM 下边缘的微型端口驱动程序 (NDIS-WDM 微型端口驱动程序) 遵循 WDM 规则,该规则指定 WDM 头文件必须包含在驱动程序的源文件中。 NDIS-WDM 微型端口驱动程序需要 WDM 头文件在其下边缘调用内核模式例程。 通常,NDIS 微型端口驱动程序应仅调用 NDIS 提供的函数。 此限制通过 NDIS 在 NDIS 驱动程序部分的图中环绕 NDIS 微型端口驱动程序的方式显示。 尽管典型的 NDIS 微型端口驱动程序不称为 WDM 驱动程序,但它们间接遵循 WDM 规则,因为 NDIS 本身遵循 WDM 规则。

下图显示了一个 NDIS-WDM 微型端口驱动程序,该驱动程序使用 WDM 下边缘与 USB 驱动程序堆栈进行接口:

以下列表描述了上图所示的组件:

  • IPX/SPX 兼容和 TCP/IP: 使用基础微型端口驱动程序传输数据包的 NDIS 协议驱动程序;
  • NDIS: Ndis.sys 驱动程序,在分层网络驱动程序之间提供标准接口;
  • 适用于 USB 的 NDIS-WDM 微型端口驱动程序: 与 USB 驱动程序堆栈接口的 NDIS-WDM 微型端口驱动程序;
  • USB 客户端驱动程序: 供应商提供的其他 USB 客户端驱动程序;
  • USB 类接口: USB 客户端 驱动程序可用于与 USB 驱动程序堆栈接口的 USB 例程和 I/O 请求 ;
  • USB 驱动程序堆栈: USB 设备的驱动程序堆栈;
注册 WDM 下边缘的微型端口驱动程序函数

具有 WDM 下边缘的微型端口驱动程序必须在其 DriverEntry 例程中调用 NdisMRegisterMiniportDriver 函数,以便向 NDIS 库注册某些入口点函数。 这些入口点函数组成微型端口驱动程序的上边缘,如 初始化微型端口驱动程序中所述。 但是,设置某些入口点函数不需要 WDM 下边缘的微型端口驱动程序。 例如,由于以下原因,未设置以下入口点函数:

  • MiniportInterrupt、 MiniportInterruptDPC、 MiniportEnableInterruptEx 和 MiniportDisableInterruptEx:由于微型端口驱动程序不会从物理网络接口卡 (NIC) 接收中断,因此它不需要这些入口点例程。 当数据包到达用于微型端口驱动程序的总线时,特定总线的驱动程序会收到中断。 然后,总线驱动程序通知微型端口驱动程序。
  • MiniportSharedMemoryAllocateComplete: 由于微型端口驱动程序不分配共享内存,因此未指定完成入口点例程。
  • MiniportCheckForHangEx: 微型端口驱动程序可以依赖 NDIS,根据超时的发送和请求来确定其微型端口实例是否已停止响应,因此通常不需要此例程。
初始化包含 WDM 下边缘的微型端口驱动程序

操作系统加载微型端口驱动程序后,NDIS 调用微型端口驱动程序的 MiniportInitializeEx 函数来初始化微型端口驱动程序管理的微型端口实例。 若要通过具有 WDM 下边缘的微型端口实例进行通信,微型端口驱动程序必须检索特定信息来设置其通信。

初始化此微型端口实例期间,微型端口驱动程序必须调用 NdisMGetDeviceProperty 函数,以检索通过 WDM 接口设置与微型端口实例通信所需的设备对象。 在此调用中,微型端口驱动程序将句柄传递到 MiniportAdapterHandle 参数中的微型端口 实例,以及接收指向 DEVICE_OBJECT 结构的指针的缓冲区。 微型端口驱动程序使用检索到下一个设备对象的指针 ( NextDeviceObject 参数) 来创建和提交 IRP。 

具有 WDM 下边缘的微型端口驱动程序必须是反序列化的微型端口驱动程序。 反序列化微型端口驱动程序在没有足够的资源立即处理这些请求时,会在内部管理自己的发送和接收请求队列;如果微型端口驱动程序未反序列化,则 NDIS 将管理此队列。 NDIS-WDM 微型端口驱动程序必须反序列化,因为它在 NDIS 调用的上下文之外发送和接收数据包。 在初始化微型端口实例期间,NDIS-WDM 微型端口驱动程序必须指定反序列化功能。 所有 NDIS 6.0 及更高版本的微型端口驱动程序都已反序列化。

请注意,NDIS-WDM 微型端口驱动程序不能是中间驱动程序, 在顶部公开微型端口驱动程序接口的驱动程序,在底部为协议驱动程序接口。

WDM 下边缘的实施提示和要求

NDIS-WDM 微型端口驱动程序可以调用 NDIS 和非 NDIS 函数。 例如,这些非 NDIS 函数包括 WDM 内核模式支持特定总线驱动程序接口的例程和函数。

实现 NDIS-WDM 微型端口驱动程序时,请记住以下事项:

1. 生成 NDIS-WDM 微型端口驱动程序需要在包含 Ndis.h 头文件之前定义 NDIS_WDM 标志。 定义 NDIS_WDM 标志可确保 Ndis.h 自动包含相应的 WDM 头文件。 NDIS_WDM 标志应嵌入在微型端口驱动程序源代码的开头,或在微型端口驱动程序的 Sources 文件中设置。 NDIS-WDM 微型端口驱动程序需要 WDM 头文件来调用内核模式例程,例如 IoCallDriver 和 IoAllocateIrp。

2. 特定总线驱动程序接口的函数调用需要该总线驱动程序的头文件。

3. 不建议在同一源文件中包含 NDIS 和非 NDIS 标头,因为它们可能不兼容。 也就是说,应为调用 NDIS 函数的代码和调用非 NDIS 函数的代码创建单独的源文件。

4. NDIS-WDM 微型端口驱动程序应调用相应的 NDIS 函数来分配和释放资源,除非 NDIS-WDM 微型端口驱动程序在以下方案中分配和释放资源:

a. 资源(通常是内存资源)由 NDIS-WDM 微型端口驱动程序分配,稍后由非 NDIS 实体(如总线驱动程序接口)发布;
b. 资源(通常是内存资源)由非 NDIS 实体分配,稍后由 NDIS-WDM 微型端口驱动程序发布;
对于上述方案,NDIS-WDM 微型端口驱动程序应调用相应的 WDM 例程来为非 NDIS 实体分配或释放资源。

编译 WDM 下边缘的标志

必须在 NDIS-WDM 微型端口驱动程序的 Sources 文件中包含以下编译标志,才能生成 NDIS-WDM 微型端口驱动程序:

-DNDIS_WDM=1

指示 NDIS 包含相应的 WDM 头文件,或者,可以在包含 Ndis.h 头文件之前,在微型端口驱动程序的源代码的开头嵌入编译标志。

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

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

相关文章

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器,可以快速将文本内容转换成极具吸引力的视频。操作简单,用户只需输入文字,选择喜欢的样式和模板, “巨日禄”就会…

qemu+gdb调试linux内核

打开CONFIG_DEBUG_INFO,编译内核 通过图形菜单配置该宏,执行make menuconfig。 kernel hacking —> compile-time checks and compiler options —> compile the kernel with debug info 验证是否打开成功,grep -nr “CONFIG_DEBUG_INFO” .config。 打开成功,然后…

初识Spring Boot

初识Spring Boot SpringBoot是建立在Spring框架之上的一个项目,它的目标是简化Spring应用程序的初始搭建以及开发过程。 对比Spring Spring Boot作为Spring框架的一个模块,旨在简化Spring应用程序的初始搭建和开发过程,以下是Spring Boot相对于传统Spri…

【通义千问—Qwen-Agent系列2】案例分析(图像理解图文生成Agent||多模态助手|| 基于ReAct范式的数据分析Agent)

目录 前言一、快速开始1-1、介绍1-2、安装1-3、开发你自己的Agent 二、基于Qwen-Agent的案例分析2-0、环境安装2-1、图像理解&文本生成Agent2-2、 基于ReAct范式的数据分析Agent2-3、 多模态助手 附录1、agent源码2、router源码 总结 前言 Qwen-Agent是一个开发框架。开发…

iZotope RX 11 for Mac:音频修复的终极利器

在音频处理的世界里,纯净与清晰是每一个创作者追求的目标。iZotope RX 11 for Mac,这款专为Mac用户打造的音频修复软件,凭借其卓越的音频修复能力和丰富的功能,已经成为众多音频工程师和音乐制作人的首选工具。 iZotope RX 11 for…

线程生命周期

创建线程的两种方法 1.继承Thread类 2.实现Runnable接口 线程从创建到消亡分为新建、就绪、运行、阻塞、死亡5种状态。 新建状态 创建一个线程就处于新建状态。此时线程对象已经被分配了内存空间,并且私有数据也被初始化,但是该线程还不能运行。 就…

nodeJs学习(第一周)

文章目录 学习总结nodejs基础知识核心模块(内置模块)fs(file-system)文件系统fs增删查改urlQuery String httprequest根据不同的请求路径发送不同的响应结果requireip地址和端口号Content-Type 第三方模块 express登录接口逻辑分析…

【LeetCode:2769. 找出最大的可达成数字 + 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

MySQL--执行计划

一、执行计划 1.介绍 执行计划是sql在执行时,优化器优化后,选择的cost最低的方案 通过desc、explain可以查看sql的执行计划 2.如何查看执行计划 table语句操作的表,在多表时才有意义type查找类型possible_keys可能会用到的索引key最终选择的…

基于python数据挖掘在淘宝评价方面的应用与分析,技术包括kmeans聚类及情感分析、LDA主题分析

随着电子商务的蓬勃发展,淘宝作为中国最大的在线购物平台之一,吸引了大量的消费者进行购物并留下了大量的客户评价。这些客户评价中包含了丰富的消费者意见和情感信息,对于商家改进产品、提升服务质量以及消费者决策都具有重要的参考价值。 …

JVM学习-垃圾回收(一)

什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾如果不及时对内存的垃圾进行清理,垃圾对象所占用的内存空间会一直保留到应用程序结束,被保留的空间无法被其它对象所用,甚至可能导致内存溢…

视频批量剪辑神器大揭秘:一键删减片头片尾,高效打造精彩视频内容!

在数字化时代的浪潮中,视频已经成为人们传递信息、分享生活的重要载体。无论是制作一部精美的宣传片,还是剪辑一段有趣的短视频,视频时长都是至关重要的因素。然而,很多视频创作者在调整视频时长时遇到了困难,耗费了大…

实体-联系图

为了把用户的数据要求清楚、准确地描述出来,系统分析员通常建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点对数据建立的模型。它描述了从用户角度看到的数据,它反映了用户的现实环境, 而且与在软件系统中的实现方法无关。…

计算几何-扫描线算法

1、定义 计算几何中,扫描线算法(Sweep Line Algorithm)或平面扫描算法(Plane Sweep Algorithm)是一种算法模式,虚拟扫描线或扫描面来解决欧几里德空间中的各种问题,一般被用来解决图形面积&am…

Java面试八股之Synchronized和ReentrantLock的区别

Synchronized和ReentrantLock的区别 实现级别: synchronized是Java的一个关键字,属于JVM层面的原生支持,它通过监视器锁(Monitor)来实现同步控制,无需手动获取和释放锁。 ReentrantLock是java.util.conc…

免费插件集-illustrator插件-Ai插件-文本对象和文本段落互转

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行文本对象和文本段落互转。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/878…

【408真题】2009-16

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

计算机毕业设计Hadoop+Hive地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

2024 届本科毕业论文(设计) 基于Hadoop的地震预测的 分析与可视化研究 姓 名:____田伟情_________ 系 别:____信息技术学院___ 专 业:数据科学与大数据技术 学 号:__2011103094________ 指导…

Sam Altman微软Build 2024最新演讲:AI可能是下一个移动互联网

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据

样式 在趋势图中点击某一个柱状图,出现下面的弹窗 代码实现 主要是在趋势图页面代码中,在初始化趋势图的设置中,添加对趋势图监听的点击方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…