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

252 lines
8.1 KiB
C

/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
* Ghidra 12.1.2 decompiler output for 0x1400c6f50 FUN_1400c6f50
* Pseudocode, not original source. */
longlong *
FUN_1400c6f50(longlong param_1,undefined8 param_2,undefined **param_3,undefined **param_4)
{
undefined *puVar1;
undefined8 *puVar2;
undefined *puVar3;
uint uVar4;
uint uVar5;
uint uVar6;
longlong *plVar7;
longlong *plVar8;
int *piVar9;
uint *puVar10;
int *piVar11;
char *pcVar12;
char *pcVar13;
undefined ***pppuVar14;
uint *puVar15;
uint uVar16;
char *pcVar17;
ulonglong uVar18;
longlong lVar19;
uint **ppuVar20;
uint uVar21;
uint *local_res8;
undefined *local_res10;
longlong local_res18;
longlong local_res20;
undefined **local_b8;
undefined8 local_b0;
undefined8 local_a8;
undefined8 local_a0;
undefined8 local_98;
undefined **local_90;
undefined8 local_88;
undefined8 local_80;
undefined8 local_78;
undefined8 local_70;
int *local_68;
undefined1 local_60;
int *local_58;
undefined1 local_50;
undefined8 local_48;
local_48 = 0xfffffffffffffffe;
pcVar17 = (char *)0x0;
uVar21 = 0;
do {
lVar19 = *(longlong *)(param_1 + 0x148);
pcVar13 = (char *)(lVar19 + 0x60);
if (lVar19 == 0) {
pcVar13 = pcVar17;
}
pcVar12 = pcVar17;
if (*(longlong *)(lVar19 + 0x750) != 0) {
pcVar12 = *(char **)(*(longlong *)(lVar19 + 0x750) + 0x38);
}
plVar7 = FUN_1400ccb80(pcVar12,pcVar13,param_3,(longlong)param_4);
if (plVar7 == (longlong *)0x0) {
FUN_14006cb70(pcVar12,pcVar13,param_3,param_4);
local_res8 = (uint *)PTR_DAT_1401ac010;
uVar4 = FUN_14006c9f0(L"FATAL: Cannot create TCP socket for AcceptEx!");
uVar6 = 0;
if ((local_res8 != (uint *)0x0) &&
(pcVar17 = (char *)0x0, local_res8 != (uint *)PTR_DAT_1401ac010)) {
pcVar17 = (char *)(ulonglong)local_res8[-2];
}
uVar5 = uVar4;
if ((((int)uVar4 <= (int)pcVar17) && (uVar5 = uVar6, local_res8 != (uint *)0x0)) &&
(local_res8 != (uint *)PTR_DAT_1401ac010)) {
uVar5 = local_res8[-2];
}
uVar16 = 1;
if (1 < (int)uVar5) {
uVar16 = uVar5;
}
uVar5 = uVar6;
if ((local_res8 != (uint *)0x0) && (local_res8 != (uint *)PTR_DAT_1401ac010)) {
uVar5 = local_res8[-2];
}
if ((int)uVar5 < (int)uVar16) {
if (local_res8 == (uint *)0x0) {
local_res8 = (uint *)PTR_DAT_1401ac010;
}
if ((int)uVar16 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if (uVar16 == 0) {
FUN_1400031e0((longlong *)&local_res8,PTR_DAT_1401ac010,pcVar17,param_4);
}
else {
uVar5 = uVar6;
if ((local_res8 != (uint *)0x0) && (local_res8 != (uint *)PTR_DAT_1401ac010)) {
uVar5 = local_res8[-2];
}
if (uVar16 != uVar5) {
puVar10 = (uint *)FUN_14006cbf0((longlong)(int)uVar16 * 2 + 10);
if (puVar10 != (uint *)0x0) {
*puVar10 = 0;
puVar10[1] = 1;
}
*puVar10 = uVar16;
uVar5 = uVar6;
if ((local_res8 != (uint *)0x0) && (local_res8 != (uint *)PTR_DAT_1401ac010)) {
uVar5 = local_res8[-2];
}
puVar15 = (uint *)PTR_DAT_1401ac010;
if ((int)uVar16 < (int)uVar5) {
LAB_1400c71f7:
if (local_res8 != (uint *)0x0) {
puVar15 = local_res8;
}
}
else {
uVar16 = uVar6;
if (local_res8 != (uint *)0x0) {
if (local_res8 != (uint *)PTR_DAT_1401ac010) {
uVar16 = local_res8[-2];
}
goto LAB_1400c71f7;
}
}
uVar18 = (ulonglong)uVar16;
FUN_14006ca20(puVar10 + 2,puVar15,uVar16);
FUN_1400031e0((longlong *)&local_res8,puVar15,uVar18,param_4);
local_res8 = puVar10 + 2;
}
}
}
FUN_140002e40((longlong *)&local_res8);
puVar10 = local_res8;
if (local_res8 == (uint *)0x0) {
puVar10 = (uint *)PTR_DAT_1401ac010;
}
FUN_14006ca20(puVar10,L"FATAL: Cannot create TCP socket for AcceptEx!",uVar4);
puVar10 = local_res8;
if (local_res8 == (uint *)0x0) {
puVar10 = (uint *)PTR_DAT_1401ac010;
}
uVar6 = FUN_14006c9f0((short *)puVar10);
uVar4 = uVar21;
if (0 < (int)uVar6) {
uVar4 = uVar6;
}
uVar6 = uVar21;
if ((local_res8 != (uint *)0x0) && (local_res8 != (uint *)PTR_DAT_1401ac010)) {
uVar6 = local_res8[-2];
}
if (((int)uVar6 <= (int)uVar4) && (uVar4 = uVar21, local_res8 != (uint *)0x0)) {
if (local_res8 == (uint *)PTR_DAT_1401ac010) goto LAB_1400c72ab;
uVar4 = local_res8[-2];
}
if (((local_res8 != (uint *)PTR_DAT_1401ac010) && (local_res8 != (uint *)0x0)) &&
(local_res8 + -2 != (uint *)0x0)) {
local_res8[-2] = uVar4;
*(undefined2 *)((longlong)local_res8 + (longlong)(int)uVar4 * 2) = 0;
}
LAB_1400c72ab:
local_b0 = 0;
local_a8 = 0;
local_a0 = 0;
local_98 = 0;
local_b8 = Proud::ByteArray::vftable;
ppuVar20 = &local_res8;
plVar7 = FUN_140078c10(&local_res20,1,1,(longlong *)ppuVar20,(longlong)&local_b8);
lVar19 = **(longlong **)(param_1 + 0x148);
(**(code **)(lVar19 + 0x80))();
pppuVar14 = &local_b8;
FUN_140078360(pppuVar14);
puVar10 = local_res8;
if (local_res8 == (uint *)0x0) {
return (longlong *)0x0;
}
if (local_res8 == (uint *)PTR_DAT_1401ac010) {
return (longlong *)0x0;
}
puVar15 = local_res8 + -2;
if (puVar15 == (uint *)0x0) {
return (longlong *)0x0;
}
piVar11 = (int *)FUN_14006cb70(pppuVar14,plVar7,lVar19,ppuVar20);
local_68 = piVar11;
FUN_14006b350(piVar11);
local_60 = 1;
puVar10 = puVar10 + -1;
*puVar10 = *puVar10 - 1;
if (*puVar10 == 0) {
FUN_14006cc60(puVar15);
}
FUN_14006b3e0((longlong)piVar11);
return (longlong *)0x0;
}
puVar2 = *(undefined8 **)(*(longlong *)(param_1 + 0x148) + 0x748);
pcVar13 = pcVar17;
if (puVar2 != (undefined8 *)0x0) {
pcVar13 = (char *)*puVar2;
}
plVar8 = plVar7;
uVar4 = FUN_1400735d0((longlong)pcVar13,(longlong)plVar7,param_3,param_4);
if (uVar4 == 0) {
return plVar7;
}
if (uVar4 != 0x2746) {
if (uVar4 != 0x2736) {
FUN_14006cb70(pcVar13,plVar8,param_3,param_4);
local_res10 = PTR_DAT_1401ac010;
FUN_140053d20((longlong *)&local_res10,
L"FATAL: AcceptEx failed with error code %d! No more accept will be possible."
,(ulonglong)uVar4,param_4);
local_88 = 0;
local_80 = 0;
local_78 = 0;
local_70 = 0;
local_90 = Proud::ByteArray::vftable;
param_4 = &local_res10;
plVar8 = FUN_140078c10(&local_res18,1,1,(longlong *)param_4,(longlong)&local_90);
param_3 = (undefined **)**(longlong **)(param_1 + 0x148);
(*(code *)param_3[0x10])();
pppuVar14 = &local_90;
FUN_140078360(pppuVar14);
puVar3 = local_res10;
if (((local_res10 != (undefined *)0x0) && (local_res10 != PTR_DAT_1401ac010)) &&
(puVar1 = local_res10 + -8, puVar1 != (undefined *)0x0)) {
piVar9 = (int *)FUN_14006cb70(pppuVar14,plVar8,param_3,param_4);
local_58 = piVar9;
FUN_14006b350(piVar9);
local_50 = 1;
piVar11 = (int *)(puVar3 + -4);
*piVar11 = *piVar11 + -1;
if (*piVar11 == 0) {
FUN_14006cc60(puVar1);
}
FUN_14006b3e0((longlong)piVar9);
}
}
LAB_1400c70e3:
FUN_140072370(plVar7,plVar8,(longlong *)param_3,param_4);
FUN_14006cc60(plVar7);
return (longlong *)0x0;
}
if (*(char *)(param_1 + 0x140) != '\0') goto LAB_1400c70e3;
FUN_140072370(plVar7,plVar8,(longlong *)param_3,param_4);
FUN_14006cc60(plVar7);
} while( true );
}