NdisFilter发送自定义数据深度解析

需积分: 9 0 下载量 130 浏览量 更新于2024-09-07 收藏 151KB PDF 举报
"这篇博客文章主要讲解了在Filter驱动中如何发送自定义数据的详细步骤,涉及到了网络数据包的构建、内存分配以及MDL的创建等关键环节。" 在网络安全和网络编程中,Filter驱动扮演着重要的角色,它允许在数据传输层进行拦截和修改数据包。本文主要探讨了在Filter驱动中发送自定义数据的详细过程,这对于理解和开发网络过滤解决方案至关重要。 1. 创建缓冲区 发送自定义数据的第一步是创建一个缓冲区来存储这些数据。在Ndis(Network Driver Interface Specification)环境中,我们可以使用`NdisAllocateMemoryWithTagPriority`函数来动态分配内存。这个函数接收四个参数:Filter的句柄、缓冲区的大小(例如80Byte)、一个标签(FILTER_ALLOC_TAG)以及内存池的优先级(LowPoolPriority)。分配的内存将用于存放整个数据包,包括EthernetHeader和其他填充数据。 2. 封装自定义数据 在分配到的缓冲区内,我们需要构建一个符合以太网协议的Header。定义了一个名为`TESTPROV_ETH_HEADER`的结构体,包含目的MAC地址、源MAC地址和以太网类型字段。我们需要为这些字段赋值,例如EthType通常设为0x8e88,表示自定义的协议类型。 3. 创建MDL MDL(Memory Descriptor List)是用来描述内存区域的链表结构,它在内核模式下用于高效地传递数据。在NBL(NetBufferList)结构中,数据由一系列的MDL表示。通过`NdisAllocateMdl`函数,我们可以创建一个MDL,将之前创建的缓冲区与之关联,这样就可以准备将自定义数据包装成NBL进行发送。 4. 构建NetBuffer和NetBufferList NetBuffer是数据传输的基本单位,而NetBufferList则是NetBuffer的集合,用于描述一组连续或不连续的数据。在这个过程中,我们需要创建NetBuffer并将其与MDL绑定,然后将NetBuffer添加到NetBufferList中。最后,NetBufferList将被传递给网络适配器进行实际的发送操作。 5. 发送数据 在准备好NetBufferList后,我们可以通过调用`NdisSendNetBufferLists`函数来发送数据。这个函数会把NetBufferList提交给网络栈,从而实现自定义数据包的发送。 总结来说,发送自定义数据的过程涉及到内存管理、数据结构封装和网络接口调用等多个层面。理解这一过程对于编写网络过滤驱动和进行网络编程具有很大的帮助,特别是在需要对网络流量进行深度检测或修改的场景中。