/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x1400e4500 FUN_1400e4500 * Pseudocode, not original source. */ /* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */ /* WARNING: Type propagation algorithm not settling */ void FUN_1400e4500(undefined ***param_1,uint *param_2,undefined8 param_3,undefined8 param_4) { undefined **ppuVar1; undefined8 *puVar2; uint uVar3; uint uVar4; undefined8 uVar5; ulonglong uVar6; uint *puVar7; longlong *plVar8; undefined ***pppuVar9; undefined **ppuVar10; uint uVar11; int iVar12; ulonglong uVar13; undefined8 uVar14; undefined1 *puVar15; IMAGE_DOS_HEADER *pIVar16; IMAGE_DOS_HEADER *pIVar17; undefined ***pppuVar18; uint uVar19; uint uVar20; undefined1 auStackY_df8 [32]; undefined **local_dc8; ulonglong *local_dc0; uint local_db8; uint local_db4; uint local_db0 [2]; undefined1 *local_da8; longlong local_da0 [4]; longlong *local_d80; undefined8 local_d78; undefined4 local_d6c; undefined1 local_d68 [88]; undefined **local_d10; byte local_d08 [32]; undefined ***local_ce8; undefined1 local_ce0; longlong local_cd8 [2]; undefined1 local_cc8 [3216]; ulonglong local_38; local_cd8[1] = 0xfffffffffffffffe; local_38 = DAT_1401ac5a0 ^ (ulonglong)auStackY_df8; (**(code **)(param_1[0x21][0xf] + 0x10))(); uVar5 = FUN_1400bd3c0(param_2,local_db0,param_3,param_4); if ((char)uVar5 == '\0') { return; } uVar14 = 4; uVar5 = FUN_1400bc930(param_2,(undefined8 *)&local_db4,4); if ((char)uVar5 == '\0') { return; } uVar6 = FUN_1400bcfd0(param_2,&local_da8,uVar14,param_4); if ((char)uVar6 == '\0') { return; } if ((int)(uint)local_da8 < 0) { return; } if (DAT_1401ac140 <= (int)(uint)local_da8) { return; } FUN_1400bca00((undefined4 *)(local_d68 + 0x28)); uVar5 = FUN_1400bcc60(param_2,(int *)(local_d68 + 0x28),(uint)local_da8,param_4); if ((char)uVar5 == '\0') { local_da8 = local_d68 + 0x30; FUN_1400d1800((longlong *)(local_d68 + 0x30)); if (local_d68._56_8_ == 0) { return; } if (-1 < (int)local_d68._68_4_) { return; } /* WARNING: Subroutine does not return */ FUN_14006be00(); } uVar6 = (ulonglong)local_db0[0]; FUN_1400aca90((longlong *)param_1[0x21],(longlong *)&local_dc0,local_db0[0]); if ((((local_dc0 == (ulonglong *)0x0) || (uVar13 = *local_dc0, uVar13 == 0)) || (*(char *)(uVar13 + 0x684) != '\0')) || (*(char *)(uVar13 + 0x650) != '\0')) goto LAB_1400e4a40; local_d78 = (**(code **)(param_1[0x21][0x11] + 0x18))(); uVar13 = 0; uVar19 = 0; local_da0[3] = 0; local_da0[2] = 0; local_da0[1] = 0; local_d80 = (longlong *)0x0; local_da0[0] = 0; uVar20 = 0; local_d6c = 0; FUN_14007db50((longlong)local_cc8,(longlong)(local_d68 + 0x28),uVar6); plVar8 = local_da0; puVar15 = local_cc8; uVar6 = (ulonglong)local_db4; FUN_1400df040(param_1[0x21][0x9c],uVar6,(SIZE_T)puVar15,(undefined4 *)plVar8); FUN_14007ca50((longlong)local_cc8,uVar6,puVar15,plVar8); local_d68._8_2_ = 0; local_d68._10_2_ = 0; local_d68._12_2_ = 0; local_d68._14_2_ = 0; local_d68._16_8_ = 0; local_d68._24_2_ = 0; local_d68._26_2_ = 0; local_d68._28_2_ = 0; local_d68._30_2_ = 0; local_d68._0_8_ = Proud::CReceivedMessageList::vftable; local_d68._32_2_ = 1000; local_d68._34_2_ = 0; local_d68._36_2_ = 1; local_d68._38_2_ = 0; uVar6 = uVar13; if (local_dc0 != (ulonglong *)0x0) { uVar6 = *local_dc0; } pppuVar9 = (undefined ***)(uVar6 + 0x638); pppuVar18 = (undefined ***)&local_db8; pIVar16 = (IMAGE_DOS_HEADER *)local_d68; plVar8 = local_da0; FUN_1400f5010((longlong)pppuVar9,plVar8,(longlong)pIVar16,(undefined4 *)pppuVar18); if (local_db8 != 0) { FUN_14006cb70(pppuVar9,plVar8,pIVar16,pppuVar18); local_dc8 = (undefined **)PTR_DAT_1401ac010; uVar3 = FUN_14006c9f0(L"Stream Extract Error at Reliable UDP"); uVar6 = uVar13; if ((local_dc8 != (undefined **)0x0) && (uVar6 = 0, local_dc8 != (undefined **)PTR_DAT_1401ac010)) { uVar6 = (ulonglong)*(uint *)(local_dc8 + -1); } uVar4 = uVar3; if ((((int)uVar3 <= (int)uVar6) && (uVar4 = uVar20, local_dc8 != (undefined **)0x0)) && (local_dc8 != (undefined **)PTR_DAT_1401ac010)) { uVar4 = *(uint *)(local_dc8 + -1); } uVar11 = 1; if (1 < (int)uVar4) { uVar11 = uVar4; } uVar4 = uVar20; if ((local_dc8 != (undefined **)0x0) && (local_dc8 != (undefined **)PTR_DAT_1401ac010)) { uVar4 = *(uint *)(local_dc8 + -1); } if ((int)uVar4 < (int)uVar11) { if (local_dc8 == (undefined **)0x0) { local_dc8 = (undefined **)PTR_DAT_1401ac010; } if ((int)uVar11 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if (uVar11 == 0) { FUN_1400031e0((longlong *)&local_dc8,PTR_DAT_1401ac010,uVar6,pppuVar18); } else { uVar4 = uVar20; if ((local_dc8 != (undefined **)0x0) && (local_dc8 != (undefined **)PTR_DAT_1401ac010)) { uVar4 = *(uint *)(local_dc8 + -1); } if (uVar11 != uVar4) { puVar7 = (uint *)FUN_14006cbf0((longlong)(int)uVar11 * 2 + 10); if (puVar7 != (uint *)0x0) { *puVar7 = 0; puVar7[1] = 1; } *puVar7 = uVar11; uVar4 = uVar20; if ((local_dc8 != (undefined **)0x0) && (local_dc8 != (undefined **)PTR_DAT_1401ac010)) { uVar4 = *(uint *)(local_dc8 + -1); } ppuVar10 = (undefined **)PTR_DAT_1401ac010; if ((int)uVar11 < (int)uVar4) { LAB_1400e480e: if (local_dc8 != (undefined **)0x0) { ppuVar10 = local_dc8; } } else { uVar11 = uVar20; if (local_dc8 != (undefined **)0x0) { if (local_dc8 != (undefined **)PTR_DAT_1401ac010) { uVar11 = *(uint *)(local_dc8 + -1); } goto LAB_1400e480e; } } uVar6 = (ulonglong)uVar11; FUN_14006ca20(puVar7 + 2,ppuVar10,uVar11); FUN_1400031e0((longlong *)&local_dc8,ppuVar10,uVar6,pppuVar18); local_dc8 = (undefined **)(puVar7 + 2); } } } FUN_140002e40((longlong *)&local_dc8); ppuVar10 = local_dc8; if (local_dc8 == (undefined **)0x0) { ppuVar10 = (undefined **)PTR_DAT_1401ac010; } FUN_14006ca20(ppuVar10,L"Stream Extract Error at Reliable UDP",uVar3); ppuVar10 = local_dc8; if (local_dc8 == (undefined **)0x0) { ppuVar10 = (undefined **)PTR_DAT_1401ac010; } uVar3 = FUN_14006c9f0((short *)ppuVar10); uVar20 = uVar19; if (0 < (int)uVar3) { uVar20 = uVar3; } uVar3 = uVar19; if ((local_dc8 != (undefined **)0x0) && (local_dc8 != (undefined **)PTR_DAT_1401ac010)) { uVar3 = *(uint *)(local_dc8 + -1); } if (((int)uVar20 < (int)uVar3) || (uVar20 = uVar19, local_dc8 == (undefined **)0x0)) { LAB_1400e48aa: if (((local_dc8 != (undefined **)PTR_DAT_1401ac010) && (local_dc8 != (undefined **)0x0)) && (local_dc8 + -1 != (undefined **)0x0)) { *(uint *)(local_dc8 + -1) = uVar20; *(undefined2 *)((longlong)local_dc8 + (longlong)(int)uVar20 * 2) = 0; } } else if (local_dc8 != (undefined **)PTR_DAT_1401ac010) { uVar20 = *(uint *)(local_dc8 + -1); goto LAB_1400e48aa; } local_d08[0] = 0; local_d08[1] = 0; local_d08[2] = 0; local_d08[3] = 0; local_d08[4] = 0; local_d08[5] = 0; local_d08[6] = 0; local_d08[7] = 0; local_d08[8] = 0; local_d08[9] = 0; local_d08[10] = 0; local_d08[0xb] = 0; local_d08[0xc] = 0; local_d08[0xd] = 0; local_d08[0xe] = 0; local_d08[0xf] = 0; local_d08[0x10] = 0; local_d08[0x11] = 0; local_d08[0x12] = 0; local_d08[0x13] = 0; local_d08[0x14] = 0; local_d08[0x15] = 0; local_d08[0x16] = 0; local_d08[0x17] = 0; local_d08[0x18] = 0; local_d08[0x19] = 0; local_d08[0x1a] = 0; local_d08[0x1b] = 0; local_d08[0x1c] = 0; local_d08[0x1d] = 0; local_d08[0x1e] = 0; local_d08[0x1f] = 0; local_d10 = Proud::ByteArray::vftable; uVar6 = uVar13; if (local_dc0 != (ulonglong *)0x0) { uVar6 = *local_dc0; } pppuVar18 = &local_dc8; plVar8 = FUN_140078c10(local_cd8,(ulonglong)local_db8,(ulonglong)*(uint *)(uVar6 + 0x56c), (longlong *)pppuVar18,(longlong)&local_d10); pIVar16 = (IMAGE_DOS_HEADER *)*param_1[0x21]; (**(code **)(pIVar16 + 1))(); pppuVar9 = &local_d10; FUN_140078360(pppuVar9); ppuVar10 = local_dc8; if (((local_dc8 != (undefined **)0x0) && (local_dc8 != (undefined **)PTR_DAT_1401ac010)) && (ppuVar1 = local_dc8 + -1, ppuVar1 != (undefined **)0x0)) { pppuVar9 = (undefined ***)FUN_14006cb70(pppuVar9,plVar8,pIVar16,pppuVar18); local_ce8 = pppuVar9; FUN_14006b350((int *)pppuVar9); local_ce0 = 1; puVar7 = (uint *)((longlong)ppuVar10 + -4); *puVar7 = *puVar7 - 1; if (*puVar7 == 0) { FUN_14006cc60(ppuVar1); } FUN_14006b3e0((longlong)pppuVar9); local_ce0 = 0; } local_dc8 = (undefined **)PTR_DAT_1401ac010; } while (iVar12 = (int)uVar13, iVar12 != local_d68._24_4_) { if ((iVar12 < 0) || ((int)local_d68._24_4_ <= iVar12)) { /* WARNING: Subroutine does not return */ FUN_14006be30(pppuVar9,plVar8,pIVar16,pppuVar18); } pIVar17 = (IMAGE_DOS_HEADER *)(local_d68._16_8_ + (longlong)iVar12 * 0x48); pIVar17->e_program[0] = 1; FUN_1400bc600((int *)pIVar17,0,pIVar16,pppuVar18); plVar8 = (longlong *)0x0; pppuVar9 = param_1; FUN_1400e6e40((IMAGE_DOS_HEADER *)param_1,(IMAGE_DOS_HEADER *)0x0,pIVar17,pppuVar18); if ((int)local_d68._24_4_ <= iVar12) { /* WARNING: Subroutine does not return */ FUN_14006be30(pppuVar9,plVar8,pIVar17,pppuVar18); } pIVar16 = pIVar17; uVar13 = (ulonglong)(iVar12 + 1); } FUN_1400c5af0((undefined8 *)local_d68); if (local_d80 != (longlong *)0x0) { plVar8 = local_d80 + 1; *plVar8 = *plVar8 + -1; if (*plVar8 == 0) { FUN_140080140((longlong)&local_d80,local_d80); } } local_d68._80_8_ = local_da0 + 1; FUN_1400d1800(local_da0 + 1); if (local_da0[2] != 0) { if (local_da0[3] < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } local_da0[3] = local_da0[3] & 0xffffffff00000000; } LAB_1400e4a40: if ((local_dc0 != (ulonglong *)0x0) && (local_dc0[1] = local_dc0[1] - 1, local_dc0[1] == 0)) { puVar2 = (undefined8 *)*local_dc0; if (puVar2 != (undefined8 *)0x0) { (**(code **)*puVar2)(puVar2,1); } FUN_14006cc60(local_dc0); } local_d68._80_8_ = local_d68 + 0x30; FUN_1400d1800((longlong *)(local_d68 + 0x30)); if ((local_d68._56_8_ != 0) && ((int)local_d68._68_4_ < 0)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } return; }