/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x14010ff80 FUN_14010ff80 * Pseudocode, not original source. */ int FUN_14010ff80(int *param_1,uint param_2,void *param_3,uint *param_4) { byte bVar1; int *piVar2; int iVar3; char *_Src; ulonglong uVar4; void *_Base; uint uVar5; uint *puVar6; ulonglong _Count; char *pcVar7; uint uVar8; byte *pbVar9; uint uVar10; uVar10 = 1; _Count = (ulonglong)param_2; piVar2 = param_1; if (1 < param_2) { do { if (piVar2[0xe] != *piVar2) { return 0x10; } uVar10 = uVar10 + 1; piVar2 = piVar2 + 0xe; } while (uVar10 < param_2); } _Src = calloc(1,(ulonglong)*param_4); if (_Src != (char *)0x0) { uVar4 = FUN_14010ef40((longlong)param_1,param_2,_Src,param_4,0xf); if ((int)uVar4 == 0) { _Base = calloc(_Count,0x10); if (_Base == (void *)0x0) { free(_Src); iVar3 = 0xd; } else { pcVar7 = _Src + 2; if (0x7f < (byte)_Src[1]) { pcVar7 = pcVar7 + ((byte)_Src[1] & 0x7f); } uVar10 = (int)pcVar7 - (int)_Src; if (pcVar7 < _Src + *param_4) { puVar6 = (uint *)((longlong)_Base + 8); do { *(char **)(puVar6 + -2) = pcVar7; bVar1 = pcVar7[1]; iVar3 = 2; if (bVar1 < 0x80) { *puVar6 = (uint)bVar1; } else { uVar5 = bVar1 & 0x7f; *puVar6 = 0; if ((bVar1 & 0x7f) != 0) { uVar8 = 0; pbVar9 = (byte *)(pcVar7 + 2); iVar3 = uVar5 + 2; do { bVar1 = *pbVar9; pbVar9 = pbVar9 + 1; uVar8 = uVar8 << 8 | (uint)bVar1; uVar5 = uVar5 - 1; *puVar6 = uVar8; } while (uVar5 != 0); } } *puVar6 = *puVar6 + iVar3; uVar5 = *puVar6; puVar6 = puVar6 + 4; pcVar7 = pcVar7 + uVar5; } while (pcVar7 < _Src + *param_4); } qsort(_Base,_Count,0x10,FUN_14010fef0); memcpy(param_3,_Src,(ulonglong)uVar10); if (param_2 != 0) { puVar6 = (uint *)((longlong)_Base + 8); do { memcpy((void *)((ulonglong)uVar10 + (longlong)param_3),*(void **)(puVar6 + -2), (ulonglong)*puVar6); uVar10 = uVar10 + *puVar6; puVar6 = puVar6 + 4; _Count = _Count - 1; } while (_Count != 0); } free(_Base); free(_Src); iVar3 = 0; } return iVar3; } free(_Src); return (int)uVar4; } return 0xd; }