fanny8102
驱动牛犊
驱动牛犊
  • 注册日期2006-05-17
  • 最后登录2011-05-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望24点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:2058回复:1

用PASSTHRU修改的数据包接受问题

楼主#
更多 发布于:2007-01-17 17:03
  我现在在用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;
}
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-01-18 19:57
晕,还让别人给你找问题啊。自己先把问题说出来,别人好有的放矢。大家的时间都是宝贵的!
走走看看开源好 Solaris vs Linux
游客

返回顶部