/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x1400c8ed0 FUN_1400c8ed0 * Pseudocode, not original source. */ undefined8 FUN_1400c8ed0(longlong *param_1,IMAGE_DOS_HEADER *param_2,IMAGE_DOS_HEADER *param_3, IMAGE_DOS_HEADER *param_4) { uint uVar1; int iVar2; undefined8 uVar3; longlong *plVar4; int *piVar5; uint *puVar6; ulonglong uVar7; undefined8 *puVar8; uint uVar9; IMAGE_DOS_HEADER *pIVar10; uint *puVar11; uint uVar16; IMAGE_DOS_HEADER *pIVar12; ulonglong uVar13; undefined *puVar14; longlong lVar15; uint **ppuVar17; undefined8 *local_res10 [2]; IMAGE_DOS_HEADER *local_res20; uint *local_c8; uint local_c0; uint local_bc; undefined1 local_b8 [16]; undefined8 *local_a8; undefined8 local_a0; undefined8 local_98; word local_90 [4]; undefined **local_88; word local_80 [2]; undefined2 local_7c; byte local_78; undefined **local_68; undefined1 local_60; undefined3 uStack_5f; word local_5c; undefined **local_58; undefined4 local_50; word local_4c; undefined **local_48; word local_40 [2]; word local_3c; undefined **local_38; word local_30 [2]; word local_2c; byte local_28 [16]; local_28[0] = 0xfe; local_28[1] = 0xff; local_28[2] = 0xff; local_28[3] = 0xff; local_28[4] = 0xff; local_28[5] = 0xff; local_28[6] = 0xff; local_28[7] = 0xff; local_c0 = (int)(*(int *)param_2 + (*(int *)param_2 >> 0x1f & 7U)) >> 3; pIVar12 = param_3; local_res20 = param_4; uVar3 = FUN_1400bd260((uint *)param_2,&local_bc,param_3,param_4); if ((char)uVar3 == '\0') goto switchD_1400c8f57_caseD_3; local_res10[0] = (undefined8 *)((ulonglong)local_res10[0] & 0xffffffffffffff00); pIVar12 = &IMAGE_DOS_HEADER_140000000; plVar4 = param_1; pIVar10 = param_2; switch(local_bc) { case 1: pIVar12 = (IMAGE_DOS_HEADER *)0x0; FUN_1400c8ae0((longlong)param_1,(int *)param_2,0,(longlong)param_3, local_res20 != (IMAGE_DOS_HEADER *)0x0); param_4 = param_3; default: switchD_1400c8f57_caseD_3: uVar7 = FUN_1400bc600((int *)param_2,(ulonglong)local_c0,pIVar12,param_4); return uVar7 & 0xffffffffffffff00; case 2: pIVar12 = (IMAGE_DOS_HEADER *)0x0; FUN_1400c8d00((longlong)param_1,(int *)param_2,0,(longlong)param_3, local_res20 != (IMAGE_DOS_HEADER *)0x0); param_4 = param_3; goto switchD_1400c8f57_caseD_3; case 5: FUN_1400c7630((int *)param_1,(uint *)param_2,(longlong *)param_3,param_4); break; case 7: FUN_1400c5c90((longlong)param_1,(uint *)param_2,(uint *)param_3,param_4); break; case 0xc: local_58 = Proud::AddrPort::vftable; local_50._0_2_ = param_2->e_res2_10_[8]; local_50._2_2_ = param_2->e_res2_10_[9]; local_4c = (word)param_2->e_lfanew; uVar7 = FUN_14006fbe0((longlong)&local_58); if ((char)uVar7 == '\0') { FUN_14009b0d0((longlong *)param_1[0x29],(wchar_t *)param_3, "receivedInfo.GetRemoteAddr().IsUnicastEndpoint()",2); } local_48 = Proud::AddrPort::vftable; local_40 = *(word (*) [2])(param_2->e_res2_10_ + 8); local_3c = (word)param_2->e_lfanew; param_3 = (IMAGE_DOS_HEADER *)&local_48; param_4 = local_res20; FUN_1400c3820((longlong)param_1,(uint *)param_2,(longlong)param_3,(longlong)local_res20); break; case 0xe: FUN_1400c2ec0((longlong)param_1,(uint *)param_2,(longlong)param_3,(TypeDescriptor *)param_4); break; case 0x10: local_38 = Proud::AddrPort::vftable; local_30 = *(word (*) [2])(param_2->e_res2_10_ + 8); local_2c = (word)param_2->e_lfanew; uVar7 = FUN_14006fbe0((longlong)&local_38); if ((char)uVar7 == '\0') { FUN_14009b0d0((longlong *)param_1[0x29],(wchar_t *)param_3, "receivedInfo.GetRemoteAddr().IsUnicastEndpoint()",2); } local_68 = Proud::AddrPort::vftable; _local_60 = param_2->e_res2_10_[8]; unique0x00023d02 = param_2->e_res2_10_[9]; local_5c = (word)param_2->e_lfanew; param_3 = (IMAGE_DOS_HEADER *)&local_68; param_4 = local_res20; FUN_1400c3bc0((longlong)param_1,(uint *)param_2,(longlong)param_3,(longlong)local_res20); break; case 0x12: FUN_1400c3340((longlong)param_1,(uint *)param_2,(longlong)param_3,param_4); break; case 0x14: FUN_1400c3fb0((longlong)param_1,(uint *)param_2,(wchar_t *)param_3,(longlong)param_4); break; case 0x15: FUN_1400c4810((longlong)param_1,(uint *)param_2,(wchar_t *)param_3,(uint **)param_4); break; case 0x16: FUN_1400c4f80((longlong)param_1,(uint *)param_2,(wchar_t *)param_3,param_4); break; case 0x1a: FUN_1400c5350((longlong)param_1,(uint *)param_2,(longlong *)param_3,param_4); break; case 0x1b: FUN_1400c1c10((longlong)param_1,param_2,(wchar_t *)param_3,param_4); break; case 0x24: case 0x25: FUN_1400bca00((undefined4 *)local_b8); local_88 = Proud::AddrPort::vftable; local_78 = 0; local_90[0] = 0; local_90[1] = 0; local_80[0] = (word)DAT_1401ac3d0; local_80[1] = DAT_1401ac3d0._2_2_; local_7c = DAT_1401ac3d4; param_4 = (IMAGE_DOS_HEADER *)local_b8; pIVar10 = (IMAGE_DOS_HEADER *)(ulonglong)local_bc; pIVar12 = param_2; uVar3 = FUN_1400c0610((uint *)param_1[0x29],local_bc,(uint *)param_2,(uint *)param_4); if ((char)uVar3 != '\0') { local_78 = param_2->e_program[0]; local_80 = *(word (*) [2])(param_2->e_res2_10_ + 8); local_7c = (undefined2)param_2->e_lfanew; local_90._0_4_ = *(undefined4 *)param_2->e_res2_10_; pIVar10 = (IMAGE_DOS_HEADER *)local_b8; param_4 = local_res20; uVar3 = FUN_1400c8ed0(param_1,pIVar10,param_3,local_res20); local_res10[0] = (undefined8 *)CONCAT71(local_res10[0]._1_7_,(char)uVar3); pIVar12 = param_3; } local_c8 = (uint *)(local_b8 + 8); plVar4 = (longlong *)(local_b8 + 8); FUN_1400d1800(plVar4); if ((local_a8 != (undefined8 *)0x0) && (local_a0._4_4_ < 0)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } goto LAB_1400c9265; case 0x26: FUN_1400bca00((undefined4 *)local_b8); local_88 = Proud::AddrPort::vftable; local_78 = 0; local_90[0] = 0; local_90[1] = 0; local_80[0] = (word)DAT_1401ac3d0; local_80[1] = DAT_1401ac3d0._2_2_; local_7c = DAT_1401ac3d4; pIVar12 = (IMAGE_DOS_HEADER *)local_b8; uVar3 = FUN_1400bea40((longlong *)param_1[0x29],(uint *)param_2,(int *)pIVar12, (ulonglong)param_4); if ((char)uVar3 != '\0') { local_78 = param_2->e_program[0]; local_80 = *(word (*) [2])(param_2->e_res2_10_ + 8); local_7c = (undefined2)param_2->e_lfanew; local_90._0_4_ = *(undefined4 *)param_2->e_res2_10_; pIVar10 = (IMAGE_DOS_HEADER *)local_b8; param_4 = local_res20; uVar3 = FUN_1400c8ed0(param_1,pIVar10,param_3,local_res20); local_res10[0] = (undefined8 *)CONCAT71(local_res10[0]._1_7_,(char)uVar3); pIVar12 = param_3; } local_c8 = (uint *)(local_b8 + 8); plVar4 = (longlong *)(local_b8 + 8); FUN_1400d1800(plVar4); if ((local_a8 != (undefined8 *)0x0) && (local_a0._4_4_ < 0)) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } LAB_1400c9265: puVar6 = (uint *)0x0; param_3 = pIVar12; if ((char)local_res10[0] != '\x01') { if ((char)local_res10[0] == '\0') goto switchD_1400c8f57_caseD_3; goto LAB_1400c9595; } break; case 0x27: FUN_1400c5820((longlong)param_1,param_2,(longlong *)param_3,param_4); break; case 0x28: FUN_1400c1ca0((longlong)param_1,(uint *)param_2,(longlong)param_3,param_4); } if (*(longlong *)¶m_2->e_cparhdr == 0) { lVar15._0_2_ = param_2->e_sp; lVar15._2_2_ = param_2->e_csum; lVar15._4_2_ = param_2->e_ip; lVar15._6_2_ = param_2->e_cs; if (lVar15 == 0) { /* WARNING: Subroutine does not return */ FUN_1400d1900(plVar4,pIVar10,param_3,param_4); } uVar16._0_2_ = param_2->e_lfarlc; uVar16._2_2_ = param_2->e_ovno; } else { uVar16 = *(uint *)(*(longlong *)¶m_2->e_cparhdr + 0x18); } uVar9 = *(int *)param_2 >> 0x1f & 7; uVar1 = (int)(*(int *)param_2 + uVar9) >> 3; puVar6 = (uint *)(ulonglong)uVar1; if (((uVar16 == uVar1) || (puVar6 = (uint *)(ulonglong)local_bc, local_bc == 0x24)) || (local_bc == 0x25)) goto LAB_1400c9595; FUN_14006cb70((ulonglong)uVar16,(ulonglong)uVar9,param_3,param_4); local_c8 = (uint *)PTR_DAT_1401ac010; local_c0 = FUN_14006c9f0(L"Proud::CNetThreads_S::NetWorkerThread_ProcessMessage_ProudNetLayer"); uVar16 = 0; uVar7 = 0; if ((local_c8 != (uint *)0x0) && (uVar7 = 0, local_c8 != (uint *)PTR_DAT_1401ac010)) { uVar7 = (ulonglong)local_c8[-2]; } uVar1 = local_c0; if ((((int)local_c0 <= (int)uVar7) && (uVar1 = uVar16, local_c8 != (uint *)0x0)) && (local_c8 != (uint *)PTR_DAT_1401ac010)) { uVar1 = local_c8[-2]; } uVar9 = 1; if (1 < (int)uVar1) { uVar9 = uVar1; } if ((local_c8 != (uint *)0x0) && (local_c8 != (uint *)PTR_DAT_1401ac010)) { uVar16 = local_c8[-2]; } if ((int)uVar16 < (int)uVar9) { if (local_c8 == (uint *)0x0) { local_c8 = (uint *)PTR_DAT_1401ac010; } if ((int)uVar9 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if (uVar9 == 0) { FUN_1400031e0((longlong *)&local_c8,PTR_DAT_1401ac010,uVar7,0); } else { uVar16 = 0; if ((local_c8 != (uint *)0x0) && (local_c8 != (uint *)PTR_DAT_1401ac010)) { uVar16 = local_c8[-2]; } if (uVar9 != uVar16) { puVar6 = (uint *)FUN_14006cbf0((longlong)(int)uVar9 * 2 + 10); uVar7 = 0; uVar16 = 0; if (puVar6 != (uint *)0x0) { *puVar6 = 0; puVar6[1] = 1; } *puVar6 = uVar9; if ((local_c8 != (uint *)0x0) && (local_c8 != (uint *)PTR_DAT_1401ac010)) { uVar16 = local_c8[-2]; } puVar11 = (uint *)PTR_DAT_1401ac010; if ((int)uVar9 < (int)uVar16) { uVar13 = (ulonglong)uVar9; LAB_1400c93e2: if (local_c8 != (uint *)0x0) { puVar11 = local_c8; } } else { uVar13 = uVar7; if (local_c8 != (uint *)0x0) { if (local_c8 != (uint *)PTR_DAT_1401ac010) { uVar13 = (ulonglong)local_c8[-2]; } goto LAB_1400c93e2; } } FUN_14006ca20(puVar6 + 2,puVar11,(int)uVar13); FUN_1400031e0((longlong *)&local_c8,puVar11,uVar13,uVar7); local_c8 = puVar6 + 2; } } } FUN_140002e40((longlong *)&local_c8); puVar6 = local_c8; if (local_c8 == (uint *)0x0) { puVar6 = (uint *)PTR_DAT_1401ac010; } FUN_14006ca20(puVar6,L"Proud::CNetThreads_S::NetWorkerThread_ProcessMessage_ProudNetLayer", local_c0); puVar6 = local_c8; if (local_c8 == (uint *)0x0) { puVar6 = (uint *)PTR_DAT_1401ac010; } uVar1 = FUN_14006c9f0((short *)puVar6); puVar14 = PTR_DAT_1401ac010; puVar6 = (uint *)0x0; uVar16 = 0; if (0 < (int)uVar1) { uVar16 = uVar1; } puVar11 = puVar6; if ((local_c8 != (uint *)0x0) && (puVar11 = (uint *)0x0, local_c8 != (uint *)PTR_DAT_1401ac010)) { puVar11 = (uint *)(ulonglong)local_c8[-2]; } if (((int)uVar16 < (int)puVar11) || (uVar16 = 0, local_c8 == (uint *)0x0)) { LAB_1400c9479: if (((local_c8 != (uint *)PTR_DAT_1401ac010) && (local_c8 != (uint *)0x0)) && (puVar11 = local_c8 + -2, puVar11 != (uint *)0x0)) { *puVar11 = uVar16; *(short *)((longlong)local_c8 + (longlong)(int)uVar16 * 2) = 0; } } else if (local_c8 != (uint *)PTR_DAT_1401ac010) { uVar16 = local_c8[-2]; goto LAB_1400c9479; } iVar2 = FUN_14007c120((longlong)param_2,puVar11,puVar14,0); local_res10[0] = (undefined8 *)FUN_1400a1cc0((longlong)param_2,puVar11,puVar14,puVar6); local_b8._0_8_ = Proud::CFastArray::vftable; local_b8._8_2_ = 0; local_b8._10_2_ = 0; local_b8._12_2_ = 0; local_b8._14_2_ = 0; local_a8 = (undefined8 *)0x0; local_a0._0_2_ = 0; local_a0._2_2_ = 0; local_a0._4_2_ = 0; local_a0._6_2_ = 0; local_98._0_2_ = 0; local_98._2_2_ = 0; local_98._4_2_ = 0; local_98._6_2_ = 0; if (iVar2 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } FUN_1400146f0((longlong)local_b8,iVar2,(SIZE_T)puVar14); puVar8 = local_a8; if ((int)local_a0 == 0) { puVar8 = (undefined8 *)0x0; } FUN_140006500(puVar8,local_res10[0],(longlong)iVar2); local_b8._0_8_ = Proud::ByteArray::vftable; ppuVar17 = &local_c8; plVar4 = FUN_140078c10((longlong *)local_res10,0x1f,(ulonglong)*(uint *)param_2->e_res2_10_, (longlong *)ppuVar17,(longlong)local_b8); lVar15 = *(longlong *)param_1[0x29]; (**(code **)(lVar15 + 0x80))(); puVar8 = (undefined8 *)local_b8; FUN_140078360(puVar8); puVar6 = local_c8; if (((local_c8 != (uint *)0x0) && (local_c8 != (uint *)PTR_DAT_1401ac010)) && (puVar11 = local_c8 + -2, puVar11 != (uint *)0x0)) { piVar5 = (int *)FUN_14006cb70(puVar8,plVar4,lVar15,ppuVar17); local_68 = (undefined **)piVar5; FUN_14006b350(piVar5); local_60 = 1; puVar6 = puVar6 + -1; *puVar6 = *puVar6 - 1; if (*puVar6 == 0) { FUN_14006cc60(puVar11); } puVar6 = (uint *)FUN_14006b3e0((longlong)piVar5); } LAB_1400c9595: return CONCAT71((int7)((ulonglong)puVar6 >> 8),1); }