/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x1401eea40 FUN_1401eea40 * Pseudocode, not original source. */ void FUN_1401eea40(longlong param_1,undefined8 param_2,int *param_3) { undefined8 *puVar1; uint uVar2; uint uVar3; longlong *plVar4; uint *puVar5; undefined8 uVar6; uint *puVar7; uint uVar8; uint uVar9; int iVar10; ulonglong uVar11; ulonglong uVar12; ulonglong uVar13; int local_res8 [2]; undefined8 local_res10; uint *local_res18; longlong *local_res20; undefined **local_c8; undefined8 local_c0; longlong local_b8; undefined8 local_b0; undefined4 local_a8; undefined4 local_a4; undefined **local_a0; int local_98; undefined2 local_94; undefined **local_90; undefined8 local_88; undefined8 local_80; undefined8 local_78; undefined8 local_70; undefined8 local_68; undefined1 local_60; undefined1 local_58 [8]; undefined8 local_50; local_50 = 0xfffffffffffffffe; local_res10 = param_2; (**(code **)(*(longlong *)(*(longlong *)(param_1 + 0x108) + 0x78) + 0x10))(); local_a0 = Proud::AddrPort::vftable; local_98 = param_3[0xe]; local_94 = (undefined2)param_3[0xf]; plVar4 = (longlong *)FUN_1401d0f00(*(undefined8 *)(param_1 + 0x108),&local_res20,&local_a0); uVar11 = 0; uVar13 = uVar11; if ((ulonglong *)*plVar4 != (ulonglong *)0x0) { uVar13 = *(ulonglong *)*plVar4; } if ((local_res20 != (longlong *)0x0) && (local_res20[1] = local_res20[1] + -1, local_res20[1] == 0)) { puVar1 = (undefined8 *)*local_res20; if (puVar1 != (undefined8 *)0x0) { (**(code **)*puVar1)(puVar1,1); } FUN_14016d970(local_res20); } if ((uVar13 == 0) || (*(char *)(uVar13 + 0x650) != '\0')) { if (*(longlong *)(param_3 + 2) == 0) { if (*(longlong *)(param_3 + 4) == 0) { /* WARNING: Subroutine does not return */ FUN_14016d1e0(); } iVar10 = param_3[6]; } else { iVar10 = *(int *)(*(longlong *)(param_3 + 2) + 0x18); } FUN_14016b600(param_3,iVar10 - ((int)(*param_3 + (*param_3 >> 0x1f & 7U)) >> 3)); return; } local_c0 = 0; local_b8 = 0; local_b0 = 0; local_c8 = Proud::CReceivedMessageList::vftable; local_a8 = 1000; local_a4 = 1; FUN_1401ff5a0(uVar13 + 0x638,param_3,&local_c8,local_res8); if (local_res8[0] == 0) goto LAB_1401eeda2; FUN_14016d8c0(); local_res18 = (uint *)PTR_DAT_1403440a0; uVar2 = FUN_14016d740(L"Stream Extract Error at Reliable UDP"); uVar9 = 0; uVar12 = uVar11; if ((local_res18 != (uint *)0x0) && (uVar12 = 0, local_res18 != (uint *)PTR_DAT_1403440a0)) { uVar12 = (ulonglong)local_res18[-2]; } uVar3 = uVar2; if ((((int)uVar2 <= (int)uVar12) && (uVar3 = uVar9, local_res18 != (uint *)0x0)) && (local_res18 != (uint *)PTR_DAT_1403440a0)) { uVar3 = local_res18[-2]; } uVar8 = 1; if (1 < (int)uVar3) { uVar8 = uVar3; } uVar3 = uVar9; if ((local_res18 != (uint *)0x0) && (local_res18 != (uint *)PTR_DAT_1403440a0)) { uVar3 = local_res18[-2]; } if ((int)uVar3 < (int)uVar8) { if (local_res18 == (uint *)0x0) { local_res18 = (uint *)PTR_DAT_1403440a0; } if ((int)uVar8 < 0) { /* WARNING: Subroutine does not return */ FUN_14016d6b0(); } if (uVar8 == 0) { FUN_14004eb70(&local_res18); } else { uVar3 = uVar9; if ((local_res18 != (uint *)0x0) && (local_res18 != (uint *)PTR_DAT_1403440a0)) { uVar3 = local_res18[-2]; } if (uVar8 != uVar3) { puVar5 = (uint *)FUN_14016d940((longlong)(int)uVar8 * 2 + 10); if (puVar5 != (uint *)0x0) { *puVar5 = 0; puVar5[1] = 1; } *puVar5 = uVar8; uVar3 = uVar9; if ((local_res18 != (uint *)0x0) && (local_res18 != (uint *)PTR_DAT_1403440a0)) { uVar3 = local_res18[-2]; } puVar7 = (uint *)PTR_DAT_1403440a0; if ((int)uVar8 < (int)uVar3) { LAB_1401eec4b: if (local_res18 != (uint *)0x0) { puVar7 = local_res18; } } else { uVar8 = uVar9; if (local_res18 != (uint *)0x0) { if (local_res18 != (uint *)PTR_DAT_1403440a0) { uVar8 = local_res18[-2]; } goto LAB_1401eec4b; } } FUN_14016d770(puVar5 + 2,puVar7,uVar8); FUN_14004eb70(&local_res18); local_res18 = puVar5 + 2; } } } FUN_14004e850(&local_res18); puVar5 = local_res18; if (local_res18 == (uint *)0x0) { puVar5 = (uint *)PTR_DAT_1403440a0; } FUN_14016d770(puVar5,L"Stream Extract Error at Reliable UDP",uVar2); puVar5 = local_res18; if (local_res18 == (uint *)0x0) { puVar5 = (uint *)PTR_DAT_1403440a0; } uVar3 = FUN_14016d740(puVar5); uVar2 = 0; if (0 < (int)uVar3) { uVar2 = uVar3; } uVar3 = uVar9; if ((local_res18 != (uint *)0x0) && (local_res18 != (uint *)PTR_DAT_1403440a0)) { uVar3 = local_res18[-2]; } if (((int)uVar2 < (int)uVar3) || (uVar2 = uVar9, local_res18 == (uint *)0x0)) { LAB_1401eecde: if (((local_res18 != (uint *)PTR_DAT_1403440a0) && (local_res18 != (uint *)0x0)) && (local_res18 + -2 != (uint *)0x0)) { local_res18[-2] = uVar2; *(undefined2 *)((longlong)local_res18 + (longlong)(int)uVar2 * 2) = 0; } } else if (local_res18 != (uint *)PTR_DAT_1403440a0) { uVar2 = local_res18[-2]; goto LAB_1401eecde; } local_88 = 0; local_80 = 0; local_78 = 0; local_70 = 0; local_90 = Proud::ByteArray::vftable; uVar6 = FUN_140198f80(local_58,local_res8[0],*(undefined4 *)(uVar13 + 0x56c),&local_res18, &local_90); (**(code **)(**(longlong **)(param_1 + 0x108) + 0x80))(*(longlong **)(param_1 + 0x108),uVar6); FUN_14019a9e0(&local_90); puVar5 = local_res18; param_2 = local_res10; if (((local_res18 != (uint *)0x0) && (local_res18 != (uint *)PTR_DAT_1403440a0)) && (puVar7 = local_res18 + -2, puVar7 != (uint *)0x0)) { uVar6 = FUN_14016d8c0(); local_68 = uVar6; FUN_14016db50(uVar6); local_60 = 1; puVar5 = puVar5 + -1; *puVar5 = *puVar5 - 1; if (*puVar5 == 0) { FUN_14016d970(puVar7); } FUN_14016dbe0(uVar6); param_2 = local_res10; } LAB_1401eeda2: while( true ) { iVar10 = (int)uVar11; if (iVar10 == (int)local_b0) { FUN_1401a7fe0(&local_c8); return; } if ((iVar10 < 0) || ((int)local_b0 <= iVar10)) break; *(char *)(local_b8 + (longlong)iVar10 * 0x48 + 0x40) = (char)param_3[0x10]; FUN_1401f17a0(param_1,param_2); if ((int)local_b0 <= iVar10) { /* WARNING: Subroutine does not return */ FUN_14016d6e0(); } uVar11 = (ulonglong)(iVar10 + 1); } /* WARNING: Subroutine does not return */ FUN_14016d6e0(); }