我正在编写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函数中的数据包中提取数据并将其安全地转发到更多层吗?
谢谢。
答案 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读取完整的缓冲区?