FILTER_SEND_NET_BUFFER_LISTS回调函数 (ndis.h)

NDIS 调用 FilterSendNetBufferLists 函数,以允许筛选器驱动程序筛选 NET_BUFFER_LIST 结构的链接列表。

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

语法

FILTER_SEND_NET_BUFFER_LISTS FilterSendNetBufferLists;

void FilterSendNetBufferLists(
  [in] NDIS_HANDLE FilterModuleContext,
       PNET_BUFFER_LIST NetBufferList,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG SendFlags
)
{...}

参数

[in] FilterModuleContext

筛选器模块上下文区域的句柄。 筛选器驱动程序在 FilterAttach 函数中创建并初始化了此上下文区域。

NetBufferList

指向 指定NET_BUFFER 结构列表的 NET_BUFFER_LIST 结构链接列表的指针。 列表中的每个 NET_BUFFER 映射包含传输数据的 MDL 链。

[in] PortNumber

标识微型端口适配器端口的端口号。 微型端口适配器端口号是通过调用 NdisMAllocatePort 函数分配的。 零值标识微型端口适配器的默认端口。

[in] SendFlags

定义发送操作的属性的标志。 标志可以与 OR 操作结合使用。 若要清除所有标志,请将此成员设置为零。 此函数支持以下标志:

NDIS_SEND_FLAGS_DISPATCH_LEVEL

指定DISPATCH_LEVEL当前 IRQL。 有关此标志的详细信息,请参阅 Dispatch IRQL Tracking

NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK

指定 NDIS 应检查环回。 默认情况下,NDIS 不会将数据循环回提交发送请求的驱动程序。 过度使用的驱动程序可以通过设置此标志来替代此行为。 设置此标志后,NDIS 将标识包含与绑定的接收条件匹配的所有 NET_BUFFER 结构。 NDIS 指示 NET_BUFFER 结构,这些结构与超载驱动程序的条件匹配。 此标志不会影响检查其他绑定上的环回或循环回。

NDIS_SEND_FLAGS_SWITCH_SINGLE_SOURCE

如果设置了此标志, 则NET_BUFFER_LIST 结构链接列表中的所有数据包都源自同一 Hyper-V 可扩展交换机源端口。

有关详细信息,请参阅 Hyper-V 可扩展交换机发送和接收标志

注意如果NET_BUFFER_LIST结构链接列表中的每个数据包使用相同的源端口,则扩展应在完成发送请求时在 NdisFSendNetBufferListsCompleteSendCompleteFlags 参数中设置NDIS_SEND_COMPLETE_FLAGS_SWITCH_SINGLE_SOURCE标志。
 
注意 此标志在 NDIS 6.30 及更高版本中可用。
 

NDIS_SEND_FLAGS_SWITCH_DESTINATION_GROUP

如果设置了此标志,则 NET_BUFFER_LIST 结构链接列表中的所有数据包都将转发到同一可扩展交换机目标端口。

有关详细信息,请参阅 Hyper-V 可扩展交换机发送和接收标志

注意 此标志在 NDIS 6.30 及更高版本中可用。
 

返回值

备注

FilterSendNetBufferLists 是一个可选函数。 如果筛选器驱动程序不筛选发送请求,则可以在调用 时将此函数的入口点设置为 NULL NdisFRegisterFilterDriver 函数。

如果筛选器驱动程序指定 FilterSendNetBufferLists 函数并排队发送请求,则它还必须指定 FilterCancelSendNetBufferLists 函数。

筛选器驱动程序可以从 FilterSetModuleOptions 函数调用 NdisSetOptionalHandlers 函数,为筛选器模块指定 FilterSendNetBufferLists 函数。

如果筛选器驱动程序指定 FilterSendNetBufferLists 函数,则 NDIS 将调用此函数来筛选网络上 NET_BUFFER 结构列表中包含的数据。 NDIS 指定每个 NET_BUFFER_LIST 结构中的 NET_BUFFER 结构的列表。

如果筛选器驱动程序未指定 FilterSendNetBufferLists,则 NDIS 将调用在指定 FilterSendNetBufferLists 函数的驱动程序堆栈中较低的下一个筛选器驱动程序。 如果没有此类基础筛选器驱动程序,则 NDIS 会调用基础驱动程序的 MiniportSendNetBufferLists 函数。

筛选器驱动程序可以筛选数据,并将筛选的数据发送到基础驱动程序。 对于提交到 FilterSendNetBufferLists 的每个NET_BUFFER结构,筛选器驱动程序可以执行以下操作:

  • 通过调用 NdisFSendNetBufferLists 函数,将缓冲区传递到下一个基础驱动程序。 筛选器驱动程序可以在调用 NdisFSendNetBufferLists 之前修改缓冲区内容。 在本例中,NDIS 调用基础驱动程序完成发送请求后的 FilterSendNetBufferListsComplete 函数。
  • 通过调用 NdisFSendNetBufferListsComplete 函数来拒绝缓冲区。
  • 在本地数据结构中对缓冲区进行排队,以便以后进行处理。
  • 复制缓冲区,并使用副本发出发送请求。 发送操作类似于筛选器驱动程序发起的发送请求。 在这种情况下,驱动程序必须通过调用 NdisFSendNetBufferListsComplete 函数将原始缓冲区返回到过度分配的驱动程序。
发送操作完成后,筛选器驱动程序将反转在 FilterSendNetBufferLists 函数中对缓冲区描述符所做的修改(如果有)。 驱动程序调用 NdisFSendNetBufferListsComplete 函数,将 NET_BUFFER_LIST 结构的链接列表返回到覆盖驱动程序,并返回发送请求的最终状态。

如果筛选器模块处于 “暂停” 状态,则筛选器驱动程序不得针对该筛选器模块发出任何发送请求。 如果 NDIS 调用 FilterSendNetBufferLists,则在驱动程序重新启动之前,驱动程序不得调用 NdisFSendNetBufferLists 来传递数据。 驱动程序应立即调用 NdisFSendNetBufferListsComplete 以完成发送操作。 它应将每个 NET_BUFFER_LIST 结构中的完整状态设置为NDIS_STATUS_PAUSED。

NDIS 在 IRQL <= DISPATCH_LEVEL调用 FilterSendNetBufferLists

示例

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

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

FILTER_SEND_NET_BUFFER_LISTS MySendNetBufferLists;

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

_Use_decl_annotations_
VOID
 MySendNetBufferLists(
    NDIS_HANDLE  FilterModuleContext,
    PNET_BUFFER_LIST  NetBufferLists,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  SendFlags
    )
  {...}

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

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

要求

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

另请参阅

FilterAttach

FilterCancelSendNetBufferLists FilterSendNetBufferListsComplete

FilterSetModuleOptions

MiniportSendNetBufferLists

NET_BUFFER

NET_BUFFER_LIST

NdisFRegisterFilterDriver

NdisFSendNetBufferLists

NdisFSendNetBufferListsComplete

NdisMAllocatePort

NdisSetOptionalHandlers

NdisWriteEventLogEntry