#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:address@hidden *****************************************************************/ 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 BlockLength) { for(i=0; i> 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> 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; }