MINIPORT_RESET回调函数 (ndis.h)

警告

所有 NDIS 6.83 及更高版本的驱动程序都不建议使用 MiniportResetExMiniportCheckForHangEx 回调函数。 有关详细信息,请参阅 NDIS 6.83 及更高版本中的 Check-for-Hang 和 Reset 操作

NDIS 调用 NDIS 微型端口驱动程序的 MiniportResetEx 函数,以启动网络接口卡重置 (NIC) 。 有关详细信息,请参阅 微型端口适配器 Check-for-Hang 和 Reset 操作微型端口驱动程序硬件重置

注意 NDIS 微型端口驱动程序可以使用 MINIPORT_RESET 类型声明此函数。
 

语法

MINIPORT_RESET MiniportReset;

NDIS_STATUS MiniportReset(
  [in]  NDIS_HANDLE MiniportAdapterContext,
  [out] PBOOLEAN AddressingReset
)
{...}

参数

[in] MiniportAdapterContext

微型端口驱动程序在其 MiniportInitializeEx 函数中分配的上下文区域的句柄。 微型端口驱动程序使用此上下文区域来维护微型端口适配器的状态信息。

[out] AddressingReset

指向布尔变量的指针。 如果 NDIS 应调用 MiniportOidRequest 函数,将此变量设置为 TRUE,以便将寻址和其他配置设置还原到当前值。 有关详细信息,请参阅 硬件重置

返回值

MiniportResetEx 可以返回以下状态值之一:

返回代码 说明
NDIS_STATUS_SUCCESS

MiniportResetEx 已成功将微型端口适配器重置为操作状态。

NDIS_STATUS_PENDING
驱动程序将在操作完成后调用 NdisMResetComplete 函数以异步方式完成重置操作。
NDIS_STATUS_RESET_IN_PROGRESS

MiniportResetEx 确定当前正在重置微型端口适配器,因此此调用是多余的。

NDIS_STATUS_SOFT_ERRORS
MiniportResetEx 已成功重置微型端口适配器,但在操作过程中发生了可恢复的错误。 MiniportResetEx 应调用 NdisWriteErrorLogEntry 函数,其中包含有关错误的详细信息。
NDIS_STATUS_HARD_ERRORS
MiniportResetEx 尝试重置微型端口适配器,但在操作过程中发生了不可恢复的错误。 MiniportResetEx 应已调用 NdisWriteErrorLogEntry ,其中包含有关错误的详细信息。

注解

驱动程序在调用 MiniportResetEx 入口点时指定 NdisMRegisterMiniportDriver 函数。

中间驱动程序不需要 MiniportResetEx

MiniportResetEx 可以重置微型端口适配器的参数。 如果重置导致微型端口适配器的工作站地址发生更改,微型端口驱动程序会在重置完成后自动还原工作站地址的先前值。 任何多播或功能寻址掩码(由硬件重置)不必在此函数中重置。

如果重置操作更改其他信息(如多播或功能寻址信息), MiniportResetEx 必须在 AddressingReset 处将变量设置为 TRUE ,然后才能返回。 这会导致 NDIS 调用 MiniportOidRequest 函数来还原信息。 NDIS 还通过调用 OID_PNP_ADD_WAKE_UP_PATTERN 还原 LAN (WoL) 模式列表上的唤醒。 驱动程序应从其适配器上下文中释放 WoL 模式列表,因为硬件列表已重置。

NDIS 不会中止任何挂起的 OID 请求或发送请求。 如果驱动程序可以在重置后安全地完成挂起的 OID 或发送请求,驱动程序可以保留挂起的 OID 或发送请求,直到重置操作完成。 否则,驱动程序应通过调用 NdisMOidRequestComplete 或发送请求来完成挂起的 OID 或发送请求 NdisMSendNetBufferListsComplete 函数分别在 MiniportResetEx 返回之前。

注意 从 NDIS 6.30 开始,微型端口驱动程序在重置操作完成后,不得保留挂起的 OID 或发送请求。 相反,驱动程序必须在重置操作完成之前分别调用 NdisMOidRequestCompleteNdisMSendNetBufferListsComplete 函数来完成这些挂起的请求。 如果驱动程序异步完成重置操作,则必须在驱动程序调用 NdisMResetComplete 之前完成挂起的 OID 并发送请求。
 
微型端口驱动程序不应调用 NdisMIndicateStatusEx 函数,以指示每个重置操作的开始和完成。 重置开始和结束时,NDIS 会通知绑定协议驱动程序。

如果在重置操作期间 MiniportResetEx 必须等待微型端口适配器的状态更改,则可以调用 NdisStallExecution 函数。 但是,a
MiniportResetEx 函数不得调用 NdisStallExecution ,时间间隔大于 50 微秒。 如果驱动程序必须等待超过 50 微秒 (,或者如果轮询) ,则应改为设置计时器并返回NDIS_STATUS_PENDING。

如果 MiniportResetEx 返回NDIS_STATUS_PENDING,驱动程序必须通过调用 NdisMResetComplete 函数来完成重置。

如果微型端口适配器处于 MediaConnectStateConnected 状态,并且其状态因重置而更改,包括对 MediaConnectStateUnknown 状态的更改,微型端口驱动程序必须报告状态更改,并带有 NDIS_STATUS_LINK_STATE 状态指示。 微型端口驱动程序还必须指示重置后重新建立链接时的 MediaConnectStateConnected 状态指示。

MiniportResetEx 可以被中断抢占。

NDIS 定期调用 MiniportCheckForHangEx 函数,以确定它是否应调用 MiniportResetEx。 调用 MiniportCheckForHangEx 的默认超时时间为 2 秒。 If this default is too short, a miniport driver can set a larger CheckForHangTimeInSeconds value when calling the
初始化期间 NdisMSetMiniportAttributes 函数。 有关详细信息,请参阅 微型端口适配器 Check-for-Hang 和 Reset 操作

NDIS 无法确定 NIC 是否已停止响应接收操作。 若要处理此类故障, MiniportCheckForHangEx 函数可以监视接收操作,如有必要,返回 TRUE 以强制重置。 微型端口还可以通过调用 NdisMResetMiniport 来请求重置。

NDIS 调用 IRQL <处的 MiniportResetEx = DISPATCH_LEVEL。

示例

若要定义 MiniportResetEx 函数,必须先提供一个用于标识要定义的函数类型的函数声明。 Windows 为驱动程序提供了一组函数类型。 使用函数类型声明函数有助于 代码分析驱动程序静态驱动程序验证程序 (SDV) 和其他验证工具查找错误,这是编写 Windows 操作系统驱动程序的要求。

例如,若要定义名为“ MyResetEx”的 MiniportResetEx 函数,请使用 MINIPORT_RESET 类型,如以下代码示例所示:

MINIPORT_RESET MyResetEx;

然后,按如下所示实现函数:

_Use_decl_annotations_
NDIS_STATUS
 MyResetEx(
    NDIS_HANDLE  MiniportAdapterContext,
    PBOOLEAN  AddressingReset
    )
  {...}

MINIPORT_RESET函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 批注添加到函数定义中。 Use_decl_annotations批注可确保使用应用于头文件中MINIPORT_RESET函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数

有关 Use_decl_annotations的信息,请参阅 批注函数行为

要求

   
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
目标平台 Windows
标头 ndis.h (包括 Ndis.h)
IRQL <= DISPATCH_LEVEL

另请参阅

微型端口适配器挂起检查和重置操作

微型端口驱动程序硬件重置

MiniportCheckForHangEx

MiniportInitializeEx

MiniportOidRequest

NDIS_STATUS_LINK_STATE

NdisMIndicateStatusEx

NdisMOidRequestComplete

NdisMRegisterMiniportDriver

NdisMResetComplete

NdisMResetMiniport

NdisMSendNetBufferListsComplete

NdisMSetMiniportAttributes

NdisStallExecution

NdisWriteErrorLogEntry