NDIS 6.0开始用这个结构,就相当于以前的NDIS_PACKET。NET_BUFFER_LIST里面连接的多个NET_BUFFER就是同一TCP连接或UDP里的一系列的包。而NET_BUFFER_LIST之间也就谁也不鸟谁了,可能是完全不搭界的包,向上下层提交的时候也可以以NET_BUFFER_LIST为单位分着来。

一般NDIS接收的包都是一整块内存,发的时候内存是分块的。现在没有了NDIS_BUFFER,直接用MDL了。

NET_BUFFER_1

NET_BUFFER结构里CurrentMdl和MdlChain比较有意思。按我的理解是,比如MdlChain里可以串几个MDL,比如说3个,但我可以让CurrentMdl指向第2个,当发出去或者收进来的时候,都以第2个为开始,相当于MdlChain[0]只是挂在那,它的内容完全完全被忽略。

这张图里的是我随便断下来的一个包,NET_BUFFER->Next是空。也就是只是单独的一个数据包或者说Eth Frame。CurrentMdl和MdlChain指向的是同一个MDL。

CurrentMdlOffset表示包内容在MDL(指示的内存)里的偏移,也就是 包内容起始位置 = MDL’s MappedSystemVa + CurrentMdlOffset。

DataOffset按上面说的那种情况貌似就应该是 包内容起始位置 = MdlChain[0]’s length + CurrentMdl’s MappedSystemVa +CurrentMdlOffset。

NET_BUFFER_2

CurrentMdl里面连着另一个MDL,这个是从发包的时候断下来的,发出去的包基本上都是分层的。

NET_BUFFER->DataLength是数据的长度,在图片里的这种情况里:
DataLength = CurrentMdl->ByteCount – CurrentMdlOffset + NextMdl’s ByteCount

如果CurrentMdl->ByteCount – CurrentMdlOffset 小于DataLength,说明数据不只在一个MDL里,后面还有。

stDataLength不知道干嘛的。

很奇怪, Win7 pdb里的NET_BUFFER结构和WDK文档里的不一样

kd> dt ndis!_NET_BUFFER
   +0×000 Next             : Ptr32 _NET_BUFFER
   +0×004 CurrentMdl       : Ptr32 _MDL
   +0×008 CurrentMdlOffset : Uint4B
   +0×00c DataLength       : Uint4B
   +0×00c stDataLength     : Uint4B
   +0×010 MdlChain         : Ptr32 _MDL
   +0×014 DataOffset       : Uint4B
   +0×000 Link             : _SLIST_HEADER
   +0×018 ChecksumBias     : Uint2B
   +0×01a Reserved         : Uint2B
   +0×01c NdisPoolHandle   : Ptr32 Void
   +0×020 NdisReserved     : [2] Ptr32 Void
   +0×028 ProtocolReserved : [6] Ptr32 Void
   +0×040 MiniportReserved : [4] Ptr32 Void
   +0×050 DataPhysicalAddress : _LARGE_INTEGER
   +0×058 SharedMemoryInfo : Ptr32 _NET_BUFFER_SHARED_MEMORY
   +0×058 ScatterGatherList : Ptr32 _SCATTER_GATHER_LIST


评论

该日志第一篇评论

发表评论

评论也有版权!