/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x14009cf50 FUN_14009cf50 * Pseudocode, not original source. */ ulonglong FUN_14009cf50(longlong param_1,uint param_2,uint param_3,undefined8 param_4) { SIZE_T *pSVar1; longlong lVar2; LPVOID pvVar3; int iVar4; int *piVar5; longlong lVar6; uint *puVar7; uint *puVar8; uint *puVar9; uint *puVar10; undefined8 uVar11; ulonglong uVar12; uint *puVar13; longlong **pplVar14; ulonglong uVar15; uint uVar16; uint uVar17; ulonglong uVar18; TypeDescriptor *pTVar19; longlong *plVar20; longlong *local_res8; uint local_res10 [2]; uint local_res18 [2]; pSVar1 = (SIZE_T *)(param_1 + -0xa8); local_res10[0] = param_2; local_res18[0] = param_3; piVar5 = (int *)(**(code **)(*pSVar1 + 0x58))(pSVar1); FUN_14006b350(piVar5); if (DAT_1401b42cf != '\0') { (**(code **)(*pSVar1 + 200))(pSVar1,L"Proud::CNetServerImpl::LeaveP2PGroup"); } uVar12 = (ulonglong)local_res18[0]; pplVar14 = &local_res8; FUN_140093630((longlong)pSVar1,(longlong *)pplVar14,local_res18[0]); uVar16 = local_res10[0]; if ((local_res8 == (longlong *)0x0) || (lVar2 = *local_res8, lVar2 == 0)) { if ((local_res8 != (longlong *)0x0) && (local_res8[1] = local_res8[1] + -1, local_res8[1] == 0)) { pvVar3 = (LPVOID)*local_res8; if (pvVar3 != (LPVOID)0x0) { FUN_1400807c0((longlong)pvVar3,pplVar14,uVar12,param_4); FUN_14006cc60(pvVar3); } FUN_14006cc60(local_res8); } } else { uVar18 = (ulonglong)*(uint *)(lVar2 + 0x30); uVar12 = (ulonglong)local_res10[0] % uVar18; uVar15 = uVar12; if ((*(longlong *)(lVar2 + 0x10) != 0) && (puVar13 = *(uint **)(*(longlong *)(lVar2 + 0x10) + uVar12 * 8), puVar13 != (uint *)0x0)) { while( true ) { uVar15 = (ulonglong)puVar13[10] % uVar18; if ((int)uVar12 != (int)uVar15) goto LAB_14009d3f6; if (*puVar13 == local_res10[0]) break; puVar13 = *(uint **)(puVar13 + 6); if (puVar13 == (uint *)0x0) goto LAB_14009d3f6; } puVar13 = (uint *)0x0; plVar20 = local_res8; if (local_res10[0] == 1) { puVar10 = puVar13; if (pSVar1 != (SIZE_T *)0x0) { puVar10 = (uint *)(param_1 + 0x10); } } else { uVar15 = (ulonglong)local_res10[0]; lVar6 = FUN_14007dea0((longlong)pSVar1,local_res10[0]); if ((lVar6 == 0) || (puVar10 = (uint *)(lVar6 + 0x40), (uint *)(lVar6 + 0x40) == (uint *)0x0)) { plVar20[1] = plVar20[1] + -1; if (local_res8[1] == 0) { pvVar3 = (LPVOID)*local_res8; if (pvVar3 != (LPVOID)0x0) { FUN_1400807c0((longlong)pvVar3,uVar15,uVar12,uVar18); FUN_14006cc60(pvVar3); } FUN_14006cc60(local_res8); } goto LAB_14009d469; } } puVar9 = puVar13; if (*(longlong *)(lVar2 + 0x28) != 0) { puVar9 = *(uint **)(lVar2 + 0x18); } while( true ) { puVar7 = puVar13; if (plVar20 != (longlong *)0x0) { puVar7 = (uint *)*plVar20; } if (puVar9 == (uint *)0x0) break; if (*puVar9 != 1) { (**(code **)(*(longlong *)(param_1 + 0x400) + 0x80)) ((longlong *)(param_1 + 0x400),*puVar9,&DAT_1401b6110,local_res10,local_res18); plVar20 = local_res8; uVar16 = local_res10[0]; } if ((uVar16 != 1) && (uVar16 != *puVar9)) { (**(code **)(*(longlong *)(param_1 + 0x400) + 0x80)) ((longlong *)(param_1 + 0x400),uVar16,&DAT_1401b6110,puVar9,local_res18); plVar20 = local_res8; uVar16 = local_res10[0]; } puVar9 = *(uint **)(puVar9 + 6); } if ((uint *)(lVar2 + 8) != puVar7 + 2) { /* WARNING: Subroutine does not return */ FUN_1400064e0(0x80004005); } uVar17 = 1; if (uVar16 != 1) { puVar9 = puVar13; if (plVar20 != (longlong *)0x0) { puVar9 = (uint *)*plVar20; } puVar7 = puVar13; if (*(longlong *)(puVar9 + 10) != 0) { puVar7 = *(uint **)(puVar9 + 6); } while( true ) { puVar8 = puVar13; if (plVar20 != (longlong *)0x0) { puVar8 = (uint *)*plVar20; } if (puVar7 == (uint *)0x0) break; iVar4 = (**(code **)**(undefined8 **)(puVar7 + 4))(); if ((iVar4 != 1) && (iVar4 = (*(code *)**(undefined8 **)puVar10)(puVar10), iVar4 != 1)) { puVar8 = (uint *)(*(longlong *)(puVar7 + 4) + -0x40); if (*(longlong *)(puVar7 + 4) == 0) { puVar8 = puVar13; } FUN_140094880((char *)(param_1 + 0x230),(longlong)pSVar1,(longlong)(puVar10 + -0x10), (longlong)puVar8); } puVar7 = *(uint **)(puVar7 + 6); plVar20 = local_res8; } uVar17 = local_res10[0]; if (puVar9 + 2 != puVar8 + 2) { /* WARNING: Subroutine does not return */ FUN_1400064e0(0x80004005); } } puVar9 = puVar13; if (plVar20 != (longlong *)0x0) { puVar9 = (uint *)*plVar20; } uVar12 = (ulonglong)uVar17 % (ulonglong)puVar9[0xc]; if (*(longlong *)(puVar9 + 4) != 0) { puVar7 = *(uint **)(*(longlong *)(puVar9 + 4) + uVar12 * 8); while( true ) { if ((puVar7 == (uint *)0x0) || ((uint)uVar12 != puVar7[10] % puVar9[0xc])) goto LAB_14009d221; if (*puVar7 == uVar17) break; puVar7 = *(uint **)(puVar7 + 6); } FUN_1400d4570((char *)(puVar9 + 2),puVar7,'\0'); plVar20 = local_res8; uVar17 = local_res10[0]; } LAB_14009d221: uVar12 = (ulonglong)local_res18[0] % (ulonglong)puVar10[0xc]; if (*(longlong *)(puVar10 + 4) != 0) { puVar9 = *(uint **)(*(longlong *)(puVar10 + 4) + uVar12 * 8); while( true ) { if ((puVar9 == (uint *)0x0) || ((uint)uVar12 != puVar9[8] % puVar10[0xc])) goto LAB_14009d284; if (*puVar9 == local_res18[0]) break; puVar9 = *(uint **)(puVar9 + 4); } FUN_140094db0((char *)(puVar10 + 2),puVar9,0); plVar20 = local_res8; uVar17 = local_res10[0]; } LAB_14009d284: puVar10 = puVar13; if (plVar20 != (longlong *)0x0) { puVar10 = (uint *)*plVar20; } pTVar19 = (TypeDescriptor *)0x1e; puVar9 = (uint *)(ulonglong)uVar17; FUN_140098220((longlong)pSVar1,puVar10,(ulonglong)puVar9,0x1e); puVar10 = puVar13; if (local_res8 != (longlong *)0x0) { puVar10 = (uint *)*local_res8; } if ((*(longlong *)(puVar10 + 10) == 0) && (*(char *)(param_1 + 0x1758) == '\0')) { if (local_res8 != (longlong *)0x0) { puVar13 = (uint *)*local_res8; } uVar16 = *puVar13; pTVar19 = (TypeDescriptor *)(ulonglong)*(uint *)(param_1 + 0x380); puVar9 = (uint *)((ulonglong)uVar16 % (ulonglong)pTVar19); puVar13 = puVar9; if (*(longlong *)(param_1 + 0x360) != 0) { puVar10 = *(uint **)(*(longlong *)(param_1 + 0x360) + (longlong)puVar9 * 8); while( true ) { if ((puVar10 == (uint *)0x0) || (puVar13 = (uint *)((ulonglong)puVar10[8] % (ulonglong)pTVar19), (int)puVar9 != (int)puVar13)) goto LAB_14009d373; if (*puVar10 == uVar16) break; puVar10 = *(uint **)(puVar10 + 4); } FUN_140094db0((char *)(param_1 + 0x358),puVar10,0); plVar20 = *(longlong **)(param_1 + 0x3d0); lVar2 = *plVar20; uVar11 = (**(code **)(*(longlong *)(param_1 + 0x70) + 8))(); puVar9 = (uint *)(ulonglong)uVar16; (**(code **)(lVar2 + 0x10))(plVar20,uVar11); puVar13 = (uint *)(ulonglong)uVar16; FUN_14009b3c0(pSVar1,uVar16,(SIZE_T)puVar9,pTVar19); } } else { if (local_res8 != (longlong *)0x0) { puVar13 = (uint *)*local_res8; } FUN_1400887b0((longlong)pSVar1,puVar13,(longlong)puVar9,pTVar19); } LAB_14009d373: if ((local_res8 != (longlong *)0x0) && (local_res8[1] = local_res8[1] + -1, local_res8[1] == 0)) { pvVar3 = (LPVOID)*local_res8; if (pvVar3 != (LPVOID)0x0) { FUN_1400807c0((longlong)pvVar3,puVar13,puVar9,pTVar19); FUN_14006cc60(pvVar3); } FUN_14006cc60(local_res8); } uVar11 = FUN_14006b3e0((longlong)piVar5); return CONCAT71((int7)((ulonglong)uVar11 >> 8),1); } LAB_14009d3f6: local_res8[1] = local_res8[1] + -1; if (local_res8[1] == 0) { pvVar3 = (LPVOID)*local_res8; if (pvVar3 != (LPVOID)0x0) { FUN_1400807c0((longlong)pvVar3,uVar15,uVar12,uVar18); FUN_14006cc60(pvVar3); } FUN_14006cc60(local_res8); } } LAB_14009d469: uVar12 = FUN_14006b3e0((longlong)piVar5); return uVar12 & 0xffffffffffffff00; }