MINIPORT_CO_SEND_NET_BUFFER_LISTS回调函数 (ndis.h)
MiniportCoSendNetBufferLists 函数传输包含在NET_BUFFER_LIST结构的指定链接列表中的网络数据。
语法
MINIPORT_CO_SEND_NET_BUFFER_LISTS MiniportCoSendNetBufferLists;
void MiniportCoSendNetBufferLists(
[in] NDIS_HANDLE MiniportVcContext,
[in] PNET_BUFFER_LIST NetBufferLists,
[in] ULONG SendFlags
)
{...}
参数
[in] MiniportVcContext
微型端口驱动程序分配的上下文区域的句柄,微型端口驱动程序在其中维护其每个虚拟连接 (VC) 状态。 微型端口驱动程序从其 MiniportCoCreateVc 函数向 NDIS 提供此句柄。
[in] NetBufferLists
指向 NET_BUFFER_LIST 结构链接列表中的第一个 NET_BUFFER_LIST 结构的指针。 列表中的每个 NET_BUFFER_LIST 结构都描述 NET_BUFFER 结构的列表。 列表中的每个 NET_BUFFER 结构映射到内存描述符列表链, (MDL) 。 MDL 包含 MiniportCoSendNetBufferLists 传输的网络数据。
[in] SendFlags
定义发送操作的属性的标志。 标志可以与按位 OR 操作组合使用。 若要清除所有标志,请将此参数设置为零。 MiniportCoSendNetBufferLists 支持以下标志:
NDIS_SEND_FLAGS_DISPATCH_LEVEL
如果当前 IRQL 是DISPATCH_LEVEL,则调用方可以选择设置此标志。 有关此标志的详细信息,请参阅 Dispatch IRQL Tracking。
NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
环回应检查 NDIS。 默认情况下,NDIS 不会将数据循环回提交发送请求的驱动程序。 过度使用的驱动程序可以通过设置 NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK 标志来替代此行为。 设置此标志后,NDIS 将标识包含与绑定的接收条件匹配的所有 NET_BUFFER 结构。 NDIS 指示 NET_BUFFER 结构,这些结构与超载驱动程序的条件匹配。 此标志不会影响检查其他绑定上的环回或循环回。
返回值
无
备注
MiniportCoSendNetBufferLists 函数是 CoNDIS 微型端口驱动程序所必需的。 当过度的驱动程序调用 NdisCoSendNetBufferLists 函数,NDIS 调用绑定微型端口驱动程序的 MiniportCoSendNetBufferLists 函数。
NDIS 在 NetBufferLists 中传递NET_BUFFER_LIST结构的链接列表的顺序表示微型端口驱动程序应传输网络数据的顺序。 此外,微型端口驱动程序应按微型端口驱动程序接收 结构 的顺序从多个 MiniportCoSendNetBufferList 调用 发送NET_BUFFER_LIST结构。
CoNDIS 微型端口驱动程序必须接受 NDIS 通过调用 MiniportCoSendNetBufferLists 函数发出的所有发送请求。 如果微型端口驱动程序无法立即完成发送请求,驱动程序必须将请求保存在队列中,直到它可以完成请求。 当发送请求挂起时,微型端口驱动程序将保留 NET_BUFFER_LIST 结构和与 NET_BUFFER_LIST 结构关联的所有资源的所有权。
微型端口驱动程序必须调用 NdisMCoSendNetBufferListsComplete 函数,用于完成所有 CoNDIS 发送请求。 为了提高计算机性能,驱动程序可以创建一个链接列表,其中包含来自多个发送请求的 NET_BUFFER_LIST 结构。 然后,驱动程序可以在对 NdisMCoSendNetBufferListsComplete 的单个调用中传递此类链接列表。
此外,还应假定微型端口驱动程序在调用 NdisMCoSendNetBufferListsComplete 后就无法访问NET_BUFFER_LIST结构和其他关联资源。
MiniportCoSendNetBufferLists 函数必须将对其内部网络数据队列的访问与驱动程序的其他 MiniportXxx 函数(访问同一队列)同步。 微型端口驱动程序可以使用旋转锁来同步对队列的访问。
协议驱动程序负责根据绑定微型端口驱动程序选择的介质类型来确定所需的网络数据。 但是,协议驱动程序可以提供网络数据,用于指定短于所选媒体的最小数据包大小的数据包。 在这种情况下,如果所选介质对传输数据包大小施加最小长度要求, MiniportCoSendNetBufferLists 必须使用零填充数据包。
NDIS 在 IRQL<= DISPATCH_LEVEL 调用 MiniportCoSendNetBufferLists。
示例
若要定义 MiniportCoSendNetBufferLists 函数,必须先提供一个函数声明来标识要定义的函数类型。 Windows 为驱动程序提供了一组函数类型。 使用函数类型声明函数可帮助 驱动程序的代码分析、 静态驱动程序验证程序 (SDV) 和其他验证工具查找错误,并且这是为 Windows 操作系统编写驱动程序的要求。例如,若要定义名为“ MyCoSendNetBufferLists”的 MiniportCoSendNetBufferLists 函数,请使用 MINIPORT_CO_SEND_NET_BUFFER_LISTS 类型,如以下代码示例所示:
MINIPORT_CO_SEND_NET_BUFFER_LISTS MyCoSendNetBufferLists;
然后,按如下所示实现函数:
_Use_decl_annotations_
VOID
MyCoSendNetBufferLists(
NDIS_HANDLE MiniportVcContext,
PNET_BUFFER_LIST NetBufferLists,
ULONG SendFlags
)
{...}
MINIPORT_CO_SEND_NET_BUFFER_LISTS函数类型在 Ndis.h 头文件中定义。 若要在运行代码分析工具时更准确地识别错误,请务必将 Use_decl_annotations 注释添加到函数定义。 Use_decl_annotations批注可确保使用应用于头文件中MINIPORT_CO_SEND_NET_BUFFER_LISTS函数类型的注释。 有关函数声明要求的详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数。
有关 Use_decl_annotations的信息,请参阅 批注函数行为。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 NDIS 6.0 及更高版本中受支持。 |
目标平台 | Windows |
标头 | ndis.h (包括 Ndis.h) |
IRQL | <= DISPATCH_LEVEL |