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;
}
