暂停筛选器模块
为了暂停正在运行的筛选器模块,NDIS 调用筛选器驱动程序的 FilterPause 函数。 筛选器模块在 FilterPause 函数中开始执行时进入暂停状态。
NDIS 暂停筛选器模块作为即插即用操作的一部分,以暂停驱动程序堆栈。 有关暂停驱动程序堆栈的概述,请参阅 暂停驱动程序堆栈。
筛选器驱动程序代表处于 暂停 状态的筛选器模块:
不应产生任何新的接收指示。
有关发送和接收操作的详细信息,请参阅 筛选器模块发送和接收操作。
如果存在筛选器驱动程序发起且 NDIS 尚未完成的接收操作,则筛选器驱动程序必须等待 NDIS 完成此类操作。 暂停操作在 NDIS 针对所有此类未完成的接收指示调用 FilterReturnNetBufferLists 函数之前不会完成。
应返回基础驱动程序立即源自 NDIS 的任何未完成的接收指示。 在驱动程序为此类未完成的接收指示调用 NdisFReturnNetBufferLists 函数之前,暂停操作不会完成。 如果驱动程序将它从基础驱动程序接收的缓冲区排队,则可能存在这些未完成的接收指示。
应通过调用 NdisFReturnNetBufferLists 函数返回基础驱动程序立即源自 NDIS 的新接收指示。 如有必要,驱动程序可以复制接收指示,并在返回它们之前将其排队。
注意 不应为在相应的 FilterReceiveNetBufferLists 调用中设置NDIS_RECEIVE_FLAGS_RESOURCES标志的 NBL 调用调用 NdisFReturnNetBufferLists。 此类 NBR 通过从 FilterReceiveNetBufferLists 例程返回,以同步方式返回到 NDIS。
不应发出任何新的发送请求。
如果存在筛选器驱动程序发起且 NDIS 尚未完成的发送操作,则筛选器驱动程序必须等待 NDIS 完成此类操作。 暂停操作不会完成,直到 NDIS 为所有此类未完成的发送请求调用 FilterSendNetBufferListsComplete 函数。
应通过调用 NdisFSendNetBufferListsComplete 函数立即返回对其 FilterSendNetBufferLists 函数发出的所有新发送请求。 筛选器驱动程序应将每个NET_BUFFER_LIST结构中的 Status 成员设置为NDIS_STATUS_PAUSED。
可以使用 NdisFIndicateStatus 函数提供状态指示。
有关状态指示的详细信息,请参阅 筛选器模块状态指示。
应在其 FilterStatus 函数中处理状态指示。
应在 FilterOidRequest 函数中处理 OID 请求。
有关 OID 请求的详细信息,请参阅 筛选模块 OID 请求。
可以启动 OID 请求。
不应释放驱动程序在附加操作期间分配的资源。
应取消计时器(如果需要停止发送和接收操作)。
有关计时器的详细信息,请参阅 NDIS 6.0 计时器服务。
筛选器驱动程序成功暂停发送和接收操作后,必须完成暂停操作。 筛选器驱动程序可以通过分别从 FilterPause 返回NDIS_STATUS_SUCCESS或NDIS_STATUS_PENDING,以同步或异步方式完成暂停操作。
如果驱动程序返回NDIS_STATUS_PENDING,则必须在完成暂停操作后调用 NdisFPauseComplete 函数。
筛选器驱动程序代表处于 “已暂停” 状态的筛选器模块:
不应产生新的接收指示。
应通过调用 NdisFReturnNetBufferLists 函数返回基础驱动程序立即源自 NDIS 的新接收指示。 如有必要,驱动程序可以复制接收指示,并在返回它们之前将其排队。
不应发起新的发送请求。
应通过调用 NdisFSendNetBufferListsComplete 函数立即返回对其 FilterSendNetBufferLists 函数发出的所有新发送请求。 筛选器驱动程序应将每个NET_BUFFER_LIST结构中的 Status 成员设置为NDIS_STATUS_PAUSED。
可以使用 NdisFIndicateStatus 函数提供状态指示。
应在其 FilterStatus 函数中处理状态指示。
应在 FilterOidRequest 函数中处理 OID 请求。
可以启动 OID 请求。
当筛选器驱动程序处于暂停状态时,NDIS 不会启动其他即插即用操作,例如附加、分离或重启请求。 筛选器驱动程序处于 “已暂停” 状态后,NDIS 可以启动分离或重启请求。 有关如何分离筛选器模块的详细信息,请参阅 分离筛选器模块。 有关如何重启筛选器模块的详细信息,请参阅 启动筛选器模块。