bcomd
驱动牛犊
驱动牛犊
  • 注册日期2005-07-21
  • 最后登录2005-10-11
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1338回复:0

windows CE 4.2 的protocolReceive

楼主#
更多 发布于:2005-08-03 22:15
我想在windows CE 4.2 的passthru的protocol.c文件,使用protocolReceive()中做IPIP封装,ping已经通了,但是一段时间后,会出现内存分配不足。也就是出现内存泄露。代码片断如下,那位大侠给指点一下吧,多谢了!



//把数据包内容拷贝到pData

status = NdisAllocateMemory( (PVOID *)&pData, uiLookAheadBufferSize, 0, noMaxAddr);
if(status != NDIS_STATUS_SUCCESS) return 1;

status = NdisAllocateMemory( (PVOID *)&pHeader, uiHeaderBufferSize, 0, noMaxAddr);
if(status != NDIS_STATUS_SUCCESS) return 1;
          
NdisZeroMemory (pHeader, uiHeaderBufferSize);
NdisZeroMemory (pData, uiLookAheadBufferSize);

NdisMoveMemory(pHeader, pvHeaderBuffer, uiHeaderBufferSize);           NdisMoveMemory(pData, pvLookAheadBuffer, uiLookAheadBufferSize);  

。。。。。。 。。。。。。

//用pEncapData构造新的数据包

status = NdisAllocateMemory((PVOID *)&pEncapData, uiLookAheadBufferSize+sizeof(ip_header), 0, noMaxAddr);
if (status!=NDIS_STATUS_SUCCESS ) return 1;
NdisZeroMemory(pEncapData, uiLookAheadBufferSize+sizeof(ip_header));

//把封装好的IP头拷贝进数据包

NdisMoveMemory(pEncapData, pIpHeader, sizeof(ip_header));
NdisMoveMemory(pEncapData+sizeof(ip_header), pData, uiLookAheadBufferSize);

。。。。。。 。。。。。。

//指定包      

NdisMEthIndicateReceive(pBinding->hMPBinding, hMacReceiveContext, HeaderBuffer,  uiHeaderBufferSize, (PVOID)pEncapData, LookAheadBufferSize+20,    uiPacketSize+20);                

//释放内存

NdisFreeMemory(pIpHeader, sizeof(ip_header), 0);
NdisFreeMemory(pEncapData, uiLookAheadBufferSize+20, 0);


如果不封装,只是使用pData代替pLookAheadBuffer,即

NdisMEthIndicateReceive(pBinding->hMPBinding, hMacReceiveContext, pvHeaderBuffer, uiHeaderBufferSize, (PVOID)pData, uiLookAheadBufferSize,uiPacketSize);

就没有内存泄露问题!!!
游客

返回顶部