#include "stdafx.h" #include "AdminToolDispatch.h" #include < Network/Packet/PacketBase.h > #include < Network/Packet/WrapPacket.h > #include < Network/XORCrypt/XORCrypt.h > #include < Utility/Compress/MiniLZO/miniLZOWrapper.h > #include < Log/ServerLog.h > bool CClientMultiThreadDispatch::ParsePacket( char* const lpStream_In, unsigned long* dwStreamSize_InOut ) { CXORCrypt& Crypt = CXORCrypt::GetInstance(); PktBase* lpPktBase = NULL; char* lpBufferPos = lpStream_In; unsigned long dwStreamSize = *dwStreamSize_InOut; unsigned long dwDecompressedSize = 0; char szDecompressedPacket[PktMaxLen] = ""; while(dwStreamSize >= sizeof(PktBase)) { lpPktBase = reinterpret_cast(lpBufferPos); // ÆÐŶ Çì´õ°¡ vaildÇÑÁö È®ÀÎÇÑ´Ù. invalidÇÑ °æ¿ì´Â ±×³É ²÷¾î¹ö¸°´Ù. if(StartBit != lpPktBase->GetStartBit()) { PktBase::CMDType cCmd = lpPktBase->GetCmd(); Crypt.DecodeHeader(reinterpret_cast(&cCmd), 1, 0, 0); //LogErrorPacket("ÆÐŶ Çì´õÀÇ ½ÃÀÛ ºñÆ®°¡ À߸øµÇ¾ú½À´Ï´Ù.", cCmd); return false; } // ÆÐŶ Çì´õ µðÄÚµù Crypt.DecodeHeader(lpBufferPos + 1, sizeof(PktBase) - 1, 0, 0); // Çì´õ ±æÀÌ ¾ò¾î ¿À±â. const PktBase::CMDType nPacketCMD = lpPktBase->GetCmd(); const PktBase::LengthType nPacketLength = lpPktBase->GetLen(); if(dwStreamSize < nPacketLength) { // Àüü ½ºÆ®¸² »çÀÌÁî°¡ ÆÄ½ÌÀ» Çϱ⿡´Â ¸ðÀÚ¶÷. ´Ù½Ã ÀÎÄÚµù ÇÑ ÈÄ ´ÙÀ½ ÅÏÀ» ±â´Ù¸² Crypt.EncodeHeader(lpBufferPos + 1, sizeof(PktBase) - 1, 0, 0); break; } else { // ÆÐŶ µðÄÚµù. if(lpPktBase->IsCrypt()) { Crypt.DecodePacket(lpBufferPos + sizeof(PktBase), nPacketLength - sizeof(PktBase), lpPktBase->GetCodePage()); } // ÆÐŶ ¾ÐÃà ÇØÁ¦. if(lpPktBase->IsCompress()) { // ¾ÐÃà Áö¿øÇÏÁö ¾ÊÀ½.. // return false; dwDecompressedSize = PktMaxLen - sizeof(PktBase); memcpy(szDecompressedPacket, lpPktBase, sizeof(PktBase)); // ·ÎÄà ¹öÆÛ¿¡¼­ ¾ÐÃà ÇØÁ¦. if(!CMiniLZO::Decompress(lpBufferPos + sizeof(PktBase), nPacketLength - sizeof(PktBase), szDecompressedPacket + sizeof(PktBase), &dwDecompressedSize)) { //LogErrorPacket("ÆÐŶ ¾ÐÃà ÇØÁ¦¿¡ ½ÇÆÐÇß½À´Ï´Ù.", nPacketCMD); return false; } // lpPktBase¸¦ ·ÎÄà ¹öÆÛ·Î ¼¼ÆÃ. lpPktBase = reinterpret_cast(szDecompressedPacket); lpPktBase->SetLen(static_cast(dwDecompressedSize + sizeof(PktBase))); } if(!DispatchPacket(lpPktBase)) { // ÆÐŶ ÆÄ½Ì¿¡ ½ÇÆÐ. ¼¼¼ÇÀ» Á¾·áÇÑ´Ù. return false; } dwStreamSize -= nPacketLength; lpBufferPos += nPacketLength; } } *dwStreamSize_InOut -= dwStreamSize; return true; }