启动筛选器模块

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

如果驱动程序为 FilterSetModuleOptions 提供了入口点,则驱动程序可以更改筛选器模块的部分特征。 有关详细信息,请参阅 数据绕过模式

调用筛选器驱动程序的 FilterRestart 函数时,NDIS 会传递指向NDIS_RESTART_ATTRIBUTES结构的指针,以筛选NDIS_FILTER_RESTART_PARAMETERS结构的 RestartAttributes 成员中的驱动程序。 筛选器驱动程序可以修改基础驱动程序指定的重启属性。 有关如何修改重启属性的详细信息,请参阅 FilterRestart

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

NDIS 启动筛选器模块作为即插即用操作的一部分,以重启驱动程序堆栈。 有关重启驱动程序堆栈的概述,请参阅 重启驱动程序堆栈

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

  • 完成重启正常发送和接收操作所需的任何操作。

    有关发送和接收操作的详细信息,请参阅 筛选模块发送和接收操作

  • 可以读取或写入筛选器模块的可配置参数。

  • 可以接收网络数据指示。 驱动程序可以复制此类数据并将其排队,并稍后将其指示给过度覆盖的驱动程序,也可以放弃数据。

  • 不应启动任何新的接收指示。

  • 应通过调用 NdisFSendNetBufferListsComplete 函数立即拒绝对其 FilterSendNetBufferLists 函数发出的所有新发送请求。 它应将每个 NET_BUFFER_LIST 中的完成状态设置为NDIS_STATUS_PAUSED。

  • 可以使用 NdisFIndicateStatus 函数提供状态指示。

    有关状态指示的详细信息,请参阅 筛选器模块状态指示

  • 应在 FilterOidRequest 函数中处理 OID 请求。

    有关 OID 请求的详细信息,请参阅 筛选模块 OID 请求

  • 不应启动任何新的发送请求。

  • 应通过调用 NdisFReturnNetBufferLists 函数立即向 NDIS 返回新的接收指示。 如有必要,驱动程序可以复制此类接收指示,然后再返回它们。

  • 可以向基础驱动程序发出 OID 请求,以设置或查询更新的配置信息。

  • 应在其 FilterStatus 函数中处理状态指示。

  • 应指示NDIS_STATUS_SUCCESS或失败状态。 如果筛选器模块未重启,NDIS 将分离它,如果它是必需筛选器,则 NDIS 将终止整个驱动程序堆栈。

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

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

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

当筛选器驱动程序处于“正在重启”状态时,NDIS 不会启动其他即插即用操作,例如附加、分离或暂停请求。 筛选器驱动程序处于 “正在运行” 状态后,NDIS 可以启动暂停请求。 有关暂停筛选器模块的详细信息,请参阅 暂停筛选器模块