/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x1400c96e0 FUN_1400c96e0 * Pseudocode, not original source. */ void FUN_1400c96e0(byte **param_1,longlong param_2,IMAGE_DOS_HEADER *param_3, IMAGE_DOS_HEADER *param_4) { undefined4 uVar1; IMAGE_DOS_HEADER *pIVar2; int iVar3; int *piVar4; IMAGE_DOS_HEADER *pIVar5; IMAGE_DOS_HEADER *pIVar6; undefined8 uVar7; undefined8 *puVar8; longlong *plVar9; byte *pbVar10; byte **ppbVar11; word *pwVar12; int iVar13; byte *pbVar14; IMAGE_DOS_HEADER *pIVar15; IMAGE_DOS_HEADER *pIVar16; longlong lVar17; undefined1 local_170 [8]; IMAGE_DOS_HEADER *local_168; longlong local_160; undefined **local_158; byte local_150 [4]; word local_14c; undefined **local_148; word local_140 [4]; undefined **local_138; byte local_130 [4]; word local_12c; undefined **local_128; undefined4 local_120; word local_11c; longlong local_118; undefined **local_110; word local_108 [2]; word local_104; undefined **local_100; byte local_f8 [4]; word local_f4; undefined **local_f0; byte local_e8 [4]; word local_e4; word *local_e0; byte local_d8; int *local_d0; byte local_c8; int *local_c0; byte local_b8; byte *local_b0; byte local_a8 [8]; IMAGE_DOS_HEADER *local_a0; byte local_98 [16]; int *local_88; undefined1 local_80; word *local_78; undefined1 local_70; word *local_68; undefined1 local_60; undefined8 local_58; local_58 = 0xfffffffffffffffe; pbVar14 = (byte *)0x0; pbVar10 = param_3->e_program; if (param_3 == (IMAGE_DOS_HEADER *)0x0) { pbVar10 = pbVar14; } plVar9 = &local_118; pIVar5 = param_3; pIVar6 = param_4; FUN_1400d8980(plVar9,(longlong)pbVar10); if (*(int *)(param_2 + 8) < 1) { pwVar12 = param_3[1].e_res2_10_; local_68 = pwVar12; FUN_14006b350((int *)pwVar12); local_60 = 1; param_3[2].e_program[0] = 0; FUN_1400d8bf0((longlong)param_3,pbVar10,(undefined **)pIVar5,pIVar6); FUN_14006b3e0((longlong)pwVar12); goto LAB_1400c9ced; } local_158 = Proud::AddrPort::vftable; local_150[0] = 0; local_150[1] = 0; local_150[2] = 0; local_150[3] = 0; local_14c = 0; local_160 = 0; local_148 = Proud::AddrPort::vftable; local_140[0] = 0; local_140[1] = 0; local_140[2] = 0; FUN_14006cb70(plVar9,pbVar10,pIVar5,pIVar6); local_168 = (IMAGE_DOS_HEADER *)PTR_DAT_1401ac010; piVar4 = (int *)(**(code **)(*(longlong *)param_1[0x29] + 0x58))(); local_c0 = piVar4; FUN_14006b350(piVar4); local_b8 = 1; if (DAT_1401b42cf != '\0') { (**(code **)(*(longlong *)param_1[0x29] + 200)) (param_1[0x29],L"Proud::CNetThreads_S::NetWorkerThread_UdpRecvCompletionCase"); } lVar17 = (**(code **)(*(longlong *)(param_1[0x29] + 0x118) + 8))(); local_f0 = Proud::AddrPort::vftable; local_e8 = *(byte (*) [4])(param_2 + 0x30); local_e4 = *(word *)(param_2 + 0x34); pIVar5 = (IMAGE_DOS_HEADER *)FUN_14007c190((longlong)param_1[0x29],(longlong)&local_f0); local_100 = Proud::AddrPort::vftable; local_f8 = *(byte (*) [4])(param_2 + 0x30); local_f4 = *(word *)(param_2 + 0x34); local_170._0_4_ = FUN_14007cde0((longlong)param_1[0x29],(longlong)&local_100); uVar1 = *(undefined4 *)(param_1[0x29] + 0x22c); if (pIVar5 != (IMAGE_DOS_HEADER *)0x0) { FUN_1400d8960((longlong)pIVar5[1].e_program); local_140[0] = pIVar5[0xe].e_sp; local_140[1] = pIVar5[0xe].e_csum; local_140[2] = pIVar5[0xe].e_ip; } FUN_14006b3e0((longlong)piVar4); local_b8 = 0; local_e0 = param_3[1].e_res2_10_; FUN_14006b350((int *)local_e0); local_d8 = 1; local_128 = Proud::AddrPort::vftable; local_120 = *(undefined4 *)(param_2 + 0x30); local_11c = *(word *)(param_2 + 0x34); pbVar10 = pbVar14; if (*(ulonglong **)(param_3[2].e_program + 0x10) != (ulonglong *)0x0) { pbVar10 = (byte *)**(ulonglong **)(param_3[2].e_program + 0x10); } puVar8 = *(undefined8 **)(param_3[2].e_program + 0x38); pIVar6 = (IMAGE_DOS_HEADER *)FUN_140072240((longlong)pbVar10); pIVar16 = (IMAGE_DOS_HEADER *)&local_128; pIVar15 = (IMAGE_DOS_HEADER *)(ulonglong)*(uint *)(param_2 + 8); uVar7 = FUN_1400d6a50(puVar8,(longlong)pIVar6,*(uint *)(param_2 + 8),(longlong)pIVar16, (char)local_170._0_4_,lVar17,&local_160,(longlong *)&local_168); FUN_14006b3e0((longlong)param_3[1].e_res2_10_); local_d8 = 0; if ((int)uVar7 == 0) { if (pIVar5 != (IMAGE_DOS_HEADER *)0x0) { *(longlong *)(param_1[0x29] + 0x600) = *(longlong *)(param_1[0x29] + 0x600) + 1; *(longlong *)(param_1[0x29] + 0x640) = *(longlong *)(param_1[0x29] + 0x640) + (longlong)*(int *)(local_160 + 0x40); uVar7 = (**(code **)(*(longlong *)(param_1[0x29] + 0x118) + 8))(); pIVar5[3].e_lfarlc = (short)uVar7; pIVar5[3].e_ovno = (short)((ulonglong)uVar7 >> 0x10); pIVar5[3].e_res_4_[0] = (short)((ulonglong)uVar7 >> 0x20); pIVar5[3].e_res_4_[1] = (short)((ulonglong)uVar7 >> 0x30); uVar7 = (**(code **)(*(longlong *)(param_1[0x29] + 0x118) + 8))(); *(undefined8 *)(pIVar5[3].e_res2_10_ + 8) = uVar7; FUN_1400ac2e0((longlong)param_4,0,pIVar15,pIVar16); if (*(uint *)(local_160 + 0x40) != 0) { pbVar14 = *(byte **)(local_160 + 0x38); } FUN_1400d1f50((longlong)pIVar5,(longlong)pbVar14,(ulonglong)*(uint *)(local_160 + 0x40), (longlong)&local_148,uVar1,(longlong)param_4); pIVar6 = pIVar5; pIVar16 = param_3; FUN_1400c9630((longlong *)param_1,pIVar5,param_4,param_3); pIVar15 = param_4; goto LAB_1400c9bfc; } FUN_1400ac2e0((longlong)param_4,0,pIVar15,pIVar16); FUN_1400daf20(&local_b0); local_b0 = pbVar14; if (*(int *)(local_160 + 0x40) != 0) { local_b0 = *(byte **)(local_160 + 0x38); } local_a8._0_4_ = *(undefined4 *)(local_160 + 0x40); local_98[0] = 0; local_98[1] = 0; local_98[2] = 0; local_98[3] = 0; pIVar6 = (IMAGE_DOS_HEADER *)local_170; ppbVar11 = &local_b0; local_a0 = param_4; local_98._4_4_ = uVar1; puVar8 = FUN_1400db8b0((longlong *)ppbVar11,(undefined4 *)pIVar6,pIVar15,pIVar16); if (-1 < (int)puVar8) { iVar3._0_2_ = param_4->e_lfarlc; iVar3._2_2_ = param_4->e_ovno; while (iVar13 = (int)pbVar14, iVar13 != iVar3) { if ((iVar13 < 0) || (iVar3 <= iVar13)) { /* WARNING: Subroutine does not return */ FUN_14006be30(ppbVar11,pIVar6,pIVar15,pIVar16); } pIVar5 = (IMAGE_DOS_HEADER *)(*(longlong *)¶m_4->e_sp + (longlong)iVar13 * 0x48); FUN_1400bc600((int *)pIVar5,0,pIVar15,pIVar16); local_138 = Proud::AddrPort::vftable; local_130[0] = local_150[0]; local_130[1] = local_150[1]; local_130[2] = local_150[2]; local_130[3] = local_150[3]; local_12c = local_14c; pIVar6 = (IMAGE_DOS_HEADER *)&local_138; ppbVar11 = param_1; pIVar16 = param_3; FUN_1400c5bc0((longlong)param_1,(longlong)pIVar6,(uint *)pIVar5,(longlong)param_3); iVar3._0_2_ = param_4->e_lfarlc; iVar3._2_2_ = param_4->e_ovno; if (iVar3 <= iVar13) { /* WARNING: Subroutine does not return */ FUN_14006be30(ppbVar11,pIVar6,pIVar5,pIVar16); } pIVar15 = pIVar5; pbVar14 = (byte *)(ulonglong)(iVar13 + 1); } } } else { if ((int)uVar7 == 2) { piVar4 = (int *)(**(code **)(*(longlong *)param_1[0x29] + 0x58))(); local_d0 = piVar4; FUN_14006b350(piVar4); local_c8 = 1; if (DAT_1401b42cf != '\0') { (**(code **)(*(longlong *)param_1[0x29] + 200)) (param_1[0x29],L"Proud::CNetThreads_S::NetWorkerThread_UdpRecvCompletionCase"); } pIVar15 = local_168; if (local_168 == (IMAGE_DOS_HEADER *)0x0) { pIVar15 = (IMAGE_DOS_HEADER *)PTR_DAT_1401ac010; } local_110 = Proud::AddrPort::vftable; local_108 = *(word (*) [2])(param_2 + 0x30); local_104 = *(word *)(param_2 + 0x34); pIVar6 = (IMAGE_DOS_HEADER *)&local_110; FUN_14008e710((longlong *)param_1[0x29],(longlong)pIVar6,(short *)pIVar15); FUN_14006b3e0((longlong)piVar4); local_c8 = 0; } LAB_1400c9bfc: if (pIVar5 != (IMAGE_DOS_HEADER *)0x0) { FUN_1400d8970((longlong)pIVar5[1].e_program); } } pwVar12 = param_3[1].e_res2_10_; local_78 = pwVar12; FUN_14006b350((int *)pwVar12); local_70 = 1; param_3[2].e_program[0] = 0; FUN_1400d8bf0((longlong)param_3,pIVar6,(undefined **)pIVar15,pIVar16); FUN_14006b3e0((longlong)pwVar12); pIVar5 = local_168; if (((local_168 != (IMAGE_DOS_HEADER *)0x0) && (local_168 != (IMAGE_DOS_HEADER *)PTR_DAT_1401ac010)) && (pIVar2 = local_168 + -1, pIVar2->e_program + 0x38 != (byte *)0x0)) { piVar4 = (int *)FUN_14006cb70(pwVar12,pIVar6,pIVar15,pIVar16); local_88 = piVar4; FUN_14006b350(piVar4); local_80 = 1; pbVar14 = pIVar5[-1].e_program + 0x3c; *(int *)pbVar14 = *(int *)pbVar14 + -1; if (*(int *)pbVar14 == 0) { FUN_14006cc60(pIVar2->e_program + 0x38); } FUN_14006b3e0((longlong)piVar4); } local_168 = (IMAGE_DOS_HEADER *)PTR_DAT_1401ac010; if (local_160 != 0) { FUN_1400c28d0(local_160,pIVar6,(SIZE_T)pIVar15); } LAB_1400c9ced: FUN_1400d8990(&local_118); return; }