From 849ec37b70f981a864770e2a96d4df57fc0e82d2 Mon Sep 17 00:00:00 2001 From: galaxyhaxz Date: Mon, 17 Dec 2018 22:46:39 -0600 Subject: [PATCH] Fix TBuffer type and buffer_init --- Source/multi.cpp | 89 +++++++++++++++++++++++++----------------------- Source/multi.h | 12 +++---- structs.h | 5 +++ 3 files changed, 57 insertions(+), 49 deletions(-) diff --git a/Source/multi.cpp b/Source/multi.cpp index 0a12db873..b986a5148 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -3,7 +3,7 @@ #include "../types.h" char gbSomebodyWonGameKludge; // weak -char pkdata_6761C0[4100]; +TBuffer sgHiPriBuf; char szPlayerDescript[128]; short sgwPackPlrOffsetTbl[MAX_PLRS]; PkPlayerStruct netplr[MAX_PLRS]; @@ -19,7 +19,7 @@ _gamedata sgGameInitInfo; char byte_678640; // weak int sglTimeoutStart; // weak int sgdwPlayerLeftReasonTbl[MAX_PLRS]; -char pkdata_678658[4100]; +TBuffer sgLoPriBuf; unsigned int sgdwGameLoops; // idb BYTE gbMaxPlayers; char sgbTimeout; // weak @@ -56,26 +56,27 @@ void __fastcall NetSendLoPri(BYTE *pbMsg, BYTE bLen) { if (pbMsg) { if (bLen) { - multi_copy_packet(pkdata_678658, pbMsg, bLen); + multi_copy_packet(&sgLoPriBuf, pbMsg, bLen); multi_send_packet(pbMsg, bLen); } } } -void __fastcall multi_copy_packet(void *a1, void *packet, BYTE size) +void __fastcall multi_copy_packet(TBuffer *a1, void *packet, BYTE size) { - int v3; // eax - int v4; // ebx - char *v5; // esi - - v3 = *(_DWORD *)a1; - v4 = *(_DWORD *)a1 + (unsigned char)size; - if ((unsigned int)(v4 + 2) <= 0x1000) { - *(_DWORD *)a1 = v4 + 1; - *((_BYTE *)a1 + v3 + 4) = size; - v5 = (char *)a1 + v3 + 5; - memcpy(v5, packet, (unsigned char)size); - v5[(unsigned char)size] = 0; + DWORD v3; // eax + DWORD v4; // ebx + BYTE *v5; // esi + + v3 = a1->dwNextWriteOffset; + v4 = a1->dwNextWriteOffset + size; + if ( v4 + 2 <= 0x1000 ) + { + a1->dwNextWriteOffset = v4 + 1; + a1->bData[v3] = size; + v5 = &a1->bData[v3 + 1]; + memcpy(v5, packet, size); + v5[size] = 0; } } @@ -114,15 +115,15 @@ void __fastcall NetSendHiPri(BYTE *pbMsg, BYTE bLen) int size; // [esp+20Ch] [ebp-4h] if (pbMsg && bLen) { - multi_copy_packet(pkdata_6761C0, pbMsg, bLen); + multi_copy_packet(&sgHiPriBuf, pbMsg, bLen); multi_send_packet(pbMsg, bLen); } if (!dword_678628) { dword_678628 = 1; NetRecvPlrData(&pkt); size = gdwNormalMsgSize - 19; - v5 = multi_recv_packet(pkdata_6761C0, pkt.body, &size); - v6 = (TSyncHeader *)multi_recv_packet(pkdata_678658, v5, &size); + v5 = multi_recv_packet(&sgHiPriBuf, pkt.body, &size); + v6 = (TSyncHeader *)multi_recv_packet(&sgLoPriBuf, v5, &size); v7 = sync_all_monsters(v6, size); v8 = gdwNormalMsgSize - v7; pkt.hdr.wLen = v8; @@ -133,32 +134,34 @@ void __fastcall NetSendHiPri(BYTE *pbMsg, BYTE bLen) // 678628: using guessed type int dword_678628; // 679760: using guessed type int gdwNormalMsgSize; -unsigned char *__fastcall multi_recv_packet(void *packet, unsigned char *a2, int *a3) +unsigned char *__fastcall multi_recv_packet(TBuffer *packet, unsigned char *a2, int *a3) { - char *v3; // esi + TBuffer *v3; // esi unsigned char *result; // eax - char *v5; // ebx - size_t v6; // edi - char *v7; // ebx - unsigned char *v8; // [esp+4h] [ebp-4h] + BYTE *v5; // ebx + size_t v6; // edi + char *v7; // ebx + unsigned char *v8; // [esp+4h] [ebp-4h] - v3 = (char *)packet; + v3 = packet; result = a2; v8 = a2; - if (*(_DWORD *)packet) { - v5 = (char *)packet + 4; - while (*v5) { - v6 = (unsigned char)*v5; - if (v6 > *a3) + if ( packet->dwNextWriteOffset ) + { + v5 = packet->bData; + while ( *v5 ) + { + v6 = *v5; + if ( v6 > *a3 ) break; - v7 = v5 + 1; + v7 = (char *)(v5 + 1); memcpy(v8, v7, v6); v8 += v6; - v5 = &v7[v6]; + v5 = (BYTE *)&v7[v6]; *a3 -= v6; } - memcpy(v3 + 4, v5, (size_t)&v3[*(_DWORD *)v3 - (_DWORD)v5 + 5]); - *(_DWORD *)v3 += v3 - v5 + 4; + memcpy(v3->bData, v5, (size_t)&v3->bData[v3->dwNextWriteOffset - (_DWORD)v5 + 1]); /* memcpy_0 */ + v3->dwNextWriteOffset += (char *)v3 - (char *)v5 + 4; result = v8; } return result; @@ -338,7 +341,7 @@ int __cdecl multi_handle_delta() if (recieved) { if (dword_678628) { dword_678628 = 0; - if (!multi_check_pkt_valid(pkdata_6761C0)) + if (!multi_check_pkt_valid(&sgHiPriBuf)) NetSendHiPri(0, 0); } else { NetSendHiPri(0, 0); @@ -353,9 +356,9 @@ int __cdecl multi_handle_delta() // 679661: using guessed type char sgbTimeout; // Microsoft VisualC 2-11/net runtime -int __fastcall multi_check_pkt_valid(char *a1) +int __fastcall multi_check_pkt_valid(TBuffer *a1) { - return *(_DWORD *)a1 == 0; + return a1->dwNextWriteOffset == 0; } void __cdecl multi_mon_seeds() @@ -759,8 +762,8 @@ int __fastcall NetInit(int bSinglePlayer, int *pfExitProgram) sgbTimeout = 0; delta_init(); InitPlrMsg(); - multi_clear_pkt(pkdata_6761C0); - multi_clear_pkt(pkdata_678658); + buffer_init(&sgHiPriBuf); + buffer_init(&sgLoPriBuf); dword_678628 = 0; sync_clear_pkt(); nthread_start(sgbPlayerTurnBitTbl[myplr]); @@ -804,10 +807,10 @@ int __fastcall NetInit(int bSinglePlayer, int *pfExitProgram) // 6796E4: using guessed type char gbDeltaSender; // 6796E8: using guessed type int sgbNetInited; -void __fastcall multi_clear_pkt(char *a1) +void __fastcall buffer_init(TBuffer *pBuf) { - *(_DWORD *)a1 = 0; - a1[4] = 0; + pBuf->dwNextWriteOffset = 0; + pBuf->bData[0] = 0; } void __fastcall multi_send_pinfo(int pnum, char cmd) diff --git a/Source/multi.h b/Source/multi.h index 3787d33fd..06e03a89f 100644 --- a/Source/multi.h +++ b/Source/multi.h @@ -3,7 +3,7 @@ #define __MULTI_H__ extern char gbSomebodyWonGameKludge; // weak -extern char pkdata_6761C0[4100]; +extern TBuffer sgHiPriBuf; extern char szPlayerDescript[128]; extern short sgwPackPlrOffsetTbl[MAX_PLRS]; extern PkPlayerStruct netplr[MAX_PLRS]; @@ -19,7 +19,7 @@ extern _gamedata sgGameInitInfo; extern char byte_678640; // weak extern int sglTimeoutStart; // weak extern int sgdwPlayerLeftReasonTbl[MAX_PLRS]; -extern char pkdata_678658[4100]; +extern TBuffer sgLoPriBuf; extern unsigned int sgdwGameLoops; // idb extern BYTE gbMaxPlayers; extern char sgbTimeout; // weak @@ -31,11 +31,11 @@ extern int player_state[MAX_PLRS]; void __cdecl multi_cpp_init(); void __fastcall multi_msg_add(BYTE *a1, unsigned char a2); void __fastcall NetSendLoPri(BYTE *pbMsg, BYTE bLen); -void __fastcall multi_copy_packet(void *a1, void *packet, BYTE size); +void __fastcall multi_copy_packet(TBuffer *a1, void *packet, BYTE size); void __fastcall multi_send_packet(void *packet, BYTE dwSize); void __fastcall NetRecvPlrData(TPkt *pkt); void __fastcall NetSendHiPri(BYTE *pbMsg, BYTE bLen); -unsigned char *__fastcall multi_recv_packet(void *packet, unsigned char *a2, int *a3); +unsigned char *__fastcall multi_recv_packet(TBuffer *packet, unsigned char *a2, int *a3); void __fastcall multi_send_msg_packet(int a1, BYTE *a2, BYTE len); void __cdecl multi_msg_countdown(); void __fastcall multi_parse_turn(int pnum, int turn); @@ -45,7 +45,7 @@ void __cdecl multi_clear_left_tbl(); void __fastcall multi_player_left_msg(int pnum, int left); void __cdecl multi_net_ping(); int __cdecl multi_handle_delta(); -int __fastcall multi_check_pkt_valid(char *a1); +int __fastcall multi_check_pkt_valid(TBuffer *a1); void __cdecl multi_mon_seeds(); void __cdecl multi_begin_timeout(); void __cdecl multi_check_drop_player(); @@ -57,7 +57,7 @@ void __cdecl NetClose(); char __fastcall multi_event_handler(int a1); void __stdcall multi_handle_events(_SNETEVENT *pEvt); int __fastcall NetInit(int bSinglePlayer, int *pfExitProgram); -void __fastcall multi_clear_pkt(char *a1); +void __fastcall buffer_init(TBuffer *pBuf); void __fastcall multi_send_pinfo(int pnum, char cmd); int __fastcall InitNewSeed(int newseed); void __cdecl SetupLocalCoords(); diff --git a/structs.h b/structs.h index b6f27d48a..d4b7b7087 100644 --- a/structs.h +++ b/structs.h @@ -946,6 +946,11 @@ typedef struct TMegaPkt { BYTE data[32000]; } TMegaPkt; +typedef struct TBuffer { + DWORD dwNextWriteOffset; + BYTE bData[4096]; +} TBuffer; + ////////////////////////////////////////////////// // quests //////////////////////////////////////////////////