MINIPORT_MESSAGE_INTERRUPT_DPC回调函数 (ndis.h)

如果微型端口驱动程序调用 NdisMRegisterInterruptEx 函数来注册中断,则微型端口驱动程序必须提供 MiniportMessageInterruptDPC 处理程序。

注意 必须使用 MINIPORT_MESSAGE_INTERRUPT_DPC 类型声明函数。 有关详细信息,请参阅以下示例部分。
 

语法

MINIPORT_MESSAGE_INTERRUPT_DPC MiniportMessageInterruptDpc;

void MiniportMessageInterruptDpc(
  [in] NDIS_HANDLE MiniportInterruptContext,
  [in] ULONG MessageId,
  [in] PVOID MiniportDpcContext,
  [in] PVOID ReceiveThrottleParameters,
       PVOID NdisReserved2 PULONG NdisReserved1,
  [in] PULONG NdisReserved2
)
{...}

参数

[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结构的指针。

[in] MiniportDpcContext

指向微型端口驱动程序在调用 NdisMQueueDpcExNdisMQueueDpc 函数时提供的上下文区域的指针。 如果 NDIS 调用 MiniportMessageInterruptDPC ,因为微型端口驱动程序在 的 TargetProcessors 参数中返回了位掩码 MiniportMessageInterrupt 函数,然后 MiniportDpcContextNULL

[in] ReceiveThrottleParameters

指向 的指针 NDIS_RECEIVE_THROTTLE_PARAMETERS 结构指定微型端口驱动程序应在 DPC 中指示的最大 NET_BUFFER_LIST 结构数。

注意 在 NDIS 6.1 及更早版本中,此参数名为 NdisReserved1,其数据类型为 PULONG,并为 NDIS 保留。
 

NdisReserved1

保留给 NDIS。

[in] NdisReserved2

保留给 NDIS。

注意 在 NDIS 6.1 及更早版本中,此参数的数据类型为 PULONG
 

返回值

备注

NdisMRegisterInterruptEx 函数注册消息信号中断的微型端口驱动程序必须提供 MiniportMessageInterruptDPC 函数。

NDIS 调用 MiniportMessageInterruptDPC 以完成中断的延迟处理。 微型端口驱动程序可以调用 NdisMQueueDpcExNdisMQueueDpc 函数,以请求其他处理器 (DPC) 的其他延迟过程调用。

微型端口驱动程序确定每个中断的源并采取适当的操作。 例如,如果中断指示传输操作已完成,微型端口驱动程序将完成挂起的发送请求。 如果中断的原因是链接状态发生更改,微型端口驱动程序会指示 NDIS 的新链接状态。 如果有未完成的接收数据包,微型端口驱动程序会将数据包指示到 NDIS。

支持 接收端缩放的微型端口驱动程序 (RSS) ,并且已启用该功能,在 MiniportMessageInterruptDPC 中检查其接收队列。 如果 NIC 提供此类功能,则 NIC 可能已根据哈希值将接收的数据包排在单独的队列中。 否则,微型端口驱动程序可以在 MiniportMessageInterruptDPC 中将数据包排序到单独的队列中。

MiniportMessageInterruptDPC 调用 NdisMIndicateReceiveNetBufferLists 函数指示当前处理器上的数据包。 MiniportMessageInterruptDPC 可以确定其他 CPU 所需的处理,并请求 NDIS 在 DPC 未完成的 CPU 上计划 DPC。

如果当前 DPC 运行的 CPU 与 MiniportMessageInterrupt 函数,微型端口驱动程序应指示无法映射到 CPU 的所有数据包。 如果此 DPC 是最后一个计划的 DPC,并且它不会请求其他 DPC, 则 MiniportMessageInterruptDPC 应在 NIC 上重新启用指定消息的中断,然后再返回。

在 NDIS 调用 MiniportMessageInterruptDPC 之前,NIC 上指定消息的中断通常已在 中禁用 MiniportMessageInterrupt 函数。 在它返回控制权之前, MiniportMessageInterruptDPC 可以重新启用中断。 如果微型端口驱动程序在禁用中断时将其他 DPC 排队,则驱动程序应在最后一个 DPC 执行后启用中断。

注意 为了提高性能,微型端口驱动程序应仅禁用特定消息的中断。 它们不应禁用所有消息信号中断。
 
微型端口驱动程序应限制在处理 中断 DPC 批处理 时指示的接收缓冲区数,以便在所需的时间限制内完成。 中断 DPC 批处理是 ISR 之后和重新启用中断之前运行的所有 DPC 的集合。

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

NDIS 在 IRQL = DISPATCH_LEVEL 调用 MiniportMessageInterruptDPC

示例

若要定义 MiniportMessageInterruptDPC 函数,必须先提供一个函数声明来标识要定义的函数类型。 Windows 为驱动程序提供了一组函数类型。 使用函数类型声明函数可帮助 驱动程序的代码分析静态驱动程序验证程序 (SDV) 和其他验证工具查找错误,并且这是为 Windows 操作系统编写驱动程序的要求。

例如,若要定义名为“ MyMessageInterruptDPC”的 MiniportMessageInterruptDPC 函数,请使用 MINIPORT_MESSAGE_INTERRUPT_DPC 类型,如以下代码示例所示:

MINIPORT_MESSAGE_INTERRUPT_DPC MyMessageInterruptDPC;

然后,按如下所示实现函数:

_Use_decl_annotations_
VOID
 MyMessageInterruptDPC(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PVOID  MiniportDpcContext,
    PVOID  ReceiveThrottleParameters,
    PVOID  NdisReserved2
    )
  {...}

MINIPORT_MESSAGE_INTERRUPT_DPC函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations批注可确保使用应用于头文件中MINIPORT_MESSAGE_INTERRUPT_DPC函数类型的注释。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数

有关 Use_decl_annotations的信息,请参阅 批注函数行为

要求

要求
最低受支持的客户端 在 NDIS 6.0 及更高版本中受支持。
目标平台 Windows
标头 ndis.h (包括 Ndis.h)
IRQL DISPATCH_LEVEL

另请参阅

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NDIS_RECEIVE_THROTTLE_PARAMETERS

NET_BUFFER_LIST

NdisMDeregisterInterruptEx

NdisMIndicateReceiveNetBufferLists

NdisMQueueDpc

NdisMQueueDpcEx

NdisMRegisterInterruptEx

接收方伸缩 (RSS)