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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块