MINIPORT_ISR回调函数 (ndis.h)
当 NIC 或与 NIC 共享中断的另一台设备生成中断时,NDIS 调用 MiniportInterrupt 函数。
语法
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。 如果 QueueDefaultInterruptDpc 为 TRUE,则 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 的返回值。
返回值
MiniportInterrupt 返回以下值之一:
返回代码 | 说明 |
---|---|
|
MiniportInterrupt 确定基础 NIC 生成了中断。 |
|
MiniportInterrupt 确定基础 NIC 未生成中断。 |
注解
向 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。
微型端口驱动程序可以调用 NdisMDeregisterInterruptEx 函数从其 MiniportInitializeEx 或 MiniportHaltEx 函数释放它使用 NdisMRegisterInterruptEx 分配的资源。 NdisMDeregisterInterruptEx 返回后,NDIS 不会调用微型端口驱动程序的 MiniportInterrupt 或 MiniportInterruptDPC 函数。
NDIS 在微型端口驱动程序在上一次调用 NdisMRegisterInterruptEx 中注册的中断的 DIRQL 调用 MiniportInterrupt。 因此, MiniportInterrupt 必须调用 NDIS 函数的子集,例如 NdisRawXxx 或 NdisRead/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 | 请参阅“备注”部分 |