我正在为Hyper-V 2012编写callout驱动程序,其中我需要过滤从虚拟机发送的数据包。
我在世界粮食计划署的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函数中的数据包中提取数据,并安全地转发到更多的层?
谢谢。
发布于 2013-04-04 00:00:48
这些是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是我发送的实际数据。
我甚至尝试过使用NdisQueryMdl()接口从MDL列表中检索。
所以在接收端,我只得到了24个字节的正确结果,剩下的就是垃圾。如何从NET_BUFFER_LIST读取完整的缓冲区?
https://stackoverflow.com/questions/15778827
复制相似问题