MINIPORT_ISR回调函数 (ndis.h)

当 NIC 或与 NIC 共享中断的另一台设备生成中断时,NDIS 调用 MiniportInterrupt 函数。

注意 必须使用 MINIPORT_ISR 类型声明此函数。 有关详细信息,请参阅以下示例部分。
 

语法

MINIPORT_ISR MiniportIsr;

BOOLEAN MiniportIsr(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

参数

[in] MiniportInterruptContext

中断上下文信息块的句柄。 微型端口驱动程序在 微型端口驱动程序传递给 的 MiniportInterruptContext 参数中提供了此句柄 NdisMRegisterInterruptEx 函数。

[out] QueueDefaultInterruptDpc

指向微型端口驱动程序在从此调用返回之前设置的 BOOLEAN 变量的指针。 微型端口驱动程序将此值设置为 TRUE ,以指示驱动程序需要默认 (当前) CPU 上的 DPC。 如果此值设置为 TRUE,NDIS 将忽略 TargetProcessors 参数的值。 如果设置为 FALSE,则 NDIS 使用 TargetProcessors 参数的值来计划 DPC。 如果 QueueDefaultInterruptDpcTRUE,则 NDIS 将计划 DPC,而不考虑 MiniportInterrupt 的返回值。

[out] TargetProcessors

一个位掩码,指示 NDIS 应为其计划 DPC 的目标处理器。 此位掩码表示处理器组 0 中的前 32 个处理器。 位掩码中的每个位都标识一个 CPU。 如果调用方设置位 0,则 NDIS 为 CPU 0 计划 DPC。 如果调用方设置第 1 位,则 NDIS 会为 CPU 1 计划 DPC,依依此。 如果 QueueDefaultInterruptDpc 设置为 FALSE 并且 TargetProcessors 设置为零,则 NDIS 不会计划任何 DPC。 否则,NDIS 将计划 DPC,而不考虑 MiniportInterrupt 的返回值。

注意 NDIS 6.20 及更高版本的驱动程序不应使用此参数来计划 DPC。 相反,他们应将此参数设置为零,并使用 NdisMQueueDpcEx 函数来计划 DPC。
 

返回值

MiniportInterrupt 返回以下值之一:

返回代码 说明

MiniportInterrupt 确定基础 NIC 生成了中断。

MiniportInterrupt 确定基础 NIC 未生成中断。

 
注意无论 MiniportInterrupt 返回的值如何,NDIS 都将基于 QueueDefaultInterruptDpcTargetProcessors 参数中指定的值对 DPC 进行排队。 但是, MiniportInterrupt 仍必须返回正确的值。
 

注解

NdisMRegisterInterruptEx 函数注册中断的微型端口驱动程序必须提供 MiniportInterrupt 函数。

微型端口驱动程序应在其 MiniportInterrupt 函数中尽可能少地执行工作。 它应将 NIC 生成的中断的 I/O 操作延迟到 MiniportInterruptDPC 函数。

当 NIC 的中断线路上发生中断时,NDIS 会调用微型端口驱动程序的 MiniportInterrupt 函数。

所有 NIC 都可以与 I/O 总线上的其他设备共享基于线路的中断。 如果 NIC 未生成中断, MiniportInterrupt 应立即返回 FALSE ,以便系统可以调用生成中断的设备驱动程序。 如果 QueueDefaultInterruptDpc 设置为 FALSE 并且 TargetProcessors 参数设置为零,则 NDIS 不会计划任何 DPC。 否则,无论MiniportInterrupt 的重新 MiniportInterrupt转值如何,NDIS 都将计划 DPC。

如果中断针对 NIC,MiniportInterrupt 会消除 NIC 上的中断,保存它必须的有关中断的任何状态,并将尽可能多的 I/O 处理延迟到 MiniportInterruptDPC 函数。

如果基础 NIC 生成了指定的中断,并且微型端口驱动程序将请求延迟过程调用 (DPC) ,则微型端口驱动程序应禁用 NIC 中的所有进一步中断,并在所有 DPC 完成后重新启用中断。

微型端口驱动程序应将 QueueDefaultInterruptDpc 设置为 TRUE ,以便仅为默认 CPU 计划 DPC。 驱动程序可以执行此操作,例如,如果:

  • NIC 生成了中断以发出发送操作完成的信号,或其他任何未在其他 CPU 上运行的请求。
  • NIC 生成了中断来发出接收的数据信号,微型端口驱动程序无法在单独的 DPC 中处理收到的数据包。
  • 中断指示接收的数据包,微型端口驱动程序可以在单独的 DPC 中处理收到的数据包,但接收 端缩放 (RSS) 未为微型端口驱动程序启用。 有关详细信息,请参阅 OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS
如果微型端口驱动程序在单独的 DPC 中处理收到的数据包,则驱动程序会将 QueueDefaultInterruptDpc 参数设置为 FALSE。 微型端口驱动程序应为与每个非空接收队列关联的 CPU 设置 TargetProcessors 位。 NDIS 将在每个指示的 CPU 上计划一个 DPC。
注意无论 MiniportInterrupt 返回的值如何,NDIS 都将基于 QueueDefaultInterruptDpcTargetProcessors 参数中指定的值对 DPC 进行排队。 但是, MiniportInterrupt 仍必须返回正确的值。
 
如果 MiniportInterrupt 将资源(如 NIC 寄存器或状态变量)与另一个以较低 IRQL 运行的 MiniportXxx 函数共享,则 MiniportXxx 函数必须调用 NdisMSynchronizeWithInterruptEx 函数。 这可确保驱动程序的 MiniportSynchronizeInterrupt 函数以同步且多处理器安全的方式访问共享资源。

微型端口驱动程序可以调用 NdisMDeregisterInterruptEx 函数从其 MiniportInitializeExMiniportHaltEx 函数释放它使用 NdisMRegisterInterruptEx 分配的资源。 NdisMDeregisterInterruptEx 返回后,NDIS 不会调用微型端口驱动程序的 MiniportInterruptMiniportInterruptDPC 函数。

NDIS 在微型端口驱动程序在上一次调用 NdisMRegisterInterruptEx 中注册的中断的 DIRQL 调用 MiniportInterrupt。 因此, MiniportInterrupt 必须调用 NDIS 函数的子集,例如 NdisRawXxxNdisRead/WriteRegisterXxx 函数,这些函数在任何 IRQL 中可安全调用。

示例

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

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

MINIPORT_ISR MyInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

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

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

要求

要求
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
目标平台 Windows
标头 ndis.h (包括 Ndis.h)
IRQL 请参阅“备注”部分

另请参阅

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

接收方伸缩 (RSS)