概述
警告
对于所有 NDIS 6.83 及更高版本的驱动程序,不建议执行检查挂起(CFH)和重置操作。 有关详细信息,请参阅 NDIS 6.83 及更高版本中的 Check-for-Hang 和 Reset作。
NDIS 调用 NDIS 微型端口驱动程序的 MiniportCheckForHangEx 函数来检查表示网络接口卡(NIC)的 NDIS 适配器的作状态。 MiniportCheckForHangEx 检查适配器的内部状态,如果检测到适配器未正常运行,则返回 TRUE 。
默认情况下,NDIS 大约每 2 秒调用 MiniportCheckForHangEx 。 如果 MiniportCheckForHangEx 返回 TRUE,NDIS 将调用 NDIS 微型端口驱动程序的 MiniportResetEx 函数。 如果默认超时值 2 秒太小,则微型端口驱动程序可以在初始化时设置不同的值,如下所示:
- 将NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES结构的 CheckForHangTimeInSeconds 成员设置为非零值。
- 在 NdisMSetMiniportAttributes 函数的 MiniportAttributes 参数中传递NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES结构。
有关设置驱动程序属性的详细信息,请参阅 初始化适配器。 CheckForHangTimeInSeconds 的值应大于微型端口驱动程序的初始化时间。 但是,如果驱动程序的初始化时间超过 CheckForHangTimeInSeconds 秒,则此超时将过期,导致 NDIS 调用驱动程序的 MiniportCheckForHangEx 函数。 如果 MiniportCheckForHangEx 返回 TRUE,NDIS 将调用驱动程序的 MiniportResetEx 函数。 因此,应将驱动程序的 MiniportCheckForHangEx 函数与驱动程序初始化同步,以便在驱动程序尚未完成初始化时 ,MiniportCheckForHangEx 不会返回 TRUE 。
如果微型端口驱动程序未在连续两次调用 MiniportCheckForHangEx 内完成 OID 请求,NDIS 可以调用驱动程序的 MiniportResetEx 函数。 对于某些 OID 请求,如果驱动程序未在连续四次调用 MiniportCheckForHangEx 内完成请求,NDIS 将调用 MiniportResetEx。
重置操作不会影响 微型端口适配器的操作状态。 此外,在重置作正在进行时,适配器的状态可能会更改。 例如,当正在进行重置作时,NDIS 可能会调用驱动程序的 MiniportPause 函数。 在这种情况下,驱动程序可以按任意顺序完成重置或暂停操作,同时满足每个操作的正常要求。
对于重置操作,驱动程序可以使传输请求数据包失败,或者将它们排队,稍后再完成。 但是,应注意,上层驱动程序在其传输数据包挂起时无法完成暂停操作。
微型端口驱动程序可以通过返回成功或失败状态同步完成重置请求。 驱动程序可以通过返回 NDIS_STATUS_PENDING异步完成重置请求。 在这种情况下,驱动程序必须调用 NdisMResetComplete 来完成作。
在 NDIS 6.83 及更高版本中检查挂起情况和重置操作
在版本 6.83 之前的 NDIS 中,由于电池寿命问题,不建议 Always On、Always Connected(AOAC)系统进行 Check-for-Hang(CFH)和重置操作。 但是,驱动程序仍可以通过实现可选的 MiniportCheckForHangEx 和 MiniportResetEx 回调函数在其他非 AOAC Windows 系统上使用 CFH。
从 NDIS 6.83 开始,无论电源功能如何,所有 Windows 系统上都不建议 使用这些 回调函数。 尽管 NDIS 6.83 及更高版本中使用 CFH 不是徽标测试冲突,但 NDIS 驱动程序应使用下表来指导其用法。
| 呼叫者 | 建议 | 注释 |
|---|---|---|
| 面向 AOAC 系统的驱动程序 | 禁止实施 | 由于定期检测挂起进程而导致电池使用时间问题 |
| 面向 Windows Server 系统的驱动程序 | 不得实现 | 在 CPU 受到压力时导致问题 |
| 虚拟(仅限软件)微型端口驱动程序 | 不得实现 | 在没有硬件的情况下无法重置 |
| 其他新的 NDIS 6.83 及更高版本的驱动程序 | 不应实现 | |
| 其他现有 NDIS 6.82 及更早代码 | 不需要更改,但应考虑在未来的重新设计中移除 Check-for-Hang 和 Reset |