复制NetBufferListInfo数组而不是调用NdisCopySendNetBufferListInfo?<



我有一个内核驱动程序,它将每个接收/发送NBL中的每个网络缓冲区分开,并为每个包含数据包内容和其他一些东西的NB分配一个本地结构,并将其发送到用户缓冲区,并完成/返回原始NBL。然后,用户服务将OK的数据包发送回驱动程序,然后通过为每个数据包创建一个NBL,然后将它们链接在一起,最终发送/指示它们。

这会导致丢失一些关于数据包的元数据,这些元数据似乎在NetBufferListInfo中(特别是WFP元数据)。

我的问题是,我能否将NetBufferListInfo的内容保存在相应NB的原始NBL中,并将其保存到代表NB的本地结构中,并在我创建包含该NB的NBL时重新复制它?

我想我应该使用NdisAllocateCloneNetBufferList + NetBufferListInfo并复制指针NBL克隆的局部结构作为一个新成员,但问题是,释放这些缓冲区使用NdisFreeCloneNetBufferList将变得非常复杂,我创建一个局部结构中的每个净缓冲区,并将它们插入列表发送到用户服务,和他们每个人可以指向任意NBL(和他们中的许多人可能指向相同的创新,因为我克隆NBL一次为多个NBL内的NBL),当用户发送那些对我来说是OK的,我需要小心不要在我指示/发送NBL后释放克隆的NBL两次(我假设它会导致双重免费BSOD)。因此,我需要为每个克隆的NBL保持引用计数,并确保在它达到0时释放它,以及其他一些并发症。

那么对我来说最简单的解决方案是什么?我可以只是保存相应的NBL在我的本地结构的NetBufferListInfo数组的内容,并在我创建对应于NB的最终NBL时重新复制它?

您可以复制NetBufferListInfo字段,这些字段是完全文档化的,并且您可以理解语义。例如,您可以复制TcpIpChecksumNetBufferListInfo,因为它有完整的文档,并且从语义上讲,将其传播到具有相同负载的另一个NBL是有意义的。

但是有一些字段是操作系统私有的,其中至少有一个是重新计数的指针。如果你要复制那个字段,然后返回原来的NBL,指针就会晃动。影响refcount的唯一方法是调用NdisCopySendNetBufferListInfoNdisCopyReceiveNetBufferListInfo,它们会为您处理这个问题。

TL;DR:你可以这样写代码:

new_nbl->NetBufferListInfo[TcpIpChecksumNetBufferListInfo] = old_nbl->NetBufferListInfo[TcpIpChecksumNetBufferListInfo];
new_nbl->NetBufferListInfo[NetBufferListHashValue] = old_nbl->NetBufferListInfo[NetBufferListHashValue];
. . .

但是你不能写这样的代码:

RtlCopyMemory(
new_nbl->NetBufferListInfo,
old_nbl->NetBufferListInfo,
sizeof(old_nbl->NetBufferListInfo));

因为不是所有的槽都是可比特的。

相关内容

  • 没有找到相关文章