MINIPORT_MESSAGE_INTERRUPT回调函数 (ndis.h)
NDIS 在 NIC 生成基于消息的中断时调用 MiniportMessageInterrupt 函数。
语法
MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;
BOOLEAN MiniportMessageInterrupt(
[in] NDIS_HANDLE MiniportInterruptContext,
[in] ULONG MessageId,
[out] PBOOLEAN QueueDefaultInterruptDpc,
[out] PULONG TargetProcessors
)
{...}
参数
[in] MiniportInterruptContext
中断上下文信息的块句柄。 微型端口驱动程序在 MiniportInterruptContext 参数中提供了此句柄,微型端口驱动程序传递给 NdisMRegisterInterruptEx 函数。
[in] MessageId
消息信号中断(MSI)消息标识符。 MessageId 是索引 IO_INTERRUPT_MESSAGE_INFO_ENTRY 结构 IO_INTERRUPT_MESSAGE_INFO 结构。 当驱动程序成功向 NdisMRegisterInterruptEx 函数注册 MSI 时,NDIS 会在 MessageInfoTable 成员处传递指向关联 IO_INTERRUPT_MESSAGE_INFO 结构的指针。
[out] QueueDefaultInterruptDpc
指向微型端口驱动程序在从此调用返回之前设置的布尔变量的指针。 微型端口驱动程序将此值设置为 TRUE,以指示驱动程序需要默认(当前)CPU 上的 DPC。 如果设置为 TRUE,NDIS 将忽略 TargetProcessors 参数的值。 如果设置为 FALSE,NDIS 将使用 TargetProcessors 参数的值来计划 DPC。
[out] TargetProcessors
指示 NDIS 应为其计划 DPC 的目标处理器的位掩码。 此位掩码表示处理器组 0 中的前 32 个处理器。 位掩码中的每个位标识 CPU。 如果调用方设置位 0,NDIS 将为 CPU 0 计划 DPC。 如果调用方设置位 1,NDIS 将为 CPU 1 计划 DPC,依此安排。
返回值
如果基础 NIC 生成中断,则 MiniportMessageInterrupt 返回 TRUE;否则,它将返回 FALSE。
言论
向 NdisMRegisterInterruptEx 函数注册消息信号中断(MSI)支持的微型端口驱动程序必须提供 MiniportMessageInterrupt 函数。
微型端口驱动程序在其 MiniportMessageInterrupt 函数中应尽可能少地执行工作。 它应延迟 NIC 生成的中断的 I/O作 MiniportMessageInterruptDPC 函数。
当 NIC 生成 MSI 时,NDIS 调用微型端口驱动程序的 MiniportMessageInterrupt 函数。
MiniportMessageInterrupt 保存有关中断的所需状态信息,并将尽可能多的 I/O 处理延迟到 MiniportMessageInterruptDPC 函数。
如果微型端口驱动程序请求指定消息的延迟过程调用(DPC),微型端口驱动程序应禁用该消息的所有进一步中断,并在所有 DPC 完成后重新启用中断。
微型端口驱动程序应将 QueueDefaultInterruptDpc 设置为 TRUE,以便仅为默认 CPU 计划 DPC。 驱动程序可以执行此作,例如:
- NIC 生成中断,以指示发送作完成或任何其他未在其他 CPU 上运行的请求。
- NIC 生成中断以发出接收的数据信号,微型端口驱动程序无法处理单独的 DPC 中收到的数据包。
- 中断表示收到的数据包和微型端口驱动程序可以在单独的 DPC 中处理收到的数据包,但未为微型端口驱动程序启用 接收方缩放(RSS)。 有关详细信息,请参阅 OID_GEN_RECEIVE_SCALE_CAPABILITIES 和 OID_GEN_RECEIVE_SCALE_PARAMETERS。
- 为微型端口驱动程序启用了接收端缩放,微型端口驱动程序可以在每个接收队列上生成不同的消息。
如果 MiniportMessageInterrupt 共享指定消息的资源(例如 NIC 寄存器或状态变量),则另一个在较低的 IRQL 上运行的 MiniportXxx 函数,MiniportXxx 函数必须调用 NdisMSynchronizeWithInterruptEx 函数。 这可确保驱动程序的 MiniportSynchronizeMessageInterrupt 函数以同步的多处理器安全方式访问共享资源。
微型端口驱动程序可以调用 NdisMDeregisterInterruptEx 函数从其 MiniportInitializeEx 或 MiniportHaltEx 函数释放其使用 NdisMRegisterInterruptEx分配的资源。 NdisMDeregisterInterruptEx 返回后,NDIS 不会调用微型端口驱动程序的 MiniportMessageInterrupt 或 MiniportMessageInterruptDPC 函数。
NDIS 在 MSI 的 DIRQL 中调用 MiniportMessageInterrupt,微型端口驱动程序在之前调用 NdisMRegisterInterruptEx中注册。 因此,MiniportMessageInterrupt 必须调用 NDIS 函数的子集,例如 NdisRawXxx 或 NdisRead/WriteRegisterXxx 函数,这些函数可以安全地在任何 IRQL 中调用。
示例
若要定义 MiniportMessageInterrupt 函数,必须先提供一个函数声明来标识要定义的函数类型。 Windows 为驱动程序提供了一组函数类型。 使用函数类型声明函数有助于 驱动程序代码分析、静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows作系统编写驱动程序的要求。例如,若要定义名为“MyMessageInterrupt”的 MiniportMessageInterrupt 函数,请使用 MINIPORT_MESSAGE_INTERRUPT 类型,如以下代码示例所示:
MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;
然后,按如下所示实现函数:
_Use_decl_annotations_
BOOLEAN
MyMessageInterrupt(
NDIS_HANDLE MiniportInterruptContext,
ULONG MessageId,
PBOOLEAN QueueDefaultInterruptDpc,
PULONG TargetProcessors
)
{...}
MINIPORT_MESSAGE_INTERRUPT 函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations 批注可确保使用应用于头文件中 MINIPORT_MESSAGE_INTERRUPT 函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数。
有关 Use_decl_annotations的信息,请参阅 批注函数行为。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | NDIS 6.0 及更高版本中受支持。 |
目标平台 | 窗户 |
标头 | ndis.h (包括 Ndis.h) |
IRQL | 请参阅“备注”部分 |
另请参阅
IO_INTERRUPT_MESSAGE_INFO_ENTRYMiniportSynchronizeMessageInterrupt
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS