/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x14007b6d0 FUN_14007b6d0 * Pseudocode, not original source. */ void FUN_14007b6d0(longlong param_1,int param_2) { longlong *plVar1; LPVOID pvVar2; int iVar3; undefined8 *puVar4; undefined4 *puVar5; longlong lVar6; int iVar7; int iVar8; exception local_58 [80]; lVar6 = (longlong)param_2; if (param_2 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } iVar7 = *(int *)(param_1 + 0x18); if (param_2 != iVar7) { if (*(int *)(param_1 + 0x1c) < param_2) { iVar7 = FUN_14007a070(param_1,param_2); plVar1 = *(longlong **)(param_1 + 8); if (*(int *)(param_1 + 0x1c) == 0) { if (plVar1 == (longlong *)0x0) { puVar4 = (undefined8 *)FUN_14006cbf0((longlong)iVar7 << 4); } else { puVar4 = (undefined8 *)(**(code **)(*plVar1 + 8))(); } *(undefined8 **)(param_1 + 0x10) = puVar4; if (0 < param_2) { do { if (puVar4 != (undefined8 *)0x0) { *puVar4 = Proud::AddrPort::vftable; *(undefined4 *)(puVar4 + 1) = 0; *(undefined2 *)((longlong)puVar4 + 0xc) = 0; } puVar4 = puVar4 + 2; lVar6 = lVar6 + -1; } while (lVar6 != 0); } } else { pvVar2 = *(LPVOID *)(param_1 + 0x10); if (plVar1 == (longlong *)0x0) { lVar6 = FUN_14006cbf0((longlong)iVar7 << 4); } else { lVar6 = (**(code **)(*plVar1 + 8))(); } iVar3 = *(int *)(param_1 + 0x18); iVar8 = 0; if (0 < iVar3) { puVar5 = (undefined4 *)(lVar6 + 8); do { if ((undefined8 *)(puVar5 + -2) != (undefined8 *)0x0) { *(undefined ***)(puVar5 + -2) = Proud::AddrPort::vftable; *puVar5 = *(undefined4 *)(((longlong)pvVar2 - lVar6) + (longlong)puVar5); *(undefined2 *)(puVar5 + 1) = *(undefined2 *)(((longlong)pvVar2 - lVar6) + 4 + (longlong)puVar5); } iVar8 = iVar8 + 1; puVar5 = puVar5 + 4; } while (iVar8 < iVar3); } iVar3 = param_2 - *(int *)(param_1 + 0x18); iVar8 = 0; puVar4 = (undefined8 *)((longlong)*(int *)(param_1 + 0x18) * 0x10 + lVar6); if (0 < iVar3) { do { if (puVar4 != (undefined8 *)0x0) { *puVar4 = Proud::AddrPort::vftable; *(undefined4 *)(puVar4 + 1) = 0; *(undefined2 *)((longlong)puVar4 + 0xc) = 0; } iVar8 = iVar8 + 1; puVar4 = puVar4 + 2; } while (iVar8 < iVar3); } if (lVar6 == 0) { FUN_14006ba50(local_58,L"Memory allocation failure!",puVar4,Proud::AddrPort::vftable); /* WARNING: Subroutine does not return */ _CxxThrowException(local_58,(ThrowInfo *)&DAT_1401a93e8); } plVar1 = *(longlong **)(param_1 + 8); if (plVar1 == (longlong *)0x0) { FUN_14006cc60(pvVar2); } else { (**(code **)(*plVar1 + 0x18))(plVar1,pvVar2); } *(longlong *)(param_1 + 0x10) = lVar6; } *(int *)(param_1 + 0x1c) = iVar7; } else if ((iVar7 - param_2 < 1) && (iVar3 = param_2 - iVar7, 0 < iVar3)) { puVar4 = (undefined8 *)((longlong)iVar7 * 0x10 + *(longlong *)(param_1 + 0x10)); iVar7 = 0; if (0 < iVar3) { do { if (puVar4 != (undefined8 *)0x0) { *puVar4 = Proud::AddrPort::vftable; *(undefined4 *)(puVar4 + 1) = 0; *(undefined2 *)((longlong)puVar4 + 0xc) = 0; } iVar7 = iVar7 + 1; puVar4 = puVar4 + 2; } while (iVar7 < iVar3); } } *(int *)(param_1 + 0x18) = param_2; } return; }