NDIS Filter开发-Filter启动、暂停和绕过

2024-06-01 07:04

本文主要是介绍NDIS Filter开发-Filter启动、暂停和绕过,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面分别讨论Filter驱动的启动和暂停状态以及所谓“绕过模式”。

启动Filter模块

若要启动已暂停的Filter模块,NDIS 会调用Filter驱动程序的 FilterSetModuleOptions 函数(如果有),然后调用 FilterRestart 函数。 Filter模块在 FilterRestart 函数中开始执行时进入“正在重启”状态。

如果驱动程序为 FilterSetModuleOptions 提供了入口点,则驱动程序可以更改Filter模块的部分特征。 

调用Filter驱动程序的 FilterRestart 函数时,NDIS 会传递指向NDIS_RESTART_ATTRIBUTES结构的指针,以筛选NDIS_FILTER_RESTART_PARAMETERS结构的 RestartAttributes 成员中的驱动程序。 Filter驱动程序可以修改基础驱动程序指定的重启属性。

注意在 NDIS 为堆栈中的任何Filter模块调用 FilterRestart 函数之前,NDIS 为堆栈中的所有Filter模块调用 FilterSetModuleOptions。

NDIS 启动Filter模块作为即插即用操作的一部分,以重启驱动程序堆栈。 

Filter驱动程序代表处于 “正在重启” 状态的Filter模块:

  • 完成重启正常发送和接收操作所需的任何操作;
  • 可以读取或写入Filter模块的可配置参数;
  • 可以接收网络数据指示。 驱动程序可以复制此类数据并将其排队,并稍后将其指示给过度覆盖的驱动程序,也可以放弃数据;
  • 不应启动任何新的接收指示;
  • 应通过调用 NdisFSendNetBufferListsComplete 函数立即拒绝对其 FilterSendNetBufferLists 函数发出的所有新发送请求。 它应将每个 NET_BUFFER_LIST 中的完成状态设置为NDIS_STATUS_PAUSED;
  • 可以使用 NdisFIndicateStatus 函数提供状态指示;
  • 应在 FilterOidRequest 函数中处理 OID 请求;
  • 不应启动任何新的发送请求;
  • 应通过调用 NdisFReturnNetBufferLists 函数立即向 NDIS 返回新的接收指示。 如有必要,驱动程序可以复制此类接收指示,然后再返回它们;
  • 可以向基础驱动程序发出 OID 请求,以设置或查询更新的配置信息;
  • 应在其 FilterStatus 函数中处理状态指示;
  • 应指示NDIS_STATUS_SUCCESS或失败状态。 如果Filter模块未重启,NDIS 将分离它,如果它是必需Filter,则 NDIS 将终止整个驱动程序堆栈;

Filter驱动程序成功重启发送和接收操作后,必须完成重启操作。 Filter驱动程序可以通过分别从 FilterRestart 返回NDIS_STATUS_SUCCESS或NDIS_STATUS_PENDING,以同步或异步方式完成重启操作。

如果驱动程序返回NDIS_STATUS_PENDING,则必须在完成重启操作后调用 NdisFRestartComplete 函数。 在这种情况下,驱动程序会将重启操作的最终状态传递给 NdisFRestartComplete。

重启操作完成后,Filter模块将处于 “正在运行” 状态。 驱动程序恢复正常的发送和接收处理。

当Filter驱动程序处于“正在重启”状态时,NDIS 不会启动其他即插即用操作,例如附加、分离或暂停请求。 Filter驱动程序处于 “正在运行” 状态后,NDIS 可以启动暂停请求。 

暂停Filter模块

为了暂停正在运行的Filter模块,NDIS 调用Filter驱动程序的 FilterPause 函数。 Filter模块在 FilterPause 函数中开始执行时进入暂停状态。

NDIS 暂停Filter模块作为即插即用操作的一部分,以暂停驱动程序堆栈。 

Filter驱动程序代表处于 暂停 状态的Filter模块:

  • 不应产生任何新的接收指示;
  • 如果存在Filter驱动程序发起且 NDIS 尚未完成的接收操作,则Filter驱动程序必须等待 NDIS 完成此类操作。 暂停操作在 NDIS 针对所有此类未完成的接收指示调用 FilterReturnNetBufferLists 函数之前不会完成;
  • 应返回基础驱动程序立即源自 NDIS 的任何未完成的接收指示。 在驱动程序为此类未完成的接收指示调用 NdisFReturnNetBufferLists 函数之前,暂停操作不会完成。 如果驱动程序将它从基础驱动程序接收的缓冲区排队,则可能存在这些未完成的接收指示;
  • 应通过调用 NdisFReturnNetBufferLists 函数返回基础驱动程序立即源自 NDIS 的新接收指示。 如有必要,驱动程序可以复制接收指示,并在返回它们之前将其排队;注意不应为在相应的 FilterReceiveNetBufferLists 调用中设置NDIS_RECEIVE_FLAGS_RESOURCES标志的 NBL 调用调用 NdisFReturnNetBufferLists。 此类 NBR 通过从 FilterReceiveNetBufferLists 例程返回,以同步方式返回到 NDIS;
  • 不应发出任何新的发送请求;
  • 如果存在Filter驱动程序发起且 NDIS 尚未完成的发送操作,则Filter驱动程序必须等待 NDIS 完成此类操作。 暂停操作不会完成,直到 NDIS 为所有此类未完成的发送请求调用 FilterSendNetBufferListsComplete 函数;
  • 应通过调用 NdisFSendNetBufferListsComplete 函数立即返回对其 FilterSendNetBufferLists 函数发出的所有新发送请求。 Filter驱动程序应将每个NET_BUFFER_LIST结构中的 Status 成员设置为NDIS_STATUS_PAUSED;
  • 可以使用 NdisFIndicateStatus 函数提供状态指示;
  • 应在其 FilterStatus 函数中处理状态指示;
  • 应在 FilterOidRequest 函数中处理 OID 请求;
  • 可以启动 OID 请求;
  • 不应释放驱动程序在附加操作期间分配的资源;
  • 应取消计时器(如果需要停止发送和接收操作);

Filter驱动程序成功暂停发送和接收操作后,必须完成暂停操作。 Filter驱动程序可以通过分别从 FilterPause 返回NDIS_STATUS_SUCCESS或NDIS_STATUS_PENDING,以同步或异步方式完成暂停操作。

如果驱动程序返回NDIS_STATUS_PENDING,则必须在完成暂停操作后调用 NdisFPauseComplete 函数。

Filter驱动程序代表处于 “已暂停” 状态的Filter模块:

  • 不应产生新的接收指示;
  • 应通过调用 NdisFReturnNetBufferLists 函数返回基础驱动程序立即源自 NDIS 的新接收指示。 如有必要,驱动程序可以复制接收指示,并在返回它们之前将其排队;
  • 不应发起新的发送请求;
  • 应通过调用 NdisFSendNetBufferListsComplete 函数立即返回对其 FilterSendNetBufferLists 函数发出的所有新发送请求。 Filter驱动程序应将每个NET_BUFFER_LIST结构中的 Status 成员设置为NDIS_STATUS_PAUSED;
  • 可以使用 NdisFIndicateStatus 函数提供状态指示;
  • 应在其 FilterStatus 函数中处理状态指示;
  • 应在 FilterOidRequest 函数中处理 OID 请求;
  • 可以启动 OID 请求;

当Filter驱动程序处于暂停状态时,NDIS 不会启动其他即插即用操作,例如附加、分离或重启请求。 Filter驱动程序处于 “已暂停” 状态后,NDIS 可以启动分离或重启请求。 

数据旁路模式(绕过模式)

Filter驱动程序 数据旁路模式 可提供改进的系统性能。 NDIS 不调用绕过的 FilterXxx 函数。 例如,如果给定的Filter应用程序不需要发送和接收服务,则Filter驱动程序可以绕过发送和接收函数。

Filter驱动程序指定在驱动程序初始化期间调用 NdisFRegisterFilterDriver 函数时可以绕过的函数的默认入口点。 对于默认跳过的函数,入口点为 NULL 。 有关初始化的详细信息,请参阅 初始化Filter驱动程序。

若要在运行时更改绕过状态,驱动程序必须在驱动程序初始化期间为 FilterSetModuleOptions 函数指定入口点。 驱动程序可以初始化NDIS_FILTER_PARTIAL_CHARACTERISTICS结构,并从 FilterSetModuleOptions 的上下文中将新特征传递给 NdisSetOptionalHandlers 函数。

NDIS 在重启操作开始时调用 FilterSetModuleOptions 函数(如果有)。 Filter驱动程序可以为每个Filter模块单独设置绕过模式。 有关详细信息,请参阅 启动Filter模块。

Filter驱动程序可以绕过在 NDIS_FILTER_DRIVER_CHARACTERISTICS 结构中指定的以下可选 FilterXxx 函数:

FilterSendNetBufferLists

FilterSendNetBufferListsComplete

FilterCancelSendNetBufferLists

FilterReturnNetBufferLists

FilterReceiveNetBufferLists

若要将 FilterXxx 函数设置为绕过模式,Filter驱动程序会为该函数的入口点指定 NULL 。 但是,如果驱动程序调用具有关联的 FilterXxx 函数的任何 NDIS 函数,则必须为该 FilterXxx 函数提供入口点。 例如,如果驱动程序调用 NdisFIndicateReceiveNetBufferLists 函数,则必须提供 FilterReturnNetBufferLists 函数。

如果Filter驱动程序指定 FilterSendNetBufferLists 函数并排队发送请求,则它还必须指定 FilterCancelSendNetBufferLists 函数。

如果Filter驱动程序指定 FilterReceiveNetBufferLists 或 FilterReturnNetBufferLists 函数,则驱动程序还必须指定 FilterStatus 函数。

若要在运行时更改其绕过模式设置,Filter驱动程序可以调用 NdisFRestartFilter 函数。 NdisFRestartFilter 计划一个暂停操作,然后是指定Filter模块的重启操作。 当 NDIS 调用 FilterSetModuleOptions 时,Filter驱动程序可以通过调用 NdisSetOptionalHandlers 并指定一组新的入口点来更改该Filter模块的函数。

注意 暂停和重启可能会导致某些网络数据包丢弃在传输路径或接收路径上,或同时删除两者。 如果数据包丢失,则提供可靠传输机制的网络协议可能会重试网络 I/O 操作,但其他不保证可靠性的协议不会重试该操作。

Filter驱动程序可以注册支持可选驱动程序服务的其他可选函数。 驱动程序在 FilterSetOptions 函数中注册这些可选服务。

配置可选的Filter驱动程序服务

NDIS 调用Filter驱动程序的 FilterSetOptions 函数来配置可选的Filter驱动程序服务。 NDIS 在Filter驱动程序调用 NdisFRegisterFilterDriver 函数的上下文中调用 FilterSetOptions

FilterSetOptions 为可选服务所需的可选 FilterXxx 函数注册默认入口点,并且可以分配其他驱动程序资源。 为了注册可选服务,Filter驱动程序调用 NdisSetOptionalHandlers 函数,并在 OptionalHandlers 参数中传递特征结构。

注意当前 Windows 版本(NDIS 6.0)中没有可选的Filter驱动程序服务,但是在未来的版本中,已经有了可选的服务。

Filter驱动程序还可以调用 NdisSetOptionalHandlers ,为给定的Filter模块设置一些 FilterXxx 函数入口点。 

如果Filter驱动程序从 FilterRestart 调用 NdisSetOptionalHandlers,则配置更改仅影响 NDIS 正在重启的Filter模块。 其他Filter模块的配置不受影响。

这篇关于NDIS Filter开发-Filter启动、暂停和绕过的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020301

相关文章

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

C#图表开发之Chart详解

《C#图表开发之Chart详解》C#中的Chart控件用于开发图表功能,具有Series和ChartArea两个重要属性,Series属性是SeriesCollection类型,包含多个Series对... 目录OverviChina编程ewSeries类总结OverviewC#中,开发图表功能的控件是Char

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间