检查WFP中FWPM_LAYER_EGRESS_VSWITCH_TRANSPORT_V4层的标注驱动程序中的数据

时间:2013-04-03 04:22:50

标签: virtualization virtual-machine hyper-v wfp

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

我在WFP的FWPM_LAYER_EGRESS_VSWITCH_TRANSPORT_V4图层添加了过滤器。 Callout函数接收数据包缓冲区,我将其类型化为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);

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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

NET_BUFFER_LIST-> NetBUfferListHeader-> NetBUfferListData-> FirstNetBuffer-> NetBuffe rHeader-> NetBufferData-> CurrentMdl-> MappedSystemVa

前24个字节只能正确发送,剩下的都是垃圾。

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

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

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