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

相关文章

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st