server-re/decomp/DBCServer_Release_x64/full/functions/0x1401a9020.c

146 lines
5.2 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x1401a9020 FUN_1401a9020
* Pseudocode, not original source. */
undefined8 FUN_1401a9020(longlong param_1,undefined8 param_2,longlong param_3)
{
int *piVar1;
uint uVar2;
longlong lVar3;
ulonglong uVar4;
char cVar5;
undefined8 uVar6;
undefined *puVar7;
longlong *plVar8;
undefined8 *puVar9;
undefined **ppuVar10;
longlong lVar11;
undefined *puVar12;
undefined *local_res8;
undefined *local_res20;
undefined **local_60;
undefined4 local_58;
undefined2 local_54;
undefined8 local_50;
undefined1 local_48;
uVar6 = (**(code **)(**(longlong **)(param_1 + 0x148) + 0x58))();
local_50 = uVar6;
FUN_14016db50(uVar6);
local_48 = 1;
if (DAT_14034c86f != '\0') {
(**(code **)(**(longlong **)(param_1 + 0x148) + 200))();
}
FUN_1401a1eb0(*(longlong *)(param_1 + 0x148) + 0x760);
local_res8 = (undefined *)FUN_14016d940(0x780);
puVar12 = (undefined *)0x0;
puVar7 = puVar12;
if (local_res8 != (undefined *)0x0) {
local_60 = Proud::AddrPort::vftable;
local_58 = *(undefined4 *)(param_3 + 8);
local_54 = *(undefined2 *)(param_3 + 0xc);
puVar7 = (undefined *)
FUN_1401b4c70(local_res8,*(undefined8 *)(param_1 + 0x148),param_2,&local_60);
}
lVar3 = *(longlong *)(param_1 + 0x148);
lVar11 = lVar3 + 0x1740;
uVar2 = *(uint *)(lVar3 + 0x1768);
uVar4 = ((ulonglong)puVar7 & 0xffffffff) % (ulonglong)uVar2;
lVar3 = *(longlong *)(lVar3 + 0x1748);
local_res8 = puVar7;
if (lVar3 != 0) {
for (plVar8 = *(longlong **)(lVar3 + uVar4 * 8);
(plVar8 != (longlong *)0x0 && ((uint)uVar4 == *(uint *)(plVar8 + 4) % uVar2));
plVar8 = (longlong *)plVar8[2]) {
if ((undefined *)*plVar8 == puVar7) goto LAB_1401a91c9;
}
if (lVar3 != 0) {
for (plVar8 = *(longlong **)(lVar3 + uVar4 * 8);
(plVar8 != (longlong *)0x0 && ((uint)uVar4 == *(uint *)(plVar8 + 4) % uVar2));
plVar8 = (longlong *)plVar8[2]) {
if ((undefined *)*plVar8 == puVar7) goto LAB_1401a91c5;
}
if (lVar3 != 0) goto LAB_1401a919c;
}
}
cVar5 = FUN_1401b5a10(lVar11,(ulonglong)uVar2,CONCAT71((int7)((ulonglong)lVar3 >> 8),1));
if (cVar5 == '\0') {
/* WARNING: Subroutine does not return */
FUN_14004dc60(0x8007000e);
}
LAB_1401a919c:
FUN_1401720a0(lVar11);
plVar8 = (longlong *)FUN_140175d30(lVar11,&local_res8,uVar4,(ulonglong)puVar7 & 0xffffffff);
FUN_1401720a0(lVar11);
LAB_1401a91c5:
*(undefined1 *)(plVar8 + 1) = 0;
LAB_1401a91c9:
if (puVar7 != (undefined *)0x0) {
puVar12 = puVar7 + 0x38;
}
FUN_14019bd30(*(undefined8 *)(*(longlong *)(puVar7 + 0x748) + 0x110),puVar12);
FUN_1401baa10(puVar7 + 0xc0);
FUN_1401a2e00(*(undefined8 *)(*(longlong *)(param_1 + 0x148) + 0x788),
*(undefined8 *)(*(longlong *)(puVar7 + 0x748) + 0x110),0xffffffffffffffff);
lVar3 = *(longlong *)(param_1 + 0x148);
uVar4 = (ulonglong)((uint)*(ushort *)(param_3 + 0xc) ^ *(uint *)(param_3 + 8)) %
(ulonglong)*(uint *)(lVar3 + 0x1710);
if (*(longlong *)(lVar3 + 0x16f0) != 0) {
for (lVar11 = *(longlong *)(*(longlong *)(lVar3 + 0x16f0) + uVar4 * 8);
(lVar11 != 0 && ((uint)uVar4 == *(uint *)(lVar11 + 0x28) % *(uint *)(lVar3 + 0x1710)));
lVar11 = *(longlong *)(lVar11 + 0x18)) {
if ((*(uint *)(lVar11 + 8) == *(uint *)(param_3 + 8)) &&
(*(ushort *)(lVar11 + 0xc) == *(ushort *)(param_3 + 0xc))) goto LAB_1401a9288;
}
}
puVar9 = (undefined8 *)FUN_1401b7d10(lVar3 + 0x16e8,param_3);
*puVar9 = puVar7;
LAB_1401a9288:
if (*(longlong *)(*(longlong *)(param_1 + 0x148) + 0x17f0) != 0) {
FUN_14016d8c0();
local_res8 = PTR_DAT_1403440a0;
plVar8 = (longlong *)FUN_1401705d0(param_3,&local_res20);
puVar12 = (undefined *)*plVar8;
if ((undefined *)*plVar8 == (undefined *)0x0) {
puVar12 = PTR_DAT_1403440a0;
}
FUN_14004c020(&local_res8,L"new TCP socket is accepted. RemoteClient_S=%p,TCP socket=%s",puVar7,
puVar12);
if (((local_res20 != (undefined *)0x0) && (local_res20 != PTR_DAT_1403440a0)) &&
(local_res20 + -8 != (undefined *)0x0)) {
ppuVar10 = (undefined **)FUN_14016d8c0();
local_60 = ppuVar10;
FUN_14016db50(ppuVar10);
local_58 = CONCAT31(local_58._1_3_,1);
piVar1 = (int *)(local_res20 + -4);
*piVar1 = *piVar1 + -1;
if (*piVar1 == 0) {
FUN_14016d970(local_res20 + -8);
}
FUN_14016dbe0(ppuVar10);
}
puVar12 = local_res8;
puVar7 = local_res8;
if (local_res8 == (undefined *)0x0) {
puVar7 = PTR_DAT_1403440a0;
}
FUN_1401adb30(*(undefined8 *)(*(longlong *)(param_1 + 0x148) + 0x17f0),0,puVar7);
if (((puVar12 != (undefined *)0x0) && (puVar12 != PTR_DAT_1403440a0)) &&
(puVar12 + -8 != (undefined *)0x0)) {
ppuVar10 = (undefined **)FUN_14016d8c0();
local_60 = ppuVar10;
FUN_14016db50(ppuVar10);
local_58 = CONCAT31(local_58._1_3_,1);
piVar1 = (int *)(puVar12 + -4);
*piVar1 = *piVar1 + -1;
if (*piVar1 == 0) {
FUN_14016d970(puVar12 + -8);
}
FUN_14016dbe0(ppuVar10);
}
}
FUN_14016dbe0(uVar6);
return 1;
}