阅读:1450回复:7
中间层数据结构问题
我想写一个函数,将passthru中截获的包描述符Packet所描述的包的所有buffer放入到一个连续的buffer中,我这样做:
1,先申请一个2000的连续空间 2,从Packet头解链下第一个buffer写入连续空间,释放解下的buffer。 3,循环,如果packet!=NULL,回到2。 另一个函数想这样: 1,产生一个ndis_buffer的描述符,用这个描述符标记上面函数填写的后的连续空间,并把长度定位packet的实际长度。 2,把这个描述符号chain到原来的packet上。 |
|
|
沙发#
发布于: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; } 释放内存有问题,谁能帮我看看。 |
|
|
板凳#
发布于:2003-12-17 11:30
重组包后,发送完毕,从buffer pool中分配的内存要释放吧
|
|
地板#
发布于:2003-12-17 11:33
bufferpool释放掉,那buffer呢?是不是不用?
这样顺序不对啊。 |
|
|
地下室#
发布于:2003-12-17 12:50
bufferpool释放掉,那buffer呢?是不是不用? 不是释放bufferpool,是释放从bufferpool中分配的buffer,当然这要在包发送之后才能释放。如果在send中发送包,就要在SendComplete中释放包。 |
|
论坛版主
|
5楼#
发布于:2003-12-17 16:10
好像对packet的结构不是很了解啊,先把这个结构看看吧,如果对你操作的数据都无法理解就不能正确操作他们
packet != null?,packet怎么可能是null?只可能pakcet.private.head/tail是否为空, 循环的最后free掉pbuffer后循环上来又要用,怎么用?释放的地方有什么不对?自己在好好考虑:)这里不能释放,要出了循环在释放。 思路基本上对了,好好把工作流程考虑好再写代码,good luck |
|
论坛版主
|
6楼#
发布于:2003-12-17 16:15
哇,不好意思,又细看了一下,free buffer的代码没问题,对不起革命战友,我认罪:)
|
|
论坛版主
|
7楼#
发布于:2003-12-17 16:20
另外循环中的注释掉那句
//NdisFreeMemory((PVOID)pBuf,Buflength,0); 是需要的 再加上循环控制那儿改了就对了 |
|