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 由于微型端口驱动程序在 MiniportInterrupt 函数的 TargetProcessors 参数中返回位掩码而名为 MiniportInterruptDPC , 则 MiniportDpcContext 为 NULL。
[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 返回之前重新启用 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 及更高版本中受支持。 |
目标平台 | Windows |
标头 | ndis.h (包括 Ndis.h) |
IRQL | DISPATCH_LEVEL |