/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x1400d4950 FUN_1400d4950 * Pseudocode, not original source. */ /* WARNING: Removing unreachable block (ram,0x0001400d4eb9) */ /* WARNING: Removing unreachable block (ram,0x0001400d4ec0) */ /* WARNING: Removing unreachable block (ram,0x0001400d4ecf) */ void FUN_1400d4950(short *param_1,undefined8 param_2,longlong *param_3,undefined8 param_4) { longlong lVar1; longlong lVar2; undefined8 uVar3; undefined8 *puVar4; undefined8 *puVar5; int iVar6; uint uVar7; short *psVar8; undefined8 *puVar9; longlong *in_RDX; longlong lVar10; longlong *plVar11; uint uVar12; int iVar13; longlong *plVar14; size_t sVar15; ulonglong uVar16; int iVar17; int iVar18; longlong local_res20; undefined8 local_a8; exception local_98 [96]; puVar5 = (undefined8 *)0x0; uVar12 = 0; psVar8 = param_1 + 0x18; puVar4 = puVar5; do { if (((longlong)puVar4 < 0) || (5 < (longlong)puVar4)) { /* WARNING: Subroutine does not return */ FUN_14006be30(psVar8,in_RDX,param_3,param_4); } plVar14 = *(longlong **)psVar8; if (plVar14 != (longlong *)0x0) { FUN_1400d4340(param_3,in_RDX,(longlong)param_3); *(undefined4 *)(param_3 + 0xd5) = *(undefined4 *)(param_1 + 0xbc); local_a8 = (int *)CONCAT44(local_a8._4_4_,0x10); *(short *)((longlong)param_3 + 0x6ac) = param_1[0xbe]; param_3[0xce] = *(longlong *)(param_1 + 200); *(undefined2 *)(param_3 + 0xcc) = 0xabce; *(short *)((longlong)param_3 + 0x662) = param_1[0xc0]; lVar1 = plVar14[6]; param_3[0xcd] = 0; *(int *)((longlong)param_3 + 0x664) = (int)lVar1; lVar1 = param_3[1]; if (lVar1 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } FUN_1400d3a20(param_3,lVar1 + 1,-1); if (param_3[1] <= lVar1) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_3[2] < 0x65) { plVar11 = param_3 + (lVar1 + 2) * 2; } else { plVar11 = (longlong *)(lVar1 * 0x10 + *param_3); } *plVar11 = (longlong)local_a8; plVar11[1] = (longlong)(param_3 + 0xcc); puVar4 = puVar5; if ((int)plVar14[6] != 0) { puVar4 = (undefined8 *)plVar14[5]; } lVar1 = param_3[1]; local_a8 = (int *)CONCAT44(local_a8._4_4_,(int)plVar14[6]); if (lVar1 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } sVar15 = 0xffffffffffffffff; FUN_1400d3a20(param_3,lVar1 + 1,-1); if (param_3[1] <= lVar1) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_3[2] < 0x65) { plVar11 = param_3 + (lVar1 + 2) * 2; } else { plVar11 = (longlong *)(lVar1 * 0x10 + *param_3); } *plVar11 = (longlong)local_a8; plVar11[1] = (longlong)puVar4; *(int *)(param_3 + 0xd6) = (int)plVar14[9]; iVar18 = (int)param_3[0xd2]; if (-1 < iVar18) { lVar1 = param_3[0xd2]; FUN_1400d3c80((longlong)(param_3 + 0xcf),(int)lVar1 + 1,sVar15); iVar17 = (int)lVar1 - iVar18; if (0 < iVar17) { puVar4 = puVar5; if ((int)param_3[0xd2] != 0) { puVar4 = (undefined8 *)param_3[0xd1]; } sVar15 = (longlong)iVar17 << 3; memmove(puVar4 + (longlong)iVar18 + 1,puVar4 + iVar18,sVar15); } if ((int)param_3[0xd2] != 0) { puVar5 = (undefined8 *)param_3[0xd1]; } puVar5[iVar18] = plVar14; if ((longlong *)plVar14[2] == (longlong *)0x0) { return; } FUN_1400d3410((longlong *)plVar14[2],plVar14,sVar15,param_4); return; } /* WARNING: Subroutine does not return */ FUN_14006be00(); } puVar4 = (undefined8 *)((longlong)puVar4 + 1); psVar8 = psVar8 + 0x1c; } while ((longlong)puVar4 < 6); iVar18 = -1; plVar14 = param_3; if (*(int *)(param_1 + 0xd8) == 0) { *(int *)(param_1 + 0xea) = *(int *)(param_1 + 0xea) + 1; local_a8 = (int *)(param_1 + 0x14); param_1[0xe0] = 0; param_1[0xe1] = 0; param_1[0xe2] = 0; param_1[0xe3] = 0; param_1[0xe4] = 0; param_1[0xe5] = 0; param_1[0xe6] = 0; param_1[0xe7] = 0; param_1[0xe8] = 0; param_1[0xe9] = 0; local_res20 = 0; puVar4 = puVar5; do { if ((local_res20 < 0) || (5 < local_res20)) { /* WARNING: Subroutine does not return */ FUN_14006be30(local_res20,in_RDX,plVar14,param_4); } iVar17 = *local_a8; while (0 < iVar17) { plVar11 = *(longlong **)(local_a8 + -4); if ((int)puVar4 == 0) { iVar18 = *(int *)(param_1 + 0xd8); if (iVar18 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } iVar17 = *(int *)(param_1 + 0xd8); uVar7 = iVar17 + 1; in_RDX = (longlong *)(ulonglong)uVar7; FUN_1400d3c80((longlong)(param_1 + 0xcc),uVar7,(longlong)plVar14); iVar17 = iVar17 - iVar18; if (0 < iVar17) { puVar9 = puVar5; if (*(int *)(param_1 + 0xd8) != 0) { puVar9 = *(undefined8 **)(param_1 + 0xd4); } in_RDX = puVar9 + iVar18; plVar14 = (longlong *)((longlong)iVar17 << 3); memmove(puVar9 + (longlong)iVar18 + 1,in_RDX,(size_t)plVar14); } puVar9 = puVar5; if (*(int *)(param_1 + 0xd8) != 0) { puVar9 = *(undefined8 **)(param_1 + 0xd4); } puVar9[iVar18] = plVar11; *(int *)(param_1 + 0xe0) = *(int *)(param_1 + 0xe0) + (int)plVar11[6]; iVar18 = (int)plVar11[9]; } else { if ((DAT_1401ac118 <= (int)plVar11[6] + *(int *)(param_1 + 0xe0)) || (iVar18 != (int)plVar11[9])) goto LAB_1400d4b9d; iVar17 = *(int *)(param_1 + 0xd8); if (iVar17 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } iVar13 = *(int *)(param_1 + 0xd8); uVar7 = iVar13 + 1; in_RDX = (longlong *)(ulonglong)uVar7; FUN_1400d3c80((longlong)(param_1 + 0xcc),uVar7,(longlong)plVar14); iVar13 = iVar13 - iVar17; if (0 < iVar13) { puVar9 = puVar5; if (*(int *)(param_1 + 0xd8) != 0) { puVar9 = *(undefined8 **)(param_1 + 0xd4); } in_RDX = puVar9 + iVar17; plVar14 = (longlong *)((longlong)iVar13 << 3); memmove(puVar9 + (longlong)iVar17 + 1,in_RDX,(size_t)plVar14); } puVar9 = puVar5; if (*(int *)(param_1 + 0xd8) != 0) { puVar9 = *(undefined8 **)(param_1 + 0xd4); } puVar9[iVar17] = plVar11; *(int *)(param_1 + 0xe0) = *(int *)(param_1 + 0xe0) + (int)plVar11[6]; } if ((longlong *)plVar11[2] != (longlong *)0x0) { FUN_1400d3410((longlong *)plVar11[2],plVar11,plVar14,param_4); in_RDX = plVar11; } puVar4 = (undefined8 *)(ulonglong)((int)puVar4 + 1); iVar17 = *local_a8; } local_res20 = local_res20 + 1; local_a8 = local_a8 + 0xe; } while (local_res20 < 6); LAB_1400d4b9d: } if (*(int *)(param_1 + 0xe0) < 1) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } FUN_1400d4340(param_3,in_RDX,(longlong)plVar14); *(undefined4 *)(param_3 + 0xd5) = *(undefined4 *)(param_1 + 0xbc); local_a8 = (int *)CONCAT44(local_a8._4_4_,0x10); *(short *)((longlong)param_3 + 0x6ac) = param_1[0xbe]; iVar17 = *(int *)(param_1 + 0xe0) - *(int *)(param_1 + 0xe4); if (DAT_1401ac118 < *(int *)(param_1 + 0xe0) - *(int *)(param_1 + 0xe4)) { iVar17 = DAT_1401ac118; } param_3[0xce] = *(longlong *)(param_1 + 200); *(undefined2 *)(param_3 + 0xcc) = 0xabcd; *(short *)((longlong)param_3 + 0x662) = param_1[0xc0]; *(undefined4 *)((longlong)param_3 + 0x664) = *(undefined4 *)(param_1 + 0xe0); *(undefined4 *)(param_3 + 0xcd) = *(undefined4 *)(param_1 + 0xea); *(undefined4 *)((longlong)param_3 + 0x66c) = *(undefined4 *)(param_1 + 0xe2); lVar1 = param_3[1]; if (-1 < lVar1) { lVar10 = lVar1 + 1; sVar15 = 0xffffffffffffffff; plVar14 = param_3; FUN_1400d3a20(param_3,lVar10,-1); if (param_3[1] <= lVar1) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_3[2] < 0x65) { plVar11 = param_3 + (lVar1 + 2) * 2; } else { plVar11 = (longlong *)(lVar1 * 0x10 + *param_3); } *plVar11 = (longlong)local_a8; plVar11[1] = (longlong)(param_3 + 0xcc); *(int *)(param_3 + 0xd6) = iVar18; iVar18 = *(int *)(param_1 + 0xe4); iVar13 = iVar18; while( true ) { if (iVar18 + iVar17 <= iVar13) { *(int *)(param_1 + 0xe2) = *(int *)(param_1 + 0xe2) + 1; if (*(int *)(param_1 + 0xe4) == *(int *)(param_1 + 0xe0)) { iVar18 = *(int *)(param_1 + 0xd8); puVar4 = puVar5; if (*(int *)(param_1 + 0xd8) != 0) { puVar4 = *(undefined8 **)(param_1 + 0xd4); } if (iVar18 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if (iVar18 != 0) { lVar1 = param_3[0xd2]; FUN_1400d3c80((longlong)(param_3 + 0xcf),(int)lVar1 + iVar18,sVar15); puVar9 = puVar5; if ((int)param_3[0xd2] != 0) { puVar9 = (undefined8 *)param_3[0xd1]; } sVar15 = (longlong)iVar18 << 3; if (sVar15 < 0x21) { puVar9 = puVar9 + (int)lVar1; for (uVar16 = (longlong)iVar18 & 0x1fffffffffffffff; uVar16 != 0; uVar16 = uVar16 - 1) { uVar3 = *puVar4; puVar4 = puVar4 + 1; *puVar9 = uVar3; puVar9 = puVar9 + 1; } sVar15 = 0; } else { memcpy(puVar9 + (int)lVar1,puVar4,sVar15); } } FUN_1400d3c80((longlong)(param_1 + 0xcc),0,sVar15); } lVar1 = param_3[1]; puVar4 = puVar5; puVar9 = puVar5; if (0 < lVar1) { do { if (((longlong)puVar5 < 0) || (lVar1 <= (longlong)puVar5)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_3[2] < 0x65) { plVar14 = param_3 + ((longlong)puVar5 + 2) * 2; } else { plVar14 = (longlong *)((longlong)puVar5 * 0x10 + *param_3); } uVar12 = (int)puVar9 + (int)*plVar14; uVar7 = (int)puVar4 + 1; puVar5 = (undefined8 *)(longlong)(int)uVar7; puVar4 = (undefined8 *)(ulonglong)uVar7; puVar9 = (undefined8 *)(ulonglong)uVar12; } while ((longlong)puVar5 < lVar1); } FUN_1400f94b0((longlong)(param_1 + 0xec),uVar12); *(undefined8 *)(param_1 + 0x100) = param_2; *(double *)(param_1 + 0xf8) = (double)(int)uVar12 + *(double *)(param_1 + 0xf8); return; } iVar13 = *(int *)(param_1 + 0xe8); if ((iVar13 < 0) || (*(int *)(param_1 + 0xd8) <= iVar13)) { /* WARNING: Subroutine does not return */ FUN_14006be30(plVar14,lVar10,sVar15,param_3); } lVar1 = *(longlong *)(*(longlong *)(param_1 + 0xd4) + (longlong)iVar13 * 8); iVar13 = *(int *)(lVar1 + 0x30) - *(int *)(param_1 + 0xe6); iVar6 = (iVar18 - *(int *)(param_1 + 0xe4)) + iVar17; if (iVar6 < iVar13) { iVar13 = iVar6; } if (iVar13 < 1) break; puVar4 = puVar5; if (*(int *)(lVar1 + 0x30) != 0) { puVar4 = *(undefined8 **)(lVar1 + 0x28); } iVar6 = *(int *)(param_1 + 0xe6); lVar2 = param_3[1]; local_a8._4_4_ = (undefined4)((ulonglong)local_a8 >> 0x20); local_a8 = (int *)CONCAT44(local_a8._4_4_,iVar13); if (lVar2 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } lVar10 = lVar2 + 1; sVar15 = 0xffffffffffffffff; plVar14 = param_3; FUN_1400d3a20(param_3,lVar10,-1); if (param_3[1] <= lVar2) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_3[2] < 0x65) { plVar11 = param_3 + (lVar2 + 2) * 2; } else { plVar11 = (longlong *)(lVar2 * 0x10 + *param_3); } *plVar11 = (longlong)local_a8; plVar11[1] = (longlong)iVar6 + (longlong)puVar4; *(int *)(param_1 + 0xe6) = *(int *)(param_1 + 0xe6) + iVar13; *(int *)(param_1 + 0xe4) = *(int *)(param_1 + 0xe4) + iVar13; if (*(int *)(param_1 + 0xe6) == *(int *)(lVar1 + 0x30)) { *(int *)(param_1 + 0xe8) = *(int *)(param_1 + 0xe8) + 1; param_1[0xe6] = 0; param_1[0xe7] = 0; } iVar13 = *(int *)(param_1 + 0xe4); } FUN_1400d41c0(param_1); FUN_14006ba50(local_98,L"Unexpected at PacketQueue Pop!",sVar15,param_3); /* WARNING: Subroutine does not return */ _CxxThrowException(local_98,(ThrowInfo *)&DAT_1401a93e8); } /* WARNING: Subroutine does not return */ FUN_14006be00(); }