Hi:
   There is some test code for DWG 2007,for Reed Solomon Decode(not 
completely)and decompression algorithm.
Wish it be helpful for libredwg.
  
     

 


 
#include "stdafx.h"
#include "Decompress(2007).h"

/**************************************************************
    Created by Spencor CHEN Jan,1,2010
    All the algorithm is implemented by reverse engineering of 
NOAUTODESK 2007 and ANTIOPENDWG.
        DWG format spec should be public,and all file format should 
be public and free.     
    E-mail:[email protected]
*****************************************************************/
UBYTE Reed_Solomon_Decode(UBYTE* pSrc,  
                                                  UINT32 SrcSize,      
//Buffer´óС
                                                  UINT32 MsgLength,    
//ʵ¼Ê±àÂëÊý¾Ý³¤¶È
                              UBYTE Pace,
                                                  UWORD BlockLength,   //239
                                                  UWORD EncodedLength) //255
{
        if(!pSrc)  return -1;
        UBYTE* pCache = NULL;
        pCache = new UBYTE[SrcSize];
        if(!pCache) return -2; 
        /*
        UINT32 cursor,index,i;  
        cursor = index = 0;     
        
        for(i=0; i<SrcSize; i++)
        {
                if((index+Pace*i < SrcSize) & (cursor < 
(index+1)*EncodedLength))
                        pCache[cursor++] = pSrc[index+Pace*i];  
                else
                {
                        index++;
                        i=0;
                }
                if(index == Pace) break;
        }

        cursor = index = 0;
        while(MsgLength > BlockLength)
        {
                for(i=0; i<BlockLength; i++)
                        pSrc[cursor++] = pCache[index++];
                index += EncodedLength-BlockLength;
                MsgLength -= BlockLength;
        }       
        for(i=0; i<MsgLength; i++)
                pSrc[cursor++] = pCache[index++];
        if(pCache) delete []pCache;
        */
        int total = 0;
        for(int i=0; i<Pace; i++)
                for(int j=0;j<239; j++)         
                        pCache[total++] = pSrc[j*Pace+i];               
        for(int i=0; i<total; i++)
                pSrc[i] = pCache[i];
        if(pCache) delete []pCache;
        return 1;
}



UBYTE Parse_2007_FH(UBYTE* pSrc)
{
        if(!pSrc) 
                return -1;
        return 1;
}


UBYTE Parse_2007_Aux(UBYTE* pSrc,
                                 UBYTE* pDst,
                                         UINT32 SrcSize,
                                         UBYTE  Pace,
                                         UINT32 ZippedSize,
                                         UINT32 UnzippedSize,
                                         UBYTE  ZipSizeOffset = 0,
                                         UBYTE  DecompStart = 0)
{
        if(ZippedSize < 0)
                return 2;       
        if(!pSrc)       
                return -1; //Src is NULL        

        UBYTE  iRes = Reed_Solomon_Decode(pSrc,SrcSize,SrcSize,Pace);
        UBYTE  iDstStart = 0;
        if(!ZippedSize)
        {       
                ZippedSize = *((UINT32*)(pSrc+ZipSizeOffset)); //¶ÔRoot 
Section£¬ÆäZippedSizeÐèÌØÊâ´¦Àí
                iDstStart = ZipSizeOffset+0x8;
                for(int i=0; i<iDstStart; i++)
                        pDst[i] = pSrc[i];
        }

        if(!pDst) 
                pDst = new UBYTE[UnzippedSize];

        if(!pDst)
                return -3; //Dst is NULL

        return 
Decompress_2007(pSrc+DecompStart,ZippedSize,pDst+iDstStart,UnzippedSize);       
  
}


UBYTE Parse_2007_ROOT_SECTION(UBYTE* pSrc,
                                                  UBYTE* pDst)
{
        return Parse_2007_Aux(pSrc,pDst,0x400,0x3,0,0x110,0x18,0x20);
}



UBYTE Parse_2007_DATA_PAGE_MAP(UBYTE* pSrc,
                                                   UBYTE* pDst,
                                                           UINT32 ZippedSize,
                                                           UINT32 UnzippedSize)
{
        return Parse_2007_Aux(pSrc,pDst,0x400,0x4,ZippedSize,UnzippedSize);
}


UINT32 W2CharSectionName(UBYTE* pSectionName,UINT32 Size)
{
        if(!pSectionName) return -1;
        if(Size%2)        return -2;

        for(UINT32 i=0; i<Size/2; i++)
                pSectionName[i] =  pSectionName[i<<1];
        return Size/2;
}


UBYTE Parse_2007_SECTION_PAGE_MAP(UBYTE* pSrc,
                                      UBYTE* pDst,
                                                                  UINT32 
SrcSize,
                                      UINT32 ZippedSize,
                                              UINT32 UnzippedSize)
{
        return Parse_2007_Aux(pSrc,pDst,SrcSize,0x10,ZippedSize,UnzippedSize);  
}


UINT32 Read_32Bits_Length(UBYTE* SrcBuffer,
                                                  UINT32& srcIndex);

UINT32 Read_Length(UBYTE* SrcBuffer,
                                   UINT32& srcIndex,
                                   UBYTE& op);


void Read_Instruction(UBYTE* SrcBuffer,
                                          UINT32& srcIndex,
                                          UINT32& Length,
                                          UINT32& Offset,
                                          UBYTE& op);


void CopyBytes(UINT32 Length,
                   UBYTE* SrcBuffer,
                           UINT32& srcIndex,
                           UBYTE* DstBuffer,
                           UINT32& dstIndex); 

/*
UBYTE Decompress_2007(UBYTE* SrcBuffer,   //SrcBuffer
                                          UINT32 srcSize,     //SrcSize
                                          UBYTE* DstBuffer,   //pDst
                                          UINT32 dstSize)
{
        UINT32 Length,Offset,srcIndex,dstIndex;
        
        UBYTE op,op_a;
        UBYTE* pSrc =0;
        
        
        if(!SrcBuffer)  
                pSrc =new unsigned char[srcSize];
        if(!DstBuffer)
                DstBuffer = new unsigned char[dstSize];

        if(!SrcBuffer || !DstBuffer)
                return -1; //ÄÚ´æ·ÖÅä²»³É¹¦

        srcIndex = dstIndex = 0; //³õʼ»¯Îª0
        Length = Offset = 0;    

        op = SrcBuffer[srcIndex++];
        op_a = op & 0xF0;

        if(op_a == 0x20)
        {
                srcIndex += 3;
                Length = (SrcBuffer[srcIndex -1]) & 0x7;
        }
        else //µÚÒ»¸öopcode·Ç0x20£¬¶ÔÓ¦Ðè¶ÁÈ¡³¤¶È       
                Length = Read_Length(SrcBuffer,srcIndex,op);
        
        CopyBytes(Length,SrcBuffer,srcIndex,DstBuffer,dstIndex);                
        
        Read_Instruction(SrcBuffer,srcIndex,Length,Offset,op);
        
        while(srcIndex < srcSize)
        {                       
                for(UINT32 i =0; i<Length; i++)         
                        DstBuffer[dstIndex++] = DstBuffer[dstIndex-Offset];     
                
                op &= 0x7;
                if(op)
                {       
                        CopyBytes(op,SrcBuffer,srcIndex,DstBuffer,dstIndex); 
//from src to dst                  
                        Read_Instruction(SrcBuffer,srcIndex,Length,Offset,op);
                }
                else
                {       
                        op = SrcBuffer[srcIndex++]; //¶ÁÈ¡ÏÂÒ»¸öÖ¸Áî            
        
                        switch(op >> 4)
                        {
                                case 0:                                 
                                {
                                        Length = 
Read_Length(SrcBuffer,srcIndex,op);
                                        
CopyBytes(Length,SrcBuffer,srcIndex,DstBuffer,dstIndex);        
                                        Length = 0;
                                        op = 0;
                                }
                                break;

                                case 1:
                                {
                                        Length = (op & 0x0f) + 0x3;
                                        Offset = SrcBuffer[srcIndex++];
                                        op = SrcBuffer[srcIndex++];
                                        Offset += ((op & 0xf8) << 5) + 1;       
        
                                } break;

                                case 2:
                                {
                                        Offset = 
Read_32Bits_Length(SrcBuffer,srcIndex);                                         
               
                                        if((op & 0x8) == 0)
                                        {                                       
                                                Length = op & 0x7;
                                                op = SrcBuffer[srcIndex++];
                                                Length += op & 0xf8;
                                        }
                                        else
                                        {
                                                Offset++;
                                                Length = op & 0x7;
                                                Length += 
SrcBuffer[srcIndex++]<<3;
                                                op = SrcBuffer[srcIndex++];
                                                Length += (((op & 0xf8 )<< 8) & 
0xff00) +  0x100;
                                        }
                                }break;

                                case 0xf:       
                                {
                                        Length = (op & 0x0f) + 0x13;            
                
                                        Offset = SrcBuffer[srcIndex++];
                                        op = SrcBuffer[srcIndex++];
                                        Length += (op >> 3) & 0x10;
                                        Offset += ((op & 0x78) << 5) + 1;       
                                }break;

                                default: 
                                {
                                        Length = op >> 4;
                                        Offset = op & 0xf;
                                        op = SrcBuffer[srcIndex++];
                                        Offset += ((op & 0xf8) << 1) + 1;       
                                } break;        
                        } //end switch(op>>4)
                        for(UINT32 i =0; i<Length; i++)         
                                DstBuffer[dstIndex++] = 
DstBuffer[dstIndex-Offset];
                        Length = 0;
                } //end else    
        }//end while
        return 1; // success
}

*/

//Jan 03 2010 night modified by Spencor CHEN.
UBYTE Decompress_2007(UBYTE* SrcBuffer,   //SrcBuffer
                                          UINT32 srcSize,     //SrcSize
                                          UBYTE* DstBuffer,   //pDst
                                          UINT32 dstSize)
{
        UINT32 CompLength,LiteralLength,Offset,srcIndex,dstIndex;
        
        UBYTE op;
        UBYTE* pSrc =0;
        
        
        if(!SrcBuffer)  
                pSrc =new unsigned char[srcSize];
        if(!DstBuffer)
                DstBuffer = new unsigned char[dstSize];

        if(!SrcBuffer || !DstBuffer)
                return -1; //ÄÚ´æ·ÖÅä²»³É¹¦

        srcIndex = dstIndex = 0; //³õʼ»¯Îª0
        CompLength = Offset = 0; 

        op = SrcBuffer[srcIndex++];
        if((op&0xf0) == 0x20)
        {
                srcIndex += 3;
                LiteralLength = (SrcBuffer[srcIndex -1]) & 0x7;
        }
        else
                LiteralLength = Read_Length(SrcBuffer,srcIndex,op);

        CopyBytes(LiteralLength,SrcBuffer,srcIndex,DstBuffer,dstIndex);
        
        while(srcIndex < srcSize)
        {                       
                Read_Instruction(SrcBuffer,srcIndex,CompLength,Offset,op);
                while(CompLength)
                {
                        for(UINT32 i =0; i<CompLength; i++)             
                                DstBuffer[dstIndex++] = 
DstBuffer[dstIndex-Offset];     

                        LiteralLength = op&0x7; 
                        if(!LiteralLength) //Literal ==0
                        {
                                op = SrcBuffer[srcIndex++];                     
                        
                                switch(op >> 4)
                                {
                                        case 0:                                 
                                        {
                                                LiteralLength = 
Read_Length(SrcBuffer,srcIndex,op);     
                                                
CopyBytes(LiteralLength,SrcBuffer,srcIndex,DstBuffer,dstIndex);
                                                CompLength = 0;
                                        }break;

                                        case 1:
                                        {
                                                CompLength = (op & 0x0f) + 0x3;
                                                Offset = SrcBuffer[srcIndex++];
                                                op = SrcBuffer[srcIndex++];
                                                Offset += ((op & 0xf8) << 5) + 
1;                                               
                                        } break;

                                        case 2:
                                        {
                                                Offset = 
Read_32Bits_Length(SrcBuffer,srcIndex);                                         
               
                                                if((op & 0x8) == 0)
                                                {                               
        
                                                        CompLength = op & 0x7;
                                                        op = 
SrcBuffer[srcIndex++];
                                                        CompLength += op & 0xf8;
                                                }
                                                else
                                                {
                                                        Offset++;
                                                        CompLength = op & 0x7;
                                                        CompLength += 
SrcBuffer[srcIndex++]<<3;
                                                        op = 
SrcBuffer[srcIndex++];
                                                        CompLength += (((op & 
0xf8 )<< 8) & 0xff00) +  0x100;
                                                }                               
                
                                        }break;

                                        case 0xf:       
                                        {
                                                CompLength = (op & 0x0f) + 
0x13;                                
                                                Offset = SrcBuffer[srcIndex++];
                                                op = SrcBuffer[srcIndex++];
                                                CompLength += (op >> 3) & 0x10;
                                                Offset += ((op & 0x78) << 5) + 
1;                                               
                                        }break;

                                        default: 
                                        {
                                                CompLength = op >> 4;
                                                Offset = op & 0xf;
                                                op = SrcBuffer[srcIndex++];
                                                Offset += ((op & 0xf8) << 1) + 
1;                                               
                                        } break;        
                                } //end switch(op>>4)           
                        }//end if(!LiteralLength)
                        else
                        {
                                
CopyBytes(LiteralLength,SrcBuffer,srcIndex,DstBuffer,dstIndex);
                                CompLength = 0; 
                        }
                }
        } //end while   
        return 1;
}



UINT32 Read_32Bits_Length(UBYTE* SrcBuffer,UINT32& srcIndex)
{       
        UINT32* p = (UINT32*)(SrcBuffer+srcIndex);
        srcIndex += 2;
        return *p;
}

UINT32 Read_Length(UBYTE* SrcBuffer,UINT32& srcIndex,UBYTE& op)
{
        UINT32 Length = op + 0x8;
        UINT32 n;
        if(Length == 0x17)
        {
                op = SrcBuffer[srcIndex++];
                Length = op + 0x17;                     
                if(op == 0xff)
                {               
                        do
                        {       
                                n = Read_32Bits_Length(SrcBuffer,srcIndex);     
                                Length += n;                                    
                                
                        }while(n == 0xffff);
                }                       
        }       
        return Length;
}

void  Read_Instruction(UBYTE* SrcBuffer,
                                           UINT32& srcIndex,
                                           UINT32& Length,
                                           UINT32& Offset,
                                           UBYTE& op)
{
        op = SrcBuffer[srcIndex++];                     
        switch(op >> 4)
        {               
                case 0:
                {
                        Length = (op & 0x0f) + 0x13;                            
                        Offset = SrcBuffer[srcIndex++];
                        op = SrcBuffer[srcIndex++];
                        Length += (op >> 3) & 0x10;
                        Offset += ((op & 0x78) << 5) + 1;                       
        
                }break;

                case 1:
                {
                        Length = (op & 0x0f) + 0x3;
                        Offset = SrcBuffer[srcIndex++];
                        op = SrcBuffer[srcIndex++];
                        Offset += ((op & 0xf8) << 5) + 1;
                }break;

                case 2: 
                {
                        Offset = Read_32Bits_Length(SrcBuffer,srcIndex);        
                                                
                        if((op & 0x8) == 0)
                        {                                       
                                Length = op & 0x7;
                                op = SrcBuffer[srcIndex++];
                                Length += op & 0xf8;

                        }
                        else
                        {
                                Offset++;
                                Length = op & 0x7;
                                Length += SrcBuffer[srcIndex++]<<3;
                                op = SrcBuffer[srcIndex++];
                                Length += (((op & 0xf8 )<< 8) & 0xff00) +  
0x100;
                        }
                } break;

                default: 
                {
                        Length = op >> 4;
                        Offset = op & 0xf;
                        op = SrcBuffer[srcIndex++];
                        Offset += ((op & 0xf8) << 1) + 1;
                }break;

        }
}




void CopyBytes(UINT32 Length,
                   UBYTE* SrcBuffer,
                           UINT32& srcIndex,
                           UBYTE* DstBuffer,
                           UINT32& dstIndex)
{
        UBYTE* SrcInit,* DstInit;
        UINT32* pSrc,* pDST;
        while(Length>=0x20)
        {               
                SrcInit = SrcBuffer + srcIndex;
                DstInit = DstBuffer + dstIndex;         

                pSrc = (UINT32*)(SrcInit+0x18);
                pDST = (UINT32*)(DstInit);
                *pDST = *pSrc;
                pSrc = (UINT32*)(SrcInit+0x1C);
                pDST = (UINT32*)(DstInit+0x04);
                *pDST = *pSrc;
                pSrc = (UINT32*)(SrcInit+0x10);
                pDST = (UINT32*)(DstInit+0x8);
                *pDST = *pSrc;
                pSrc = (UINT32*)(SrcInit+0x14);
                pDST = (UINT32*)(DstBuffer+0xc);
                *pDST = *pSrc;

                pSrc = (UINT32*)(SrcInit+0x8);
                pDST = (UINT32*)(DstBuffer+0x10);
                *pDST = *pSrc;
                pSrc = (UINT32*)(SrcInit+0xC);
                pDST = (UINT32*)(DstBuffer+0x14);
                *pDST = *pSrc;          
                pSrc = (UINT32*)(pSrc);
                pDST = (UINT32*)(DstBuffer+0x18);
                *pDST = *pSrc;
                pSrc = (UINT32*)(SrcInit+0x4);
                pDST = (UINT32*)(DstBuffer+0x1c);
                *pDST = *pSrc;

                srcIndex += 0x20;
                dstIndex += 0x20;
                Length -= 0x20;
        }
        
        Length += 0xffffffff;
        if(Length <= 0x1e)
        {
                SrcInit = SrcBuffer + srcIndex;
                DstInit = DstBuffer + dstIndex;
                switch(Length)
                {                       
                        case 0x1e: //copy 31 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x1e];
                                DstBuffer[dstIndex+0x1d] = 
SrcBuffer[srcIndex+0x1 ];
                                DstBuffer[dstIndex+0x1e] = SrcBuffer[srcIndex   
  ];
                        
                                pSrc = (UINT32*)(SrcInit+0x1A);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;

                                pSrc = (UINT32*)(SrcInit+0x12);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;
                        
                                pSrc = (UINT32*)(SrcInit+0x16);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;

                                pSrc = (UINT32*)(SrcInit+0xa);
                                pDST = (UINT32*)(DstInit+0xd);
                                *pDST = *pSrc;

                                pSrc = (UINT32*)(SrcInit+0xe);
                                pDST = (UINT32*)(DstInit+0x11);
                                *pDST = *pSrc;

                                pSrc = (UINT32*)(SrcInit+0x2);
                                pDST = (UINT32*)(DstInit+0x15);
                                *pDST = *pSrc;

                                pSrc = (UINT32*)(SrcInit+0x6);
                                pDST = (UINT32*)(DstInit+0x19);
                                *pDST = *pSrc;                  
                        }break;
                        
                        case 0x1d: //copy 30 bytes
                        {
                                DstBuffer[dstIndex    ] = 
SrcBuffer[srcIndex+0x1d];
                                DstBuffer[dstIndex+0x1] = 
SrcBuffer[srcIndex+0x1c ];
                                                
                                pSrc = (UINT32*)(SrcInit+0x18);
                                pDST = (UINT32*)(DstInit+0x2);
                                *pDST = *pSrc;          

                                pSrc = (UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit+0x6);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x14);
                                pDST = (UINT32*)(DstInit+0xa);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0xe);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x12);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x16);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x1a);
                                *pDST = *pSrc;
                        }break;
                        
                        case 0x1c:  //copy 29 bytes
                        {
                                DstBuffer[dstIndex] = SrcBuffer[srcIndex+0x1c];
                                
                                pSrc = (UINT32*)(SrcInit+0x18);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x14);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0xd);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x11);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x15);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x19);
                                *pDST = *pSrc;  
                        }break;
                                                
                        case 0x1b: //copy 28 bytes
                        {
                                pSrc = (UINT32*)(SrcInit+0x18);
                                pDST = (UINT32*)(DstInit+0x10);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x14);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x14);
                                pDST = (UINT32*)(DstInit+0x8);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0xc);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x10);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x14);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x18);
                                *pDST = *pSrc;  
                        }break;         
                                                
                        case 0x1a:  //copy 27 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x1a];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x19];
                                DstBuffer[dstIndex+0xa ] = 
SrcBuffer[srcIndex+0x10];

                                pSrc = (UINT32*)(SrcInit+0x11);
                                pDST = (UINT32*)(DstInit+0x2);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x15);
                                pDST = (UINT32*)(DstInit+0x6);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0xb);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0xf);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x13);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x17);
                                *pDST = *pSrc;
                        }break;
                        
                        case 0x19://copy 26 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x19];
                                DstBuffer[dstIndex+0x9 ] = 
SrcBuffer[srcIndex+0x10];    
                                
                                pSrc = (UINT32*)(SrcInit+0x11);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x15);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0xa);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0xe);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x12);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x16);
                                *pDST = *pSrc;
                        }break;
                        
                        case 0x18: //copy 25 bytes
                        {                               
                                DstBuffer[dstIndex+0x8 ] = 
SrcBuffer[srcIndex+0x10];    
                                
                                pSrc = (UINT32*)(SrcInit+0x11);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x15);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;  

                                pSrc = (UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0xd);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x11);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x15);
                                *pDST = *pSrc;  
                        }break;

                        case 0x17: //copy 24 bytes
                        {
                                pSrc =(UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x14);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x8);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0xc);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x10);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x14);
                                *pDST = *pSrc;
                        }break; 

                        case 0x16://copy 23 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x16];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x15];
                                DstBuffer[dstIndex+0x2 ] = 
SrcBuffer[srcIndex+0x14];

                                pSrc =(UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit+0x3);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x7);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0xb);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0xf);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x13);
                                *pDST = *pSrc;
                        }break;

                        case 0x15: //copy 22 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x15];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x14];                            

                                pSrc =(UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit+0x2);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x6);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0xa);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0xe);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x12);
                                *pDST = *pSrc;          
                        }break;

                        case 0x14: //copy 21 bytes
                        {
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x14];                            

                                pSrc =(UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0xd);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x11);
                                *pDST = *pSrc;  
                        }
                        break;

                        case 0x13: //copy 20 bytes
                        {
                                pSrc =(UINT32*)(SrcInit+0x10);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x8);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0xc);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x10);
                                *pDST = *pSrc;  
                        }break;

                        case 0x12://copy 19 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x12];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x11];
                                DstBuffer[dstIndex+0x2 ] = 
SrcBuffer[srcIndex+0x10];

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x3);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x7);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0xb);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0xf);
                                *pDST = *pSrc;
                        }break;

                        case 0x11: //copy 18 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x11];
                                DstBuffer[dstIndex+0x11] = SrcBuffer[srcIndex   
  ];

                                pSrc =(UINT32*)(SrcInit+0x9);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xd);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x5);
                                pDST = (UINT32*)(DstInit+0xd);
                                *pDST = *pSrc;
                        }break;

                        case 0x10: //copy 17 bytes
                        {
                                DstBuffer[dstIndex+0x8] = 
SrcBuffer[srcIndex+0x8];

                                pSrc =(UINT32*)(SrcInit+0x9);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xd);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0xd);
                                *pDST = *pSrc;
                        }
                        break;          

                        case 0x0F: //copy 16 bytes
                        {
                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0xc);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x8);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0xc);
                                *pDST = *pSrc;
                        }break;

                        case 0x0E://copy 15 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0xe];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0xd];
                                DstBuffer[dstIndex+0xe ] = SrcBuffer[srcIndex   
 ];

                                pSrc =(UINT32*)(SrcInit+0x9);
                                pDST = (UINT32*)(DstInit+0x2);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x6);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x5);
                                pDST = (UINT32*)(DstInit+0xa);
                                *pDST = *pSrc;
                        }break;

                        case 0x0D://copy 14 bytes
                        {
                                DstBuffer[dstIndex    ] = 
SrcBuffer[srcIndex+0xd];
                                DstBuffer[dstIndex+0xd] = SrcBuffer[srcIndex    
];

                                pSrc =(UINT32*)(SrcInit+0x9);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x5);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;  
                        }break;
                        
                        case 0x0C: //copy 13 bytes
                        {
                                DstBuffer[dstIndex] = SrcBuffer[srcIndex+0xc];

                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x9);
                                *pDST = *pSrc;  
                        }break;

                        case 0x0B: //copy 12 bytes
                        {
                                pSrc =(UINT32*)(SrcInit+0x8);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x8);
                                *pDST = *pSrc;  
                        }break;

                        case 0x0A: //copy 11 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0xa];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x9];
                                DstBuffer[dstIndex+0xa ] = SrcBuffer[srcIndex   
 ];

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x2);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x5);
                                pDST = (UINT32*)(DstInit+0x6);
                                *pDST = *pSrc;
                        }break;

                        case 0x09://copy 10 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x9];
                                DstBuffer[dstIndex+0x9 ] = SrcBuffer[srcIndex   
 ];

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x5);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;
                        }break;

                        case 0x08://copy 9 bytes
                        {
                                DstBuffer[dstIndex ] = SrcBuffer[srcIndex+0x8];

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x5);
                                *pDST = *pSrc;
                        }break;

                        case 0x07://copy 8 bytes
                        {
                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;  

                                pSrc =(UINT32*)(SrcInit+0x4);
                                pDST = (UINT32*)(DstInit+0x4);
                                *pDST = *pSrc;
                        }
                        break;

                        case 0x06://copy 7 bytes
                        {
                                DstBuffer[dstIndex     ] = 
SrcBuffer[srcIndex+0x6];
                                DstBuffer[dstIndex+0x1 ] = 
SrcBuffer[srcIndex+0x5];
                                DstBuffer[dstIndex+0x6 ] = SrcBuffer[srcIndex   
 ];

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x2);
                                *pDST = *pSrc;  
                        }break;

                        case 0x05: //copy 6 bytes
                        {
                                DstBuffer[dstIndex    ] = 
SrcBuffer[srcIndex+0x5];
                                DstBuffer[dstIndex+0x5] = SrcBuffer[srcIndex    
];

                                pSrc =(UINT32*)(SrcInit+0x1);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;
                        }break;

                        case 0x04: //copy 5 bytes
                        {
                                DstBuffer[dstIndex] = SrcBuffer[srcIndex+0x4];

                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit+0x1);
                                *pDST = *pSrc;

                        }break;

                        case 0x03://copy 4 bytes
                        {
                                pSrc =(UINT32*)(SrcInit);
                                pDST = (UINT32*)(DstInit);
                                *pDST = *pSrc;
                        }break;

                        case 0x02: //copy 3 bytes
                        {
                                DstBuffer[dstIndex    ] =  
SrcBuffer[srcIndex+0x2];
                                DstBuffer[dstIndex+0x1] =  
SrcBuffer[srcIndex+0x1];
                                DstBuffer[dstIndex+0x2] =  SrcBuffer[srcIndex   
 ];
                        }break;

                        case 0x01://copy 2 bytes
                        {
                                DstBuffer[dstIndex    ] =  
SrcBuffer[srcIndex+0x1];
                                DstBuffer[dstIndex+0x1] =  SrcBuffer[srcIndex   
];
                        }break;
                        case 0x0:
                        {
                                DstBuffer[dstIndex    ] =  SrcBuffer[srcIndex];
                        }break;
                        default:
                        break;
                }
        } //end if(Length <= 0x1e)
        srcIndex += Length+1;
        dstIndex += Length+1;   
}




Reply via email to