阅读:1910回复:8
packet descriper?
大家好,我是新手,最近在读2000DDK的中间驱动文档,有很多东西都不明白,里面常提到packet descriper,她是一种什么样的结构,是不是每一个通过的信息包都包含这样一个东西?它与packet point等其他名词有什么关系?多谢!
|
|
最新喜欢:pepeta |
沙发#
发布于:2001-11-22 09:52
这位老兄:不好意思。打搅拉。请问你用的2000DDK在那里能够得到?本站有吗?是关于NDIS中间层编程的吗?
|
|
|
板凳#
发布于:2001-11-24 13:30
ndis是一个分层的结构,在设计这样的一个结构时,对包的处理(发送和接收)必须考虑以下几点:
1。效率,在包的传递中应该尽量避免大量的数据拷贝; 2。兼容,应该在协议栈以下都对协议透明处理; ndis对数据包的处理使用以下的数据结构来建立其模型,其中心是定义了NDIS_PACKET结构: ....... NDIS_PACKET只是一个包描述符,简单的说,他就是一个管理包缓冲区的结构,当然,还有一些控制位。由于是一个分层的结构,考虑到效率,不可能采用一个单一的连续缓冲,因此,NDIS_PACKET管理了多个缓冲区,其整个结构可以用如下图来示意: 。。。。。 整个缓冲区连表在NDIS_PACKET中的Private域,buffer描述符NDIS_BUFFER实际上是MDL(memory description list). NDIS_PACKET中的ProtocolReserved是扩展用的。 typedef struct _MEDIA_SPECIFIC_INFORMATION { UINT NextEntryOffset; NDIS_CLASS_ID ClassId; UINT Size; UCHAR ClassInformation[1]; } MEDIA_SPECIFIC_INFORMATION, *PMEDIA_SPECIFIC_INFORMATION; typedef struct _NDIS_PACKET_OOB_DATA { Union { ULONGLONG TimeToSend; ULONGLONG TimeSent } ULONGLONG TimeReceived; UINT HeaderSize; UINT SizeMediaSpecificInformation; PVOID MediaSpecificInformation; NDIS_STATUS Status; }; NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA typedef struct _NDIS_PACKET_EXTENSION { PVOID NdisPacketInfo[MaxPerPacketInfo]; } NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION; The out-of-band data has been set up either by the allocating protocol for a send or by the allocating miniport for a receive indication. NdisAllocatePacket在分配一个包描述符时,同时会分配好以上结构。其关系是这样的,NdisPacketOobOffset指定了NDIS_PACKET_OOB_DATA的位置,NDIS_PACKET_EXTENSION将紧跟在其后。而NDIS_PACKET_OOB_DATA中的MediaSpecificInformation指明了MEDIA_SPECIFIC_INFORMATION的位置。 [编辑 - 11/24/01 作者: liuhb] [编辑 - 11/24/01 作者: liuhb] |
|
|
地板#
发布于:2001-11-24 17:20
问一下在passthru中clreceivepacket中
有一行代码如下: “Resvd =(PRSVD)(MyPacket->MiniportReserved);” 为什么不用ProtocolReserved??? |
|
地下室#
发布于:2001-11-25 13:38
因为它构造该packet后调用NdisMIndicateReceivePacket,将包向上传递给上面的protocol层,因此,相对而言,在他自己构造的这个packet中,他此时扮演一个miniport的角色,在MPReturnPacket中它将用MiniportReserved取回这个东东。在这个包中,ProtocolReserved是留给上面的protocol用的。
同样道理,在数据发送的时候,正好是相反的关系。 这就是中间层干的事。 |
|
|
5楼#
发布于:2001-11-25 16:49
还是有点不明白
问题是不管发送和接收 mypacket都是中间层分配,分配时都是调用NdisAllocatePacketPoolEx这个过程没看出什么不同 为什么 接收用Resvd =(PRSVD)(MyPacket->MiniportReserved); 发送用Rsvd = (PRSVD)(MyPacket->ProtocolReserved); 用windbg打印出 MiniportReserved,ProtocolReserved的地址不同 |
|
6楼#
发布于:2001-11-25 19:22
我用的ddk是在微软下载的
多谢liuhb老兄的热心帮助 |
|
7楼#
发布于:2001-11-27 11:24
To square:
没错,不管发送和接收mypacket都是中间层分配。 其实,你只要想想packet的含义就知道,虽然mypacket是由中间层分配,但他是用在一个分层的结构中,各个层都会操作其相应的部分,因此,当mypacket在分层的结构的结构中传递时,就必须对结构中的各部分的使用有一个约定,对于ProtocolReserved,就是定义为给Protocol层使用的,所以在向上传递mypakcet时,中间层不能用ProtocolReserved来保存自己的数据,如果你非要这样做,Protocol层可能也会用ProtocolReserved,这样,当MPReturnPacket返回时,你试图取回的东东可能就是错误的西西了。 |
|
|
8楼#
发布于:2001-11-27 11:59
在nt下我一直都用ProtocolReserved,没出现错误
2000我是从nt下移植过来的现在用ProtocolReserved也没出什么错 typedef struct _ProtRsvd { PNDIS_PACKET OriginalPkt; PNDIS_BUFFER pSecBuffer; PNDIS_BUFFER pLookAheadBuffer; } RSVD, *PRSVD; 在mpreturnpacket中,释放pSecBuffer和pLookAheadBuffer还没出过错误,今天下午我换成miniportreserved再试试看看。 上次试了一下好像一直是错的。。 |
|