/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x14009cd20 FUN_14009cd20 * Pseudocode, not original source. */ ulonglong FUN_14009cd20(longlong *param_1,ulonglong param_2,undefined8 param_3,undefined8 param_4) { longlong *plVar1; LPVOID pvVar2; int *piVar3; longlong lVar4; undefined8 uVar5; ulonglong uVar6; longlong **pplVar7; undefined4 *puVar8; ulonglong uVar9; uint uVar10; uint *puVar11; longlong *local_res8; piVar3 = (int *)(**(code **)(param_1[-0x15] + 0x58)) (param_1 + -0x15,param_2,param_3,param_4,0xfffffffffffffffe); FUN_14006b350(piVar3); if (DAT_1401b42cf != '\0') { (**(code **)(param_1[-0x15] + 200))(param_1 + -0x15,L"Proud::CNetServerImpl::DestroyP2PGroup"); } uVar10 = (uint)param_2; uVar6 = param_2 & 0xffffffff; pplVar7 = &local_res8; FUN_140093630((longlong)(param_1 + -0x15),(longlong *)pplVar7,uVar10); if ((local_res8 == (longlong *)0x0) || (*local_res8 == 0)) { if ((local_res8 != (longlong *)0x0) && (local_res8[1] = local_res8[1] + -1, local_res8[1] == 0)) { pvVar2 = (LPVOID)*local_res8; if (pvVar2 != (LPVOID)0x0) { FUN_1400807c0((longlong)pvVar2,pplVar7,uVar6,param_4); FUN_14006cc60(pvVar2); } FUN_14006cc60(local_res8); } uVar6 = FUN_14006b3e0((longlong)piVar3); uVar6 = uVar6 & 0xffffffffffffff00; } else { while( true ) { if (local_res8 == (longlong *)0x0) { lVar4 = 0; } else { lVar4 = *local_res8; } if (*(longlong *)(lVar4 + 0x28) == 0) break; if (local_res8 == (longlong *)0x0) { puVar8 = (undefined4 *)0x0; } else { puVar8 = (undefined4 *)*local_res8; } if ((*(longlong *)(puVar8 + 10) == 0) || (*(undefined4 **)(puVar8 + 6) == (undefined4 *)0x0)) { /* WARNING: Subroutine does not return */ FUN_1400064e0(0x80004005); } (**(code **)(*param_1 + 0x128))(param_1,**(undefined4 **)(puVar8 + 6),*puVar8); } uVar6 = (param_2 & 0xffffffff) % (ulonglong)*(uint *)(param_1 + 0x70); puVar11 = (uint *)0x0; uVar9 = uVar6; if (param_1[0x6c] != 0) { puVar11 = *(uint **)(param_1[0x6c] + uVar6 * 8); while( true ) { if ((puVar11 == (uint *)0x0) || (uVar9 = (ulonglong)puVar11[8] % (ulonglong)*(uint *)(param_1 + 0x70), (int)uVar6 != (int)uVar9)) goto LAB_14009cea4; if (*puVar11 == uVar10) break; puVar11 = *(uint **)(puVar11 + 4); } FUN_140094db0((char *)(param_1 + 0x6b),puVar11,0); plVar1 = (longlong *)param_1[0x7a]; lVar4 = *plVar1; uVar5 = (**(code **)(param_1[0xe] + 8))(); uVar6 = param_2 & 0xffffffff; (**(code **)(lVar4 + 0x10))(plVar1,uVar5); uVar9 = param_2 & 0xffffffff; FUN_14009b3c0((SIZE_T *)(param_1 + -0x15),uVar10,uVar6,puVar11); } LAB_14009cea4: if ((local_res8 != (longlong *)0x0) && (local_res8[1] = local_res8[1] + -1, local_res8[1] == 0)) { pvVar2 = (LPVOID)*local_res8; if (pvVar2 != (LPVOID)0x0) { FUN_1400807c0((longlong)pvVar2,uVar9,uVar6,puVar11); FUN_14006cc60(pvVar2); } FUN_14006cc60(local_res8); } uVar5 = FUN_14006b3e0((longlong)piVar3); uVar6 = CONCAT71((int7)((ulonglong)uVar5 >> 8),1); } return uVar6; }