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模块的配置不受影响。

  • 43
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值