/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x14008dda0 FUN_14008dda0 * Pseudocode, not original source. */ void FUN_14008dda0(longlong *param_1,longlong *param_2,undefined8 param_3,double param_4) { int *piVar1; uint uVar2; int iVar3; void *pvVar4; undefined8 uVar5; longlong *plVar6; uint uVar7; undefined8 *puVar8; uint uVar9; uint uVar10; longlong lVar11; uint *puVar12; longlong *plVar13; ulonglong uVar14; longlong lVar15; longlong *plVar16; longlong lVar17; uint *puVar18; int iVar19; longlong lVar20; ulonglong uVar21; ulonglong uVar22; ulonglong in_R9; int iVar23; int iVar24; longlong lVar25; bool bVar26; bool bVar27; undefined8 *local_e0; longlong local_d8; longlong local_d0; undefined8 local_c8; undefined8 local_c0; undefined8 local_b8; undefined8 local_b0; undefined8 local_a8; undefined8 local_a0; void *local_98; exception local_90 [88]; if ((int)param_3 == 0) { return; } local_a0 = 0xfffffffffffffffe; bVar26 = false; plVar6 = param_1 + 0x2f4; FUN_14007b490((longlong)plVar6,0,param_3,in_R9); lVar25 = param_2[1]; iVar24 = 0; lVar11 = lVar25; local_d8 = lVar25; if (0 < (int)lVar25) { do { if ((iVar24 < 0) || (param_2[1] <= (longlong)iVar24)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } iVar19 = iVar24; if (iVar24 < (int)lVar25) { do { lVar15 = (longlong)iVar24; if (iVar24 == iVar19) { LAB_14008ded8: bVar27 = false; } else { lVar11 = (longlong)iVar19; if ((iVar19 < 0) || (param_2[1] <= lVar11)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_2[2] < 0x65) { puVar12 = (uint *)(param_2 + (lVar11 + 1) * 4); } else { puVar12 = (uint *)(lVar11 * 0x20 + *param_2); } if (param_2[1] <= lVar15) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_2[2] < 0x65) { puVar18 = (uint *)(param_2 + (lVar15 + 1) * 4); } else { puVar18 = (uint *)(lVar15 * 0x20 + *param_2); } in_R9 = (ulonglong)*puVar12; plVar13 = FUN_14008c450((longlong)(param_1 + 0x5b),(longlong *)&local_e0,*puVar18, *puVar12); bVar26 = true; if ((longlong *)*plVar13 == (longlong *)0x0) { lVar11 = 0; goto LAB_14008ded8; } lVar11 = *(longlong *)*plVar13; if (lVar11 == 0) goto LAB_14008ded8; bVar27 = true; } puVar8 = local_e0; if (((bVar26) && (bVar26 = false, local_e0 != (undefined8 *)0x0)) && (local_e0[1] = local_e0[1] + -1, local_e0[1] == 0)) { pvVar4 = (void *)*local_e0; local_98 = pvVar4; if (pvVar4 != (void *)0x0) { FUN_140078360((undefined8 *)((longlong)pvVar4 + 0x148)); FUN_140078360((undefined8 *)((longlong)pvVar4 + 0x120)); operator_delete(pvVar4); } FUN_14006cc60(puVar8); bVar26 = false; lVar25 = local_d8; } if (((bVar27) && (*(char *)(lVar11 + 8) == '\0')) && (*(double *)(lVar11 + 0x188) <= param_4 && param_4 != *(double *)(lVar11 + 0x188))) { local_c8 = CONCAT44(iVar19,iVar24); plVar13 = plVar6; local_d0 = lVar11; FUN_14007ba70((longlong)plVar6,(int)param_1[0x2f7],(longlong)&local_d0,1); uVar14 = 0; in_R9 = (ulonglong)(int)param_1[0x2f7]; uVar22 = uVar14; uVar21 = uVar14; if (0 < (longlong)in_R9) { do { if (((longlong)uVar21 < 0) || (iVar23 = (int)uVar22, (int)param_1[0x2f7] <= iVar23)) { /* WARNING: Subroutine does not return */ FUN_14006be30(plVar13,uVar22,uVar21,in_R9); } lVar15 = param_1[0x2f6]; if (*(int *)(uVar14 + 8 + lVar15) == iVar24) { piVar1 = (int *)(uVar14 + 0x10 + lVar15); *piVar1 = *piVar1 + 1; } else if (*(int *)(uVar14 + 0xc + lVar15) == iVar24) { piVar1 = (int *)(uVar14 + 0x14 + lVar15); *piVar1 = *piVar1 + 1; } if ((int)param_1[0x2f7] <= iVar23) { /* WARNING: Subroutine does not return */ FUN_14006be30(lVar15,uVar22,uVar21,in_R9); } plVar13 = (longlong *)param_1[0x2f6]; if (*(int *)(uVar14 + 8 + (longlong)plVar13) == iVar19) { piVar1 = (int *)(uVar14 + 0x10 + (longlong)plVar13); *piVar1 = *piVar1 + 1; } else if (*(int *)(uVar14 + 0xc + (longlong)plVar13) == iVar19) { piVar1 = (int *)(uVar14 + 0x14 + (longlong)plVar13); *piVar1 = *piVar1 + 1; } uVar21 = uVar21 + 1; uVar14 = uVar14 + 0x18; uVar22 = (ulonglong)(iVar23 + 1); } while ((longlong)uVar21 < (longlong)in_R9); } local_d0 = 0; local_c8 = 0; local_c0 = 0; } iVar19 = iVar19 + 1; } while (iVar19 < (int)lVar25); } iVar24 = iVar24 + 1; } while (iVar24 < (int)lVar25); } lVar25 = 0; uVar2 = *(uint *)(param_1 + 0x2f7); if ((int)param_1[0x2f7] != 0) { lVar25 = param_1[0x2f6]; } uVar22 = 0; if ((int)uVar2 < 0x65) { FUN_14007c890(lVar25,uVar2,0); } else { FUN_14008bbf0(lVar25,uVar2,0); } plVar16 = param_1 + 0x2f9; plVar13 = (longlong *)0x0; FUN_14007b600((longlong)plVar16,0,uVar22); iVar24 = 0; lVar25 = 0; if (0 < (int)param_1[0x2f7]) { lVar11 = 0; do { if ((lVar25 < 0) || ((int)param_1[0x2f7] <= iVar24)) { /* WARNING: Subroutine does not return */ FUN_14006be30(param_1,plVar13,uVar22,in_R9); } lVar15 = param_1[0x2f6]; local_b8 = *(undefined8 *)(lVar11 + lVar15); in_R9 = *(ulonglong *)(lVar11 + 8 + lVar15); uVar5 = *(undefined8 *)(lVar11 + 0x10 + lVar15); iVar19 = (int)param_1[0x2fc]; lVar20 = (longlong)iVar19; local_b0._4_4_ = (uint)(in_R9 >> 0x20); uVar2 = local_b0._4_4_; plVar13 = (longlong *)0x0; while (iVar23 = (int)plVar13, local_b0 = in_R9, local_a8 = uVar5, iVar23 != iVar19) { if ((iVar23 < 0) || ((int)param_1[0x2fc] <= iVar23)) { /* WARNING: Subroutine does not return */ FUN_14006be30(lVar15,plVar13,uVar22,in_R9); } lVar15 = (longlong)iVar23; uVar9 = *(uint *)(param_1[0x2fb] + lVar15 * 4); uVar22 = (ulonglong)uVar9; uVar21 = in_R9; if ((uVar9 == (uint)in_R9) || (uVar21 = in_R9, uVar9 == local_b0._4_4_)) goto LAB_14008e1ff; plVar13 = (longlong *)(ulonglong)(iVar23 + 1); } local_a8._4_4_ = (int)((ulonglong)uVar5 >> 0x20); if ((int)uVar5 < local_a8._4_4_) { if (iVar19 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } lVar15 = param_1[0x2fc]; uVar9 = (int)lVar15 + 1; plVar13 = (longlong *)(ulonglong)uVar9; FUN_14007b600((longlong)plVar16,uVar9,uVar22); iVar19 = (int)lVar15 - iVar19; if (0 < iVar19) { if ((int)param_1[0x2fc] == 0) { lVar15 = 0; lVar17 = 0; } else { lVar15 = param_1[0x2fb]; lVar17 = param_1[0x2fb]; } uVar22 = (longlong)iVar19 << 2; plVar13 = (longlong *)(lVar15 + lVar20 * 4); memmove((void *)(lVar17 + 4 + lVar20 * 4),plVar13,uVar22); } if ((int)param_1[0x2fc] == 0) { lVar15 = 0; } else { lVar15 = param_1[0x2fb]; } *(uint *)(lVar15 + lVar20 * 4) = uVar2; uVar21 = local_b0; } else { if (iVar19 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } lVar15 = param_1[0x2fc]; FUN_14007b600((longlong)plVar16,(int)lVar15 + 1,uVar22); iVar19 = (int)lVar15 - iVar19; if (0 < iVar19) { if ((int)param_1[0x2fc] == 0) { lVar15 = 0; lVar17 = 0; } else { lVar15 = param_1[0x2fb]; lVar17 = param_1[0x2fb]; } uVar22 = (longlong)iVar19 << 2; memmove((void *)(lVar17 + 4 + lVar20 * 4),(void *)(lVar15 + lVar20 * 4),uVar22); } if ((int)param_1[0x2fc] == 0) { plVar13 = (longlong *)0x0; } else { plVar13 = (longlong *)param_1[0x2fb]; } *(undefined4 *)((longlong)plVar13 + lVar20 * 4) = (undefined4)local_b0; uVar21 = local_b0; } LAB_14008e1ff: local_b0 = uVar21; iVar24 = iVar24 + 1; lVar25 = lVar25 + 1; lVar11 = lVar11 + 0x18; } while (iVar24 < (int)param_1[0x2f7]); } iVar24 = 0; lVar11 = 0; lVar25 = param_1[0x2fc]; if (0 < (longlong)(int)lVar25) { do { if ((lVar11 < 0) || ((int)param_1[0x2fc] <= iVar24)) { /* WARNING: Subroutine does not return */ FUN_14006be30(param_1,plVar13,uVar22,in_R9); } iVar19 = *(int *)(param_1[0x2fb] + lVar11 * 4); lVar15 = (longlong)iVar19; if ((iVar19 < 0) || (param_2[1] <= lVar15)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_2[2] < 0x65) { plVar13 = param_2 + (lVar15 + 1) * 4; } else { plVar13 = (longlong *)(lVar15 * 0x20 + *param_2); } if ((plVar13[2] == 0) && (plVar13[3] == 0)) { lVar20 = 0; iVar23 = 0; in_R9 = 0; lVar15 = param_1[0x2f7]; if (0 < (longlong)(int)lVar15) { uVar22 = 0; plVar16 = param_1; do { if ((int)param_3 <= lVar20) break; if (((longlong)in_R9 < 0) || ((int)param_1[0x2f7] <= iVar23)) { /* WARNING: Subroutine does not return */ FUN_14006be30(plVar16,plVar13,uVar22,in_R9); } lVar17 = param_1[0x2f6]; iVar3 = *(int *)(lVar17 + 8 + uVar22); plVar16 = (longlong *)(longlong)iVar3; if (iVar19 == iVar3) { lVar17 = (longlong)*(int *)(lVar17 + 0xc + uVar22); if ((lVar17 < 0) || (param_2[1] <= lVar17)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_2[2] < 0x65) { plVar16 = param_2 + (lVar17 + 1) * 4; } else { plVar16 = (longlong *)(lVar17 * 0x20 + *param_2); } if ((plVar16[2] == 0) && (plVar16[3] == 0)) { LAB_14008e39d: plVar13[3] = (longlong)plVar16; plVar16[2] = (longlong)plVar13; lVar20 = lVar20 + 1; plVar13 = (longlong *)plVar13[3]; } } else if (iVar19 == *(int *)(lVar17 + 0xc + uVar22)) { if (((longlong)plVar16 < 0) || (param_2[1] <= (longlong)plVar16)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if ((ulonglong)param_2[2] < 0x65) { plVar16 = param_2 + ((longlong)plVar16 + 1) * 4; } else { plVar16 = (longlong *)((longlong)plVar16 * 0x20 + *param_2); } if ((plVar16[2] == 0) && (plVar16[3] == 0)) { plVar13[2] = 0; goto LAB_14008e39d; } } iVar23 = iVar23 + 1; in_R9 = in_R9 + 1; uVar22 = uVar22 + 0x18; } while ((longlong)in_R9 < (longlong)(int)lVar15); } } iVar24 = iVar24 + 1; lVar11 = lVar11 + 1; } while (lVar11 < (int)lVar25); } FUN_14007b490((longlong)plVar6,0,uVar22,in_R9); iVar24 = (int)param_1[0x2fc]; if (iVar24 == 0) { return; } uVar2 = *(uint *)((longlong)param_1 + 0x17e4); uVar22 = (ulonglong)uVar2; if (-1 < (int)uVar2) goto LAB_14008e501; iVar19 = *(int *)((longlong)param_1 + 0x17ec); if (iVar19 == 0) { uVar10 = (int)(iVar24 + (iVar24 >> 0x1f & 7U)) >> 3; uVar9 = 0x400; if ((int)uVar10 < 0x400) { uVar9 = uVar10; } uVar10 = 4; if (4 < (int)uVar9) { uVar10 = uVar9; } LAB_14008e475: uVar9 = *(uint *)(param_1 + 0x2fd); bVar27 = SBORROW4(uVar9,uVar10); uVar7 = uVar9 - uVar10; bVar26 = uVar9 == uVar10; } else { if (iVar19 == 1) { uVar9 = (int)(iVar24 + (iVar24 >> 0x1f & 7U)) >> 3; uVar10 = 0x10; if (0x10 < (int)uVar9) { uVar10 = uVar9; } if (uVar10 < 0x11) { uVar10 = 0x10; } goto LAB_14008e475; } if (iVar19 != 2) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } uVar9 = *(uint *)(param_1 + 0x2fd); uVar10 = 0; bVar27 = false; bVar26 = uVar9 == 0; uVar7 = uVar9; } if (!bVar26 && bVar27 == (int)uVar7 < 0) { uVar10 = uVar9; } plVar6 = (longlong *)param_1[0x2fa]; if (uVar2 == 0) { if (plVar6 == (longlong *)0x0) { lVar11 = FUN_14006cbf0((longlong)(int)uVar10 << 2); } else { lVar11 = (**(code **)(*plVar6 + 8))(plVar6,(longlong)(int)uVar10 << 2); } } else { lVar25 = param_1[0x2fb]; if (plVar6 == (longlong *)0x0) { lVar11 = FUN_14006cc20(lVar25,(longlong)(int)uVar10 << 2); } else { uVar22 = (longlong)(int)uVar10 << 2; lVar11 = (**(code **)(*plVar6 + 0x10))(plVar6,lVar25); } if (lVar11 == 0) { FUN_14006ba50(local_90,L"Memory allocation failure!",uVar22,lVar25); /* WARNING: Subroutine does not return */ _CxxThrowException(local_90,(ThrowInfo *)&DAT_1401a93e8); } } param_1[0x2fb] = lVar11; *(uint *)((longlong)param_1 + 0x17e4) = uVar10; LAB_14008e501: *(undefined4 *)(param_1 + 0x2fc) = 0; return; }