ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1396回复:7

中间层数据结构问题

楼主#
更多 发布于:2003-12-17 10:40
我想写一个函数,将passthru中截获的包描述符Packet所描述的包的所有buffer放入到一个连续的buffer中,我这样做:
1,先申请一个2000的连续空间
2,从Packet头解链下第一个buffer写入连续空间,释放解下的buffer。
3,循环,如果packet!=NULL,回到2。
另一个函数想这样:
1,产生一个ndis_buffer的描述符,用这个描述符标记上面函数填写的后的连续空间,并把长度定位packet的实际长度。
2,把这个描述符号chain到原来的packet上。
我是来学习的。不打扫卫生
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-17 10:42
NDIS_STATUS
NdisPacketMoveToBuf(
IN PNDIS_PACKET Packet,
IN UINT size,
OUT PUCHAR pPacketcontent
 //OUT UINT &PacketSize
)
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PUCHAR pBuf=NULL;
UINT Buflength;
UINT Totallen;
//MDL *pNext;
PNDIS_BUFFER pBuffer=NULL;
//把数据包内容从Packet拷贝到pPacketContent,将原来的packet晴空
//NdisQueryPcket(Packet,NULL,NULL,NULL,NULL);
    
    Status = NdisAllocateMemory(&pPacketcontent,size,0,HighestAcceptableMax);
    if (Status!=NDIS_STATUS_SUCCESS) return Status;
    NdisZeroMemory((PVOID)pPacketcontent,size);
Buflength=0;
Totallen=0;
  
while(Packet!=NULL)
{
NdisUnchainBufferAtFront(Packet,&pBuffer);
NdisQueryBufferSafe(pBuffer,(PVOID)pBuf,&Buflength,32);

NdisMoveMemory((PVOID)(pPacketcontent+Totallen),(PVOID)pBuf,Buflength);
//NdisFreeMemory((PVOID)pBuf,Buflength,0);
NdisFreeBuffer(pBuffer);
Totallen=Totallen+Buflength;
}
return Status;
}

NDIS_STATUS
NdisBufLinkToPacket(
IN OUT PNDIS_PACKET Packet,
//IN OUT PNDIS_HANDLE pool,
IN PUCHAR pBuf,
IN UINT num
)
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PNDIS_BUFFER pNBuf=NULL;
PNDIS_HANDLE pBufferPool=NULL;

NdisAllocateBufferPool(&Status,pBufferPool,3);
NdisAllocateBuffer(&Status,&pNBuf,*pBufferPool,(PVOID)pBuf,num);
NdisChainBufferAtBack(Packet,pNBuf);
//if(pNBuf!=NULL)
//NdisFreeBuffer(pNBuf);
//NdisFreeBufferPool(pBufferPool);
return Status;
}

释放内存有问题,谁能帮我看看。
我是来学习的。不打扫卫生
lonelyeagle
驱动牛犊
驱动牛犊
  • 注册日期2003-10-29
  • 最后登录2006-04-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-17 11:30
重组包后,发送完毕,从buffer pool中分配的内存要释放吧
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-17 11:33
bufferpool释放掉,那buffer呢?是不是不用?
这样顺序不对啊。
我是来学习的。不打扫卫生
lonelyeagle
驱动牛犊
驱动牛犊
  • 注册日期2003-10-29
  • 最后登录2006-04-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-17 12:50
bufferpool释放掉,那buffer呢?是不是不用?
这样顺序不对啊。

不是释放bufferpool,是释放从bufferpool中分配的buffer,当然这要在包发送之后才能释放。如果在send中发送包,就要在SendComplete中释放包。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-17 16:10
好像对packet的结构不是很了解啊,先把这个结构看看吧,如果对你操作的数据都无法理解就不能正确操作他们

packet != null?,packet怎么可能是null?只可能pakcet.private.head/tail是否为空,

循环的最后free掉pbuffer后循环上来又要用,怎么用?释放的地方有什么不对?自己在好好考虑:)这里不能释放,要出了循环在释放。

思路基本上对了,好好把工作流程考虑好再写代码,good luck
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-17 16:15
哇,不好意思,又细看了一下,free buffer的代码没问题,对不起革命战友,我认罪:)
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-17 16:20
另外循环中的注释掉那句
//NdisFreeMemory((PVOID)pBuf,Buflength,0);
是需要的
再加上循环控制那儿改了就对了
根据地的兄弟们,团结就是力量
游客

返回顶部