1

我正在为 Hyper-V 2012 编写标注驱动程序,我需要在其中过滤从虚拟机发送的数据包。

我在 WFP 的 FWPM_LAYER_EGRESS_VSWITCH_TRANSPORT_V4 层添加了过滤器。标注函数接收数据包缓冲区,我将其转换为 NET_BUFFER_LIST。我正在执行以下操作以获取数据指针

pNetBuffer = NET_BUFFER_LIST_FIRST_NB((NET_BUFFER_LIST*)pClassifyData->pPacket); pContiguousData = NdisGetDataBuffer(pNetBuffer, NET_BUFFER_DATA_LENGTH(pNetBuffer), 0, 1, 0);

我有简单的客户端-服务器应用程序来测试数据包数据。客户端在虚拟机上,服务器是另一台机器。正如我所观察到的,从客户端发送到服务器的数据被截断,最后添加了一些垃圾值。从服务器向客户端发送消息没有问题。如果我不添加此层过滤器客户端服务器工作没有任何问题。

回调函数接收包含 ipHeaderSize 和 transportHeaderSize 的元数据。这两个值都为零。这些是正确的值还是应该是非零的?有人可以帮我在标注功能中从数据包中提取数据并将其安全地转发到其他层吗?

谢谢你。

4

1 回答 1

1

这些是 TCP 数据包。我查看了大小和偏移信息。似乎问题在数据包中是一致的。我在 (NET_BUFFER_LIST*)pClassifyData->pPacket 中检查了以下值。

NET_BUFFER_LIST->NetBUfferListHeader->NetBUfferListData->FirstNetBuffer->NetBufferHeader->NetBufferData->CurrentMdl->MappedSystemVa

前 24 个字节仅正确发送,其余为垃圾。

例如数据包的总大小是 0x36 + 0x18 = 0x4E 我不知道前 0x36 字节中有什么对于所有数据包都是恒定的。它是 TCP/IP 标头吗?第二部分 0x18 是我发送的实际数据。

我什至尝试使用 API NdisQueryMdl() 从 MDL 列表中检索。

所以在接收端我只有 24 个字节是正确的,剩下的是垃圾。如何从 NET_BUFFER_LIST 读取完整的缓冲区?

于 2013-04-03T16:00:47.633 回答