阅读:2057回复:1
用PASSTHRU修改的数据包接受问题
我现在在用PASSTHRU做IPSec VPN,在收到数据包时我需要去除IP包前的IPSec头以及IPSec尾,以下是我的代码,帮忙看一下哪儿有问题!谢谢!
BOOLEAN DELIPSec( IN PADAPT pAdapt, IN PNDIS_PACKET pReceivedPacket, OUT PNDIS_PACKET MyPacket, IN PIPHeader pIPHdro, IN PSADB psadb, IN PIPSecHeader pipsechdr, IN PIPSecTail pipsectl, IN PIPSecICV ipsecicv ) { PNDIS_BUFFER MyBuffer,MyBuffer1,MyBuffer2,MyBuffer3,MyBuffer4; PIPHeader pIPHdr; NDIS_STATUS Status; PUCHAR pBuf,pBuf1,pBuf2,pBuf3; ULONG BufLength,BufLength1,BufLength2,BufLength3; MDL *pNext; PUCHAR pcontent=NULL,pcontent1; NDIS_PHYSICAL_ADDRESS HighestAcceptableMax={-1,-1}; ULONG picv; ULONG i; PNDIS_BUFFER tmpBuffer1,tmpBuffer2,tmpBuffer3; PIPHeader pIPHdri=NULL; //分配新的内存 Status=NdisAllocateMemory(&pcontent,2000,0,HighestAcceptableMax); if(NDIS_STATUS_SUCCESS!=Status) { return FALSE; } NdisZeroMemory(pcontent,2000); //把包中的数据Copy到自己的Buffer中来。 NdisQueryBufferSafe(pReceivedPacket->Private.Head,&pBuf,&BufLength,32); NdisMoveMemory((PUCHAR)pcontent,pBuf,BufLength); i=BufLength; pNext=pReceivedPacket->Private.Head; for(;;) { if(pNext==pReceivedPacket->Private.Tail) break; pNext=pNext->Next; if(pNext==NULL) break; NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32); NdisMoveMemory((PUCHAR)pcontent+i,pBuf,BufLength); i+=BufLength; } NdisAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status!=NDIS_STATUS_SUCCESS) { NdisFreeMemory(pcontent,2000,0); return FALSE; } NdisAllocateBuffer(&Status,&MyBuffer,pAdapt->RecvPacketPoolHandle, pcontent,i); if(Status!=NDIS_STATUS_SUCCESS) { NdisFreeMemory(pcontent,2000,0); NdisFreePacket(MyPacket); return FALSE; } NdisChainBufferAtFront(MyPacket,MyBuffer); NdisUnchainBufferAtBack(MyPacket,&MyBuffer1); while(NULL!=MyBuffer1) { NdisQueryBufferSafe(MyBuffer1,&pBuf1,&BufLength1,32); NdisFreeMemory(pBuf1,BufLength1,0); tmpBuffer1=MyBuffer1; i-=BufLength1; NdisGetNextBuffer(tmpBuffer1,&MyBuffer1); NdisFreeBuffer(tmpBuffer1); } NdisUnchainBufferAtFront(MyPacket,&MyBuffer2); while(NULL!=MyBuffer2) { NdisQueryBufferSafe(MyBuffer2,&pBuf2,&BufLength2,32); NdisFreeMemory(pBuf2,BufLength2,0); tmpBuffer2=MyBuffer2; i-=BufLength2; NdisGetNextBuffer(tmpBuffer2,&MyBuffer2); NdisFreeBuffer(tmpBuffer2); } //分配新的内存 Status=NdisAllocateMemory(&pcontent1,sizeof(PIPSecHeader),0,HighestAcceptableMax); if(NDIS_STATUS_SUCCESS!=Status) { NdisFreeMemory(pcontent,2000,0); NdisFreeBuffer(MyBuffer); NdisFreePacket(MyPacket); return FALSE; } NdisZeroMemory(pcontent1,sizeof(PIPSecHeader)); NdisMoveMemory((PUCHAR)pcontent1,&pipsechdr,sizeof(pipsechdr)); NdisAllocateBuffer(&Status,&MyBuffer3,pAdapt->RecvPacketPoolHandle,pcontent1,sizeof(pipsechdr)); if(Status!=NDIS_STATUS_SUCCESS) { NdisFreeMemory(pcontent,2000,0); NdisFreeBuffer(MyBuffer); NdisFreeMemory(pcontent1,sizeof(PIPSecHeader),0); NdisFreePacket(MyPacket); return FALSE; } NdisChainBufferAtFront(MyPacket,MyBuffer3); picv=CheckICV(psadb,MyPacket); //判断ICV值是否正确 if(ipsecicv->ICV!=picv) { NdisFreeMemory(pcontent,2000,0); NdisFreeBuffer(MyBuffer); NdisFreeMemory(pcontent1,sizeof(PIPSecHeader),0); NdisFreeBuffer(MyBuffer); NdisFreePacket(MyPacket); return FALSE; } NdisUnchainBufferAtFront(MyPacket,&MyBuffer4); while(NULL!=MyBuffer3) { NdisQueryBufferSafe(MyBuffer4,&pBuf3,&BufLength3,32); NdisFreeMemory(pBuf3,BufLength3,0); tmpBuffer3=MyBuffer4; NdisGetNextBuffer(tmpBuffer3,&MyBuffer4); NdisFreeBuffer(tmpBuffer3); } GetIPHeader(pcontent,i,pIPHdri,TRUE); pIPHdri->ipTTL=pIPHdro->ipTTL; MyPacket->Private.Head = NULL; MyPacket->Private.Tail = NULL; NdisFreeMemory(pcontent1,sizeof(PIPSecHeader),0); return TRUE; } |
|
沙发#
发布于:2007-01-18 19:57
晕,还让别人给你找问题啊。自己先把问题说出来,别人好有的放矢。大家的时间都是宝贵的!
|
|
|