MINIPORT_INTERRUPT_DPC回调函数 (ndis.h)
如果驱动程序调用 NdisMRegisterInterruptEx 函数来注册中断,微型端口驱动程序必须提供 MiniportInterruptDPC 函数。
语法
MINIPORT_INTERRUPT_DPC MiniportInterruptDpc;
void MiniportInterruptDpc(
[in] NDIS_HANDLE MiniportInterruptContext,
[in] PVOID MiniportDpcContext,
[in] PVOID ReceiveThrottleParameters,
[in] PVOID NdisReserved2
)
{...}
参数
[in] MiniportInterruptContext
中断上下文信息的块句柄。 微型端口驱动程序在 MiniportInterruptContext 参数中提供了此句柄,微型端口驱动程序传递给 NdisMRegisterInterruptEx 函数。
[in] MiniportDpcContext
指向微型端口驱动程序在调用 NdisMQueueDpcEx 或 NdisMQueueDpc 函数时提供的上下文区域的指针。 如果 NDIS 调用 MiniportInterruptDPC 是因为微型端口驱动程序在 MiniportInterrupt 函数的 TargetProcessors 参数中返回了位掩码,则 MiniportDpcContextNULL。
[in] ReceiveThrottleParameters
指向 NDIS_RECEIVE_THROTTLE_PARAMETERS 结构。 此结构指定微型端口驱动程序应在 DPC 中指示的最大 NET_BUFFER_LIST 结构数。
[in] NdisReserved2
保留为 NDIS。
返回值
没有
言论
向 NdisMRegisterInterruptEx 函数注册中断的微型端口驱动程序必须提供 MiniportInterruptDPC 函数。
NDIS 调用 MiniportInterruptDPC 来完成中断的延迟处理。 微型端口驱动程序可以调用 NdisMQueueDpcEx 或 NdisMQueueDpc 函数来请求其他处理器的其他延迟过程调用(DPC)。
微型端口驱动程序确定每个中断的源并采取适当的措施。 例如,如果中断指示传输作完成,微型端口驱动程序将完成挂起的发送请求。 如果中断源是链接状态的更改,微型端口驱动程序会指示指向 NDIS 的新链接状态。 如果有未完成的接收数据包,微型端口驱动程序会指示数据包到 NDIS。
支持 接收方缩放(RSS)的微型端口驱动程序,并启用了该功能,在 miniportInterruptDPC 中检查其接收队列。 如果 NIC 提供此类功能,则 NIC 可能已根据哈希值在单独的队列上排队接收的数据包。 否则,微型端口驱动程序可以将数据包排序为 MiniportInterruptDPC中的单独队列。
MiniportInterruptDPC 调用 NdisMIndicateReceiveNetBufferLists 函数来指示当前处理器上的数据包。 MiniportInterruptDPC 可以识别其他 CPU 所需的处理,并请求 NDIS 在未完成 DPC 的 CPU 上计划 DPC。
如果当前 DPC 在与 MiniportInterrupt 函数相同的 CPU 上运行,微型端口驱动程序应指示无法映射到 CPU 的所有数据包。 如果此 DPC 是上次计划的 DPC,并且它不会请求其他 DPC,MiniportInterruptDPC 应在 NIC 返回之前重新启用中断。
在 NDIS 调用 MiniportInterruptDPC之前,MiniportInterrupt 函数中的 NIC 上通常会禁用中断。 在返回控件之前,MiniportInterruptDPC 可以重新启用中断。 如果微型端口驱动程序在中断被禁用时将其他 DPC 排队,驱动程序应在最后一个 DPC 返回之前启用中断。
微型端口驱动程序应限制在处理 中断 DPC 批处理时所指示的接收缓冲区数, 在所需的时间限制内完成。 中断 DPC 批处理是在 ISR 之后和重新启用中断之前运行的所有 DPC 的集合。
微型端口驱动程序可以调用 NdisMDeregisterInterruptEx 函数从其 MiniportInitializeEx 或 MiniportHaltEx 函数释放其使用 NdisMRegisterInterruptEx分配的资源。 NdisMDeregisterInterruptEx 返回后,NDIS 不会调用微型端口驱动程序的 MiniportInterrupt 或 MiniportInterruptDPC 函数。
NDIS 在 IRQL = DISPATCH_LEVEL 调用 MiniportInterruptDPC。
示例
若要定义 MiniportInterruptDPC 函数,必须先提供一个函数声明来标识要定义的函数类型。 Windows 为驱动程序提供了一组函数类型。 使用函数类型声明函数有助于 驱动程序代码分析、静态驱动程序验证程序(SDV)和其他验证工具查找错误,这是为 Windows作系统编写驱动程序的要求。例如,若要定义名为“MyInterruptDPC”的 MiniportInterruptDPC 函数,请使用 MINIPORT_INTERRUPT_DPC 类型,如以下代码示例所示:
MINIPORT_INTERRUPT_DPC MyInterruptDPC;
然后,按如下所示实现函数:
_Use_decl_annotations_
VOID
MyInterruptDPC(
NDIS_HANDLE MiniportInterruptContext,
PVOID MiniportDpcContext,
PVOID ReceiveThrottleParameters,
PVOID NdisReserved2
)
{...}
MINIPORT_INTERRUPT_DPC 函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations 批注可确保使用应用于头文件中 MINIPORT_INTERRUPT_DPC 函数类型的批注。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数。
有关 Use_decl_annotations的信息,请参阅 批注函数行为。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | NDIS 6.0 及更高版本中受支持。 |
目标平台 | 窗户 |
标头 | ndis.h (包括 Ndis.h) |
IRQL | DISPATCH_LEVEL |