Class CICMPSocket::
ProccessICMP()
Base ClassesData ItemsConstructorsDestructorsFunctionsCustom CodeGo to hierarchy chart    Prev page: operator =Next page: ReverseHeader    Show member index
Protected Function Declared in:
ICMPSocket.h

'Declaration' icon -- Shortcut to top of page. Declaration

virtual BOOL ProccessICMP(
    const char* pBuffer);

'Description' icon -- Shortcut to top of page. Description

Proccess incoming ICMP data

'Function Body' icon -- Shortcut to top of page. Function Body

try
{
    //Here we proccess the input we received
    //Do we have previous data?
    if (m_pICMPReceiveData)
    {
        //Delete it
        delete [] m_pICMPReceiveData;
        m_pICMPReceiveData=NULL;
    }

    //No user data
    m_usDataSize=0;

    //Initialize members
    if (!m_pIPHeader)
        m_pIPHeader=new IpHeader;

    if (!m_pICMPHeader)
        m_pICMPHeader=new ICMPHeader;

    //Create an IP header
    LPIpHeader lpHead;
    lpHead=m_pIPHeader;

    //Copy to buffer
    memcpy(lpHead,
           pBuffer,
           IpHeaderLength);

    //Let's check for options
    unsigned char ucHeaderSize;
    ucHeaderSize=(lpHead->ucHeaderLength_Version & 15) << 2;

    //Now check for total packet size
    unsigned short ucPacketSize;
    ucPacketSize=htons(lpHead->usTotalLength);

    //Copy data to icmp
    memset(m_pICMPHeader,
           0,
           ICMPHeaderLength);

    //How much to copy ?
    unsigned short ucCopy;
    ucCopy=ucPacketSize-ucHeaderSize;

    //Save the datasize
    m_usDataSize=ucCopy;

    if (ucCopy>ICMPHeaderLength)
        ucCopy=ICMPHeaderLength;

    //Copy the ICMP header
    memcpy(m_pICMPHeader,
           pBuffer+ucHeaderSize,
           ucCopy);

    //Now save the original IP
    if (!m_pICMPIPHeader)
        m_pICMPIPHeader=new IpHeader;

    //Copy the data
    memcpy(m_pICMPIPHeader,
           pBuffer+ucHeaderSize+ICMP_DATA_SIZE,
           IpHeaderLength);

    //Get this header size
    unsigned char ucNewHeaderSize;
    ucNewHeaderSize=(m_pICMPIPHeader->ucHeaderLength_Version & 15) << 2;

    //Do we have ICMP buffer
    if (!(m_pICMPHeader->ucICMPType!=ICMP_Echo &&
          m_pICMPHeader->ucICMPType!=ICMP_Echo_Reply &&
          m_pICMPHeader->ucICMPType!=ICMP_Timestamp &&
          m_pICMPHeader->ucICMPType!=ICMP_Timestamp_Reply &&
          m_pICMPHeader->ucICMPType!=ICMP_Information &&
          m_pICMPHeader->ucICMPType!=ICMP_Information_Reply &&
          m_pICMPHeader->ucICMPType!=ICMP_Time))
    {

        //Copy rest of data
        if (!m_pICMPICMPHeader)
            m_pICMPICMPHeader=new ICMPHeader;

        memcpy(m_pICMPICMPHeader,
               pBuffer+ucHeaderSize+ICMP_DATA_SIZE+ucNewHeaderSize,
               ICMP_DATA_SIZE);

        //Reverse it
        ReverseHeader(m_pICMPICMPHeader);

        //Do we have data to copy
        unsigned short usRemainingSize;
        usRemainingSize=ucHeaderSize+
                        ICMP_DATA_SIZE+
                        ucNewHeaderSize+
                        ICMP_DATA_SIZE;

        //Anything left?
        if (usRemainingSize<ucPacketSize)
        {
            //Set the size
            m_usDataSize=ucPacketSize-usRemainingSize;

            //Allocate some data
            m_pICMPReceiveData=new char[m_usDataSize];

            //Copy it
            memcpy(m_pICMPReceiveData,
                   pBuffer+usRemainingSize,
                   m_usDataSize);
        }
    }
    else
    {
        //Reset the ICMP
        if (m_pICMPICMPHeader)
            memset(m_pICMPICMPHeader,
                   0,
                   ICMPHeaderLength);

        //Do we have data to copy
        unsigned short usRemainingSize;
        usRemainingSize=ucHeaderSize+
                        ICMP_DATA_SIZE+
                        ucNewHeaderSize;

        //Anything left?
        if (usRemainingSize<ucPacketSize)
        {
            //Set the size
            m_usDataSize=ucPacketSize-usRemainingSize;

            //Allocate some data
            m_pICMPReceiveData=new char[m_usDataSize];

            //Copy it
            memcpy(m_pICMPReceiveData,
                   pBuffer+usRemainingSize,
                   m_usDataSize);
        }
    }

    //Now I need to reverse the header
    ReverseHeader(m_pICMPHeader);

    //Done
    return TRUE;
}
ERROR_HANDLER_RETURN("ProccessICMP",FALSE)

'See Also' icon -- Shortcut to top of page. See Also

Class Overview Class Overview  |  Public base class CSpoofSocket  |  Hierarchy Chart Hierarchy Chart


Get Surveyor!This web site was generated using Surveyor V4.50.811.1.  Click here for more information. Site content copyright © 2003 Komodia LTD.. See the About page for additional notices. This page last updated: 24 Feb 2003.