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

271 lines
7.8 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x14020bc80 FUN_14020bc80
* Pseudocode, not original source. */
/* WARNING: Function: __chkstk replaced with injection: alloca_probe */
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
ulonglong FUN_14020bc80(undefined8 param_1,int *param_2,int *param_3,undefined8 param_4,int param_5)
{
int *piVar1;
int iVar2;
uint uVar3;
ulonglong uVar4;
int *piVar5;
int iVar6;
int iVar7;
ulonglong uVar8;
int iVar9;
undefined1 *puVar10;
uint uVar11;
code *pcVar12;
undefined1 auStack_18c8 [32];
undefined4 local_18a8;
uint local_18a4;
int local_18a0;
int *local_1898;
int local_1890;
undefined1 local_1888 [24];
uint local_1870;
int *local_1868;
undefined8 local_1860;
undefined1 auStack_1858 [24];
undefined1 local_1840 [6120];
ulonglong local_58;
local_58 = DAT_1403463c0 ^ (ulonglong)auStack_18c8;
local_1898 = param_3;
local_1868 = param_2;
local_1860 = param_4;
iVar2 = FUN_1402010a0(param_2);
if (iVar2 < 8) {
iVar2 = 2;
}
else if (iVar2 < 0x25) {
iVar2 = 3;
}
else if (iVar2 < 0x8d) {
iVar2 = 4;
}
else if (iVar2 < 0x1c3) {
iVar2 = 5;
}
else if (iVar2 < 0x518) {
iVar2 = 6;
}
else {
iVar2 = (0xdc9 < iVar2) + 7;
}
uVar4 = FUN_140200df0(local_1840);
if ((int)uVar4 != 0) {
return uVar4;
}
iVar7 = iVar2 + -1;
uVar11 = 1 << (sbyte)iVar2;
iVar6 = 1 << ((byte)iVar7 & 0x1f);
local_18a0 = iVar6;
local_18a4 = uVar11;
for (iVar9 = iVar6; iVar9 < (int)uVar11; iVar9 = iVar9 + 1) {
uVar3 = FUN_140200df0(auStack_1858 + (longlong)iVar9 * 0x18);
if (uVar3 != 0) {
if (iVar6 < iVar9) {
uVar4 = (ulonglong)(uint)(iVar9 - local_18a0);
puVar10 = auStack_1858 + (longlong)iVar6 * 0x18;
do {
FUN_140200e50(puVar10);
puVar10 = puVar10 + 0x18;
uVar4 = uVar4 - 1;
} while (uVar4 != 0);
}
FUN_140200e50(local_1840);
return (ulonglong)uVar3;
}
param_3 = local_1898;
}
if (param_5 == 0) {
uVar3 = FUN_140202460();
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1cd;
if ((*param_3 * 2 + 1 < 0x200) && (*param_3 < 0x100)) {
pcVar12 = FUN_14020ba30;
}
else {
pcVar12 = FUN_140202590;
}
}
else if (param_5 == 1) {
FUN_14020f0c0();
pcVar12 = FUN_14020efb0;
}
else {
uVar3 = FUN_14020ef10(param_3,&local_18a8);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1cd;
pcVar12 = FUN_14020ee20;
}
uVar3 = FUN_140200df0(local_1888);
uVar4 = (ulonglong)uVar3;
uVar11 = local_18a4;
if (uVar3 != 0) goto LAB_14020c1cd;
if (param_5 == 0) {
uVar11 = FUN_1402024c0(local_1888,param_3);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
uVar11 = FUN_140202340(param_1,local_1888,param_3);
}
else {
FUN_14020b9f0(local_1888,1);
uVar11 = FUN_14020b170(param_1,param_3,local_1840);
}
uVar4 = (ulonglong)uVar11;
if (uVar11 == 0) {
puVar10 = auStack_1858 + (longlong)local_18a0 * 0x18;
uVar11 = FUN_140200ef0(local_1840,puVar10);
piVar1 = local_1898;
uVar4 = (ulonglong)uVar11;
if (uVar11 == 0) {
iVar9 = 0;
if (0 < iVar7) {
do {
uVar11 = FUN_140201a20(puVar10,puVar10);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
uVar11 = (*pcVar12)(puVar10,piVar1,local_18a8);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
iVar9 = iVar9 + 1;
} while (iVar9 < iVar7);
}
iVar9 = local_18a0 + 1;
iVar7 = local_18a0;
if (iVar9 < (int)local_18a4) {
do {
uVar11 = FUN_1402018b0(auStack_1858 + (longlong)iVar7 * 0x18,local_1840,
auStack_1858 + (longlong)iVar9 * 0x18);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
uVar11 = (*pcVar12)(auStack_1858 + (longlong)iVar9 * 0x18,piVar1,local_18a8);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
iVar9 = iVar9 + 1;
iVar7 = iVar7 + 1;
} while (iVar9 < (int)local_18a4);
}
iVar9 = 0;
uVar4 = 0;
iVar7 = 0;
local_1890 = 1;
uVar11 = 0;
local_1898 = (int *)(longlong)(*local_1868 + -1);
piVar5 = local_1898;
LAB_14020bfa6:
while( true ) {
local_1890 = local_1890 + -1;
uVar8 = uVar4;
if (local_1890 == 0) {
if (piVar5 == (int *)0xffffffffffffffff) {
if (((iVar9 != 2) || (iVar7 < 1)) || (iVar2 = 0, iVar7 < 1)) goto LAB_14020c18e;
goto LAB_14020c120;
}
piVar5 = (int *)((longlong)piVar5 + -1);
uVar8 = (ulonglong)*(uint *)(*(longlong *)(local_1868 + 4) + 4 + (longlong)piVar5 * 4);
local_1890 = 0x1c;
local_1898 = piVar5;
}
local_1870 = (int)uVar8 * 2;
uVar4 = (ulonglong)local_1870;
uVar8 = uVar8 >> 0x1b;
if (iVar9 == 0) goto code_r0x00014020bfef;
if ((iVar9 != 1) || ((uVar8 & 1) != 0)) goto LAB_14020bff3;
uVar3 = FUN_140201a20(local_1888,local_1888);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) break;
uVar3 = (*pcVar12)(local_1888,piVar1,local_18a8);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) break;
uVar4 = (ulonglong)local_1870;
piVar5 = local_1898;
}
}
}
goto LAB_14020c1be;
code_r0x00014020bfef:
if ((uVar8 & 1) != 0) {
LAB_14020bff3:
iVar7 = iVar7 + 1;
iVar9 = 2;
uVar11 = uVar11 | ((uint)uVar8 & 1) << ((sbyte)iVar2 - (char)iVar7 & 0x1fU);
piVar5 = local_1898;
if (iVar7 == iVar2) {
iVar7 = 0;
if (iVar2 != 0) {
do {
uVar3 = FUN_140201a20(local_1888,local_1888);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1be;
uVar3 = (*pcVar12)(local_1888,piVar1,local_18a8);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1be;
iVar7 = iVar7 + 1;
} while (iVar7 < iVar2);
}
uVar11 = FUN_1402018b0(local_1888,auStack_1858 + (longlong)(int)uVar11 * 0x18,local_1888);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
uVar11 = (*pcVar12)(local_1888,piVar1,local_18a8);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
uVar4 = (ulonglong)local_1870;
iVar7 = 0;
iVar9 = 1;
uVar11 = 0;
piVar5 = local_1898;
}
}
goto LAB_14020bfa6;
while( true ) {
uVar3 = (*pcVar12)(local_1888,piVar1,local_18a8);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1be;
uVar11 = uVar11 * 2;
if ((local_18a4 & uVar11) != 0) {
uVar3 = FUN_1402018b0(local_1888,local_1840,local_1888);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1be;
uVar3 = (*pcVar12)(local_1888,piVar1,local_18a8);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1be;
}
iVar2 = iVar2 + 1;
if (iVar7 <= iVar2) break;
LAB_14020c120:
uVar3 = FUN_140201a20(local_1888,local_1888);
uVar4 = (ulonglong)uVar3;
if (uVar3 != 0) goto LAB_14020c1be;
}
LAB_14020c18e:
if (param_5 == 0) {
uVar11 = (*pcVar12)(local_1888,piVar1,local_18a8);
uVar4 = (ulonglong)uVar11;
if (uVar11 != 0) goto LAB_14020c1be;
}
FUN_14020ae90(local_1888,local_1860);
uVar4 = 0;
LAB_14020c1be:
FUN_140200e50(local_1888);
uVar11 = local_18a4;
LAB_14020c1cd:
FUN_140200e50(local_1840);
if (local_18a0 < (int)uVar11) {
puVar10 = auStack_1858 + (longlong)local_18a0 * 0x18;
uVar8 = (ulonglong)(uVar11 - local_18a0);
do {
FUN_140200e50(puVar10);
puVar10 = puVar10 + 0x18;
uVar8 = uVar8 - 1;
} while (uVar8 != 0);
}
return uVar4;
}