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 结构数。

Note In NDIS 6.1 and earlier, this parameter is named NdisReserved1, its datatype is PULONG, it is reserved for 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 上指定消息的中断通常已在 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 及更高版本中受支持。
目标平台 窗户
标头 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)