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 返回以下值之一:

返回代码 描述
TRUE

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

FALSE

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

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

言论

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

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

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

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

如果中断适用于 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。
注意, NDIS 将根据 QueueDefaultInterruptDpc 中指定的值对 DPC 进行排队,无论 MiniportInterrupt 返回的值如何,TargetProcessors 参数。 但是,MiniportInterrupt 仍必须返回正确的值。
 
如果 MiniportInterrupt 共享资源(如 NIC 寄存器或状态变量),则另一个在较低 IRQL 上运行的 MiniportXxx 函数,MiniportXxx 函数必须调用 NdisMSynchronizeWithInterruptEx 函数。 这可确保驱动程序的 MiniportSynchronizeInterrupt 函数以同步且多处理器安全的方式访问共享资源。

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

NDIS 调用 MiniportInterrupt,该中断是微型端口驱动程序在上一次调用 NdisMRegisterInterruptEx中注册的中断。 因此,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 及更高版本中受支持。
目标平台 窗户
标头 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)