server-re/decomp/MessageServer_Release_x64/full/functions/0x1400c0610.c

442 lines
16 KiB
C

/* 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;
}