/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x1400c0610 FUN_1400c0610 * Pseudocode, not original source. */ ulonglong FUN_1400c0610(uint *param_1,int param_2,uint *param_3,uint *param_4) { undefined *puVar1; undefined *puVar2; char cVar3; uint uVar4; uint uVar5; uint uVar6; undefined8 uVar7; ulonglong uVar8; wchar_t *pwVar9; uint *puVar10; uint *puVar11; longlong *plVar12; int *piVar13; int *piVar14; undefined ***pppuVar15; uint *puVar16; wchar_t *pwVar17; uint uVar18; longlong lVar19; uint *puVar20; uint **ppuVar21; undefined **ppuVar22; uint uVar23; wchar_t local_res18 [4]; uint *local_res20; uint *local_b8; undefined *local_b0; uint *local_a8; undefined1 local_a0; wchar_t local_98 [4]; undefined **local_90; undefined8 local_88; undefined8 local_80; undefined8 local_78; undefined8 local_70; uint local_68; uint local_64; uint *local_60; undefined1 local_58; longlong local_50 [3]; local_50[1] = 0xfffffffffffffffe; uVar4 = (int)(*param_3 + ((int)*param_3 >> 0x1f & 7U)) >> 3; puVar11 = param_3; puVar20 = param_4; local_res20 = param_4; local_68 = uVar4; uVar7 = FUN_1400bd260(param_3,&local_64,param_3,param_4); if ((char)uVar7 != '\0') { pwVar9 = local_res18; puVar10 = param_3; uVar8 = FUN_1400bcfd0(param_3,(undefined8 *)pwVar9,puVar11,puVar20); if ((char)uVar8 != '\0') { FUN_14006cb70(puVar10,pwVar9,puVar11,puVar20); local_b0 = PTR_DAT_1401ac010; puVar11 = (uint *)(ulonglong)param_3[10]; pwVar9 = (wchar_t *)(**(code **)(*(longlong *)param_1 + 0xc0))(param_1,puVar11,&local_b0); if (((pwVar9 == (wchar_t *)0x0) || (puVar10 = (uint *)(ulonglong)local_64, local_64 == 0)) || (local_64 == 3)) { LAB_1400c0d95: piVar13 = (int *)(**(code **)(*(longlong *)param_1 + 0x58))(param_1); local_a8 = (uint *)piVar13; FUN_14006b350(piVar13); local_a0 = 1; if (DAT_1401b42cf != '\0') { (**(code **)(*(longlong *)param_1 + 200)) (param_1,L"Proud::CNetCoreImpl::ProcessMessage_Encrypted"); } FUN_1400141f0((longlong *)&local_b0,L" decrypt failed"); local_88 = 0; local_80 = 0; local_78 = 0; local_70 = 0; local_90 = Proud::ByteArray::vftable; ppuVar22 = &local_b0; plVar12 = FUN_140078c10((longlong *)local_res18,6,(ulonglong)param_3[10], (longlong *)ppuVar22,(longlong)&local_90); lVar19 = *(longlong *)param_1; (**(code **)(lVar19 + 0x80))(param_1,plVar12); FUN_140078360(&local_90); uVar8 = (ulonglong)uVar4; FUN_1400bc600((int *)param_3,uVar8,lVar19,ppuVar22); FUN_14006b3e0((longlong)piVar13); puVar2 = local_b0; if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) && (puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) { piVar14 = (int *)FUN_14006cb70(piVar13,uVar8,lVar19,ppuVar22); local_a8 = (uint *)piVar14; FUN_14006b350(piVar14); local_a0 = 1; piVar13 = (int *)(puVar2 + -4); *piVar13 = *piVar13 + -1; if (*piVar13 == 0) { FUN_14006cc60(puVar1); } local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14); } goto LAB_1400c0e9d; } if (local_64 == 1) { puVar20 = (uint *)(ulonglong)(uint)((int)(((int)*param_3 >> 0x1f & 7U) + *param_3) >> 3); puVar10 = param_3; puVar11 = param_4; uVar7 = FUN_1400cec90((longlong)param_3,(int *)param_4,(uint *)pwVar9,(ulonglong)puVar20); cVar3 = (char)uVar7; LAB_1400c070e: if (cVar3 == '\0') goto LAB_1400c0d95; } else if (local_64 == 2) { puVar20 = (uint *)(ulonglong)(uint)((int)(((int)*param_3 >> 0x1f & 7U) + *param_3) >> 3); pwVar9 = pwVar9 + 0x1e8; puVar10 = param_3; puVar11 = param_4; uVar7 = FUN_1400dd0f0((longlong)param_3,(int *)param_4,(SIZE_T)pwVar9,(ulonglong)puVar20); cVar3 = (char)uVar7; goto LAB_1400c070e; } if (param_2 != 0x24) { LAB_1400c0d45: puVar2 = local_b0; if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) && (puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) { piVar14 = (int *)FUN_14006cb70(puVar10,puVar11,pwVar9,puVar20); local_a8 = (uint *)piVar14; FUN_14006b350(piVar14); local_a0 = 1; piVar13 = (int *)(puVar2 + -4); *piVar13 = *piVar13 + -1; if (*piVar13 == 0) { FUN_14006cc60(puVar1); } local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14); } return CONCAT71((int7)((ulonglong)local_b0 >> 8),1); } lVar19 = 2; pwVar9 = local_98; uVar7 = FUN_1400bc930(param_4,(undefined8 *)pwVar9,2); if ((char)uVar7 != '\0') { pwVar9 = local_res18; pwVar17 = (wchar_t *)(ulonglong)param_3[10]; cVar3 = (**(code **)(*(longlong *)param_1 + 0xb0))(param_1); lVar19 = *(longlong *)param_1; if (cVar3 == '\0') { puVar10 = (uint *)(**(code **)(lVar19 + 0x58))(); puVar11 = puVar10; local_a8 = puVar10; FUN_14006b350((int *)puVar10); local_a0 = 1; if (DAT_1401b42cf != '\0') { pwVar9 = *(wchar_t **)param_1; pwVar17 = L"Proud::CNetCoreImpl::ProcessMessage_Encrypted"; puVar11 = param_1; (**(code **)(pwVar9 + 100))(); } FUN_14006cb70(puVar11,pwVar17,pwVar9,puVar20); local_b8 = (uint *)PTR_DAT_1401ac010; FUN_140053d20((longlong *)&local_b8,L"GetExpectedDecryptCount failed!!",pwVar9,puVar20); local_88 = 0; local_80 = 0; local_78 = 0; local_70 = 0; local_90 = Proud::ByteArray::vftable; ppuVar21 = &local_b8; plVar12 = FUN_140078c10(local_50,6,(ulonglong)param_3[10],(longlong *)ppuVar21, (longlong)&local_90); lVar19 = *(longlong *)param_1; (**(code **)(lVar19 + 0x80))(param_1,plVar12); FUN_140078360(&local_90); uVar8 = (ulonglong)uVar4; FUN_1400bc600((int *)param_4,uVar8,lVar19,ppuVar21); puVar11 = local_b8; if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) && (puVar20 = local_b8 + -2, puVar20 != (uint *)0x0)) { piVar13 = (int *)FUN_14006cb70(param_4,uVar8,lVar19,ppuVar21); local_60 = (uint *)piVar13; FUN_14006b350(piVar13); local_58 = 1; puVar11 = puVar11 + -1; *puVar11 = *puVar11 - 1; if (*puVar11 == 0) { FUN_14006cc60(puVar20); } FUN_14006b3e0((longlong)piVar13); } local_b8 = (uint *)PTR_DAT_1401ac010; FUN_14006b3e0((longlong)puVar10); puVar2 = local_b0; if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) && (puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) { piVar14 = (int *)FUN_14006cb70(puVar10,uVar8,lVar19,ppuVar21); local_a8 = (uint *)piVar14; FUN_14006b350(piVar14); local_a0 = 1; piVar13 = (int *)(puVar2 + -4); *piVar13 = *piVar13 + -1; if (*piVar13 == 0) { FUN_14006cc60(puVar1); } local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14); } } else { if (local_98[0] == local_res18[0]) { puVar11 = (uint *)(ulonglong)param_3[10]; (**(code **)(lVar19 + 0xb8))(); puVar10 = param_1; goto LAB_1400c0d45; } puVar10 = (uint *)(**(code **)(lVar19 + 0x58))(); puVar11 = puVar10; local_a8 = puVar10; FUN_14006b350((int *)puVar10); local_a0 = 1; if (DAT_1401b42cf != '\0') { pwVar9 = *(wchar_t **)param_1; pwVar17 = L"Proud::CNetCoreImpl::ProcessMessage_Encrypted"; puVar11 = param_1; (**(code **)(pwVar9 + 100))(); } FUN_14006cb70(puVar11,pwVar17,pwVar9,puVar20); local_b8 = (uint *)PTR_DAT_1401ac010; FUN_140053d20((longlong *)&local_b8,L"decryptCount1(%d) != decryptCount2(%d)", (ulonglong)(ushort)local_98[0],(ulonglong)(ushort)local_res18[0]); local_88 = 0; local_80 = 0; local_78 = 0; local_70 = 0; local_90 = Proud::ByteArray::vftable; ppuVar21 = &local_b8; plVar12 = FUN_140078c10(local_50,6,(ulonglong)param_3[10],(longlong *)ppuVar21, (longlong)&local_90); lVar19 = *(longlong *)param_1; (**(code **)(lVar19 + 0x80))(param_1,plVar12); FUN_140078360(&local_90); uVar8 = (ulonglong)uVar4; FUN_1400bc600((int *)param_4,uVar8,lVar19,ppuVar21); puVar11 = local_b8; if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) && (puVar20 = local_b8 + -2, puVar20 != (uint *)0x0)) { piVar13 = (int *)FUN_14006cb70(param_4,uVar8,lVar19,ppuVar21); local_60 = (uint *)piVar13; FUN_14006b350(piVar13); local_58 = 1; puVar11 = puVar11 + -1; *puVar11 = *puVar11 - 1; if (*puVar11 == 0) { FUN_14006cc60(puVar20); } FUN_14006b3e0((longlong)piVar13); } local_b8 = (uint *)PTR_DAT_1401ac010; FUN_14006b3e0((longlong)puVar10); puVar2 = local_b0; if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) && (puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) { piVar14 = (int *)FUN_14006cb70(puVar10,uVar8,lVar19,ppuVar21); local_a8 = (uint *)piVar14; FUN_14006b350(piVar14); local_a0 = 1; piVar13 = (int *)(puVar2 + -4); *piVar13 = *piVar13 + -1; if (*piVar13 == 0) { FUN_14006cc60(puVar1); } local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14); } } goto LAB_1400c0e9d; } puVar10 = (uint *)(**(code **)(*(longlong *)param_1 + 0x58))(); puVar11 = puVar10; local_60 = puVar10; FUN_14006b350((int *)puVar10); local_58 = 1; if (DAT_1401b42cf != '\0') { lVar19 = *(longlong *)param_1; pwVar9 = L"Proud::CNetCoreImpl::ProcessMessage_Encrypted"; puVar11 = param_1; (**(code **)(lVar19 + 200))(); } FUN_14006cb70(puVar11,pwVar9,lVar19,puVar20); local_b8 = (uint *)PTR_DAT_1401ac010; uVar4 = FUN_14006c9f0(L"decryptCount1 read failed!!"); uVar18 = 0; uVar6 = 0; uVar8 = 0; if ((local_b8 != (uint *)0x0) && (uVar8 = 0, local_b8 != (uint *)PTR_DAT_1401ac010)) { uVar8 = (ulonglong)local_b8[-2]; } uVar5 = uVar4; if ((((int)uVar4 <= (int)uVar8) && (uVar5 = uVar6, local_b8 != (uint *)0x0)) && (local_b8 != (uint *)PTR_DAT_1401ac010)) { uVar5 = local_b8[-2]; } uVar23 = 1; if (1 < (int)uVar5) { uVar23 = uVar5; } uVar5 = uVar6; if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) { uVar5 = local_b8[-2]; } if ((int)uVar5 < (int)uVar23) { if (local_b8 == (uint *)0x0) { local_b8 = (uint *)PTR_DAT_1401ac010; } if ((int)uVar23 < 0) { /* WARNING: Subroutine does not return */ FUN_14006be00(); } if (uVar23 == 0) { FUN_1400031e0((longlong *)&local_b8,PTR_DAT_1401ac010,uVar8,puVar20); } else { uVar5 = uVar6; if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) { uVar5 = local_b8[-2]; } if (uVar23 != uVar5) { puVar11 = (uint *)FUN_14006cbf0((longlong)(int)uVar23 * 2 + 10); if (puVar11 != (uint *)0x0) { *puVar11 = 0; puVar11[1] = 1; } *puVar11 = uVar23; uVar5 = uVar6; if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) { uVar5 = local_b8[-2]; } puVar16 = (uint *)PTR_DAT_1401ac010; if ((int)uVar23 < (int)uVar5) { LAB_1400c0875: if (local_b8 != (uint *)0x0) { puVar16 = local_b8; } } else { uVar23 = uVar6; if (local_b8 != (uint *)0x0) { if (local_b8 != (uint *)PTR_DAT_1401ac010) { uVar23 = local_b8[-2]; } goto LAB_1400c0875; } } uVar8 = (ulonglong)uVar23; FUN_14006ca20(puVar11 + 2,puVar16,uVar23); FUN_1400031e0((longlong *)&local_b8,puVar16,uVar8,puVar20); local_b8 = puVar11 + 2; } } } FUN_140002e40((longlong *)&local_b8); puVar11 = local_b8; if (local_b8 == (uint *)0x0) { puVar11 = (uint *)PTR_DAT_1401ac010; } FUN_14006ca20(puVar11,L"decryptCount1 read failed!!",uVar4); puVar11 = local_b8; if (local_b8 == (uint *)0x0) { puVar11 = (uint *)PTR_DAT_1401ac010; } uVar6 = FUN_14006c9f0((short *)puVar11); uVar4 = uVar18; if (0 < (int)uVar6) { uVar4 = uVar6; } uVar6 = uVar18; if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) { uVar6 = local_b8[-2]; } if (((int)uVar4 < (int)uVar6) || (uVar4 = uVar18, local_b8 == (uint *)0x0)) { LAB_1400c0908: if (((local_b8 != (uint *)PTR_DAT_1401ac010) && (local_b8 != (uint *)0x0)) && (local_b8 + -2 != (uint *)0x0)) { local_b8[-2] = uVar4; *(undefined2 *)((longlong)local_b8 + (longlong)(int)uVar4 * 2) = 0; } } else if (local_b8 != (uint *)PTR_DAT_1401ac010) { uVar4 = local_b8[-2]; goto LAB_1400c0908; } local_88 = 0; local_80 = 0; local_78 = 0; local_70 = 0; local_90 = Proud::ByteArray::vftable; ppuVar21 = &local_b8; plVar12 = FUN_140078c10(local_50,6,(ulonglong)param_3[10],(longlong *)ppuVar21, (longlong)&local_90); lVar19 = *(longlong *)param_1; (**(code **)(lVar19 + 0x80))(param_1); pppuVar15 = &local_90; FUN_140078360(pppuVar15); puVar11 = local_b8; if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1401ac010)) && (puVar20 = local_b8 + -2, puVar20 != (uint *)0x0)) { piVar13 = (int *)FUN_14006cb70(pppuVar15,plVar12,lVar19,ppuVar21); local_a8 = (uint *)piVar13; FUN_14006b350(piVar13); local_a0 = 1; puVar11 = puVar11 + -1; *puVar11 = *puVar11 - 1; if (*puVar11 == 0) { FUN_14006cc60(puVar20); } FUN_14006b3e0((longlong)piVar13); } uVar8 = (ulonglong)local_68; FUN_1400bc600((int *)local_res20,uVar8,lVar19,ppuVar21); FUN_14006b3e0((longlong)puVar10); puVar2 = local_b0; if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1401ac010)) && (puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) { piVar14 = (int *)FUN_14006cb70(puVar10,uVar8,lVar19,ppuVar21); local_a8 = (uint *)piVar14; FUN_14006b350(piVar14); local_a0 = 1; piVar13 = (int *)(puVar2 + -4); *piVar13 = *piVar13 + -1; if (*piVar13 == 0) { FUN_14006cc60(puVar1); } local_b0 = (undefined *)FUN_14006b3e0((longlong)piVar14); } goto LAB_1400c0e9d; } } local_b0 = (undefined *)FUN_1400bc600((int *)param_3,(ulonglong)uVar4,puVar11,puVar20); LAB_1400c0e9d: return (ulonglong)local_b0 & 0xffffffffffffff00; }