#ifndef _L2EX_ #include "L2Ex.h" #endif #pragma warning(disable: 4311) #pragma warning(disable: 4700) void CharSelectInfoFix(CSocket *pSocket, const char *szFormat, BYTE bOpCode, DWORD dwCharNum, DWORD dwPacketSize, DWORD *pOldPacket) { if (pSocket != NULL && pOldPacket != NULL) { DWORD dwDataLen; DWORD dwNewPacketLen = (dwPacketSize + (dwCharNum * 16)); DWORD *pNewPacket = (DWORD *)VirtualAlloc(NULL, dwNewPacketLen, MEM_COMMIT, PAGE_READWRITE); BYTE *pOld = (BYTE *)pOldPacket; BYTE *pNew = (BYTE *)pNewPacket; for (DWORD i = 0; i < dwCharNum; i++) { dwDataLen = (lstrlenW((LPCWSTR)(pOld)) + 1) * 2; dwDataLen += 4; dwDataLen += (lstrlenW((LPCWSTR)(pOld + dwDataLen)) + 1) * 2; memcpy(pNew, pOld, dwDataLen); pOld += dwDataLen; pNew += dwDataLen; dwDataLen = (4 * 10) + (8 * 2) + 4; memcpy(pNew, pOld, dwDataLen); pOld += dwDataLen; pNew += dwDataLen; dwDataLen = 4; memcpy(pNew, pOld, dwDataLen); pOld += dwDataLen; pNew += dwDataLen; *(int *)pNew = 0; pNew += 4; dwDataLen = (4 * 27); memcpy(pNew, pOld, dwDataLen); pOld += dwDataLen; pNew += dwDataLen; *(int *)pNew = -1; pNew += 4; dwDataLen = (4 * 16); memcpy(pNew, pOld, dwDataLen); pOld += dwDataLen; pNew += dwDataLen; *(int *)pNew = -1; pNew += 4; dwDataLen = (4 * 3) + (8 * 2) + (4 * 3) + 1; memcpy(pNew, pOld, dwDataLen); pOld += dwDataLen; pNew += dwDataLen; *(int *)pNew = 0; pNew += 4; } pSocket->Send(szFormat, bOpCode, dwCharNum, dwNewPacketLen, pNewPacket); VirtualFree(pNewPacket, dwNewPacketLen, MEM_DECOMMIT); } }