googol
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1910回复:8

packet descriper?

楼主#
更多 发布于:2001-11-18 19:07
大家好,我是新手,最近在读2000DDK的中间驱动文档,有很多东西都不明白,里面常提到packet descriper,她是一种什么样的结构,是不是每一个通过的信息包都包含这样一个东西?它与packet point等其他名词有什么关系?多谢!

最新喜欢:

pepetapepeta
jiahuo
驱动牛犊
驱动牛犊
  • 注册日期2001-09-20
  • 最后登录2004-09-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-11-22 09:52
这位老兄:不好意思。打搅拉。请问你用的2000DDK在那里能够得到?本站有吗?是关于NDIS中间层编程的吗?

家伙
liuhb
驱动牛犊
驱动牛犊
  • 注册日期2001-09-25
  • 最后登录2002-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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]
混在深圳
square
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2004-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-11-24 17:20
问一下在passthru中clreceivepacket中
有一行代码如下:
“Resvd =(PRSVD)(MyPacket->MiniportReserved);”
为什么不用ProtocolReserved???
liuhb
驱动牛犊
驱动牛犊
  • 注册日期2001-09-25
  • 最后登录2002-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-11-25 13:38
因为它构造该packet后调用NdisMIndicateReceivePacket,将包向上传递给上面的protocol层,因此,相对而言,在他自己构造的这个packet中,他此时扮演一个miniport的角色,在MPReturnPacket中它将用MiniportReserved取回这个东东。在这个包中,ProtocolReserved是留给上面的protocol用的。

同样道理,在数据发送的时候,正好是相反的关系。


这就是中间层干的事。
混在深圳
square
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2004-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-11-25 16:49
还是有点不明白


问题是不管发送和接收
mypacket都是中间层分配,分配时都是调用NdisAllocatePacketPoolEx这个过程没看出什么不同
为什么
接收用Resvd =(PRSVD)(MyPacket->MiniportReserved);
发送用Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
用windbg打印出
MiniportReserved,ProtocolReserved的地址不同
googol
驱动牛犊
驱动牛犊
  • 注册日期2001-08-16
  • 最后登录2005-06-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-11-25 19:22
我用的ddk是在微软下载的

多谢liuhb老兄的热心帮助
liuhb
驱动牛犊
驱动牛犊
  • 注册日期2001-09-25
  • 最后登录2002-03-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-11-27 11:24
To square:
没错,不管发送和接收mypacket都是中间层分配。
其实,你只要想想packet的含义就知道,虽然mypacket是由中间层分配,但他是用在一个分层的结构中,各个层都会操作其相应的部分,因此,当mypacket在分层的结构的结构中传递时,就必须对结构中的各部分的使用有一个约定,对于ProtocolReserved,就是定义为给Protocol层使用的,所以在向上传递mypakcet时,中间层不能用ProtocolReserved来保存自己的数据,如果你非要这样做,Protocol层可能也会用ProtocolReserved,这样,当MPReturnPacket返回时,你试图取回的东东可能就是错误的西西了。
混在深圳
square
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2004-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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再试试看看。

上次试了一下好像一直是错的。。
游客

返回顶部