从 CoNDIS 驱动程序发送 NET_BUFFER 结构

下图演示了一个基本的 CoNDIS 发送操作,该操作涉及协议驱动程序、NDIS 和微型端口驱动程序。

说明涉及协议驱动程序、NDIS 和微型端口驱动程序的基本 CoNDIS 发送操作的关系图。

如上图所示,协议驱动程序调用 NdisCoSendNetBufferLists 函数,以在虚拟连接 ( VC) 发送NET_BUFFER_LIST结构。 然后,NDIS 调用微型端口驱动程序的 MiniportCoSendNetBufferLists 函数,将NET_BUFFER_LIST结构转发到基础微型端口驱动程序。

所有基于NET_BUFFER的发送操作都是异步的。 因此,微型端口驱动程序始终调用 NdisMCoSendNetBufferListsComplete 函数,并在发送完数据后提供适当的状态代码。 微型端口驱动程序可以完成每个NET_BUFFER_LIST结构的发送操作,独立于其他NET_BUFFER_LIST结构。 每次微型端口驱动程序调用 NdisMCoSendNetBufferListsComplete 时,NDIS 都会调用协议驱动程序的 ProtocolCoSendNetBufferListsComplete 函数。

只要 NDIS 调用协议驱动程序的 ProtocolCoSendNetBufferListsComplete 函数,协议驱动程序就可以回收NET_BUFFER_LIST结构以及所有相关结构和数据的所有权。

微型端口驱动程序或 NDIS 可以按任何顺序返回NET_BUFFER_LIST结构。 但可以保证协议驱动程序未修改附加到每个 NET_BUFFER_LIST 结构的NET_BUFFER结构的列表。

协议驱动程序将 NET_BUFFER_LIST 结构中的 SourceHandle 成员设置为与 NdisCoSendNetBufferListsNdisVcHandle 参数相同的值。 NDIS 使用 SourceHandle 成员将NET_BUFFER_LIST结构返回到发送NET_BUFFER_LIST结构的协议驱动程序。

中间驱动程序还会将 NET_BUFFER_LIST 结构中的 SourceHandle 成员设置为 NdisVcHandle 值。 如果中间驱动程序转发发送请求,则驱动程序必须在写入 SourceHandle 成员之前保存过度分配的驱动程序提供的 SourceHandle 值。 当 NDIS 将转发NET_BUFFER_LIST结构返回到中间驱动程序时,中间驱动程序必须还原它保存的 SourceHandle

协议驱动程序可以使用与无连接驱动程序相同的机制来取消发送请求。 有关取消发送请求的详细信息,请参阅 取消发送操作