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

367 lines
10 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x1401ef420 FUN_1401ef420
* Pseudocode, not original source. */
void FUN_1401ef420(longlong param_1,undefined8 param_2,longlong param_3)
{
longlong *plVar1;
longlong lVar2;
undefined8 *puVar3;
char cVar4;
uint uVar5;
uint uVar6;
uint uVar7;
uint *puVar8;
undefined8 uVar9;
void *pvVar10;
uint *puVar11;
int iVar12;
void *pvVar13;
uint uVar14;
void *_Dst;
uint uVar15;
longlong *local_res18;
undefined4 local_res20 [2];
uint *local_128;
longlong *local_120;
undefined4 local_118;
undefined4 local_114;
longlong local_110;
void *local_108;
undefined8 local_100;
longlong local_f8;
undefined8 local_f0;
undefined4 local_e4;
undefined4 local_e0 [2];
undefined1 local_d8 [8];
longlong local_d0;
void *local_c8;
int local_c0;
int local_bc;
undefined **local_b0;
undefined8 local_a8;
longlong local_a0;
undefined8 local_98;
undefined4 local_90;
undefined4 local_8c;
ulonglong local_88;
undefined **local_80;
undefined8 local_78;
undefined8 local_70;
undefined8 local_68;
undefined8 local_60;
undefined8 local_58;
undefined1 local_50;
undefined1 local_48 [8];
longlong *local_40;
undefined8 local_38;
local_38 = 0xfffffffffffffffe;
if (*(int *)(param_3 + 0x28) != 1) {
return;
}
(**(code **)(*(longlong *)(*(longlong *)(param_1 + 0x108) + 0x78) + 0x10))();
cVar4 = FUN_14016be00(param_3,local_res20);
if (cVar4 == '\0') {
return;
}
cVar4 = FUN_14016b370(param_3,local_e0,4);
if (cVar4 == '\0') {
return;
}
cVar4 = FUN_14016ba10(param_3,&local_88);
if (cVar4 == '\0') {
return;
}
if ((int)local_88 < 0) {
return;
}
if (DAT_140344d70 <= (int)local_88) {
return;
}
FUN_14016b440(local_d8);
cVar4 = FUN_14016b6a0(param_3,local_d8,local_88 & 0xffffffff);
if (cVar4 == '\0') {
local_res18 = &local_d0;
FUN_14016d0e0(&local_d0);
if (local_c8 == (void *)0x0) {
return;
}
if (-1 < local_bc) {
return;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
FUN_1401d2620(*(undefined8 *)(param_1 + 0x108),&local_120,local_res20[0]);
if ((((local_120 == (longlong *)0x0) || (lVar2 = *local_120, lVar2 == 0)) ||
(*(char *)(lVar2 + 0x684) != '\0')) || (*(char *)(lVar2 + 0x650) != '\0')) goto LAB_1401efa29;
local_f0 = (**(code **)(*(longlong *)(*(longlong *)(param_1 + 0x108) + 0x88) + 0x18))();
pvVar13 = (void *)0x0;
local_100 = 0;
local_108 = (void *)0x0;
local_110 = 0;
local_f8 = 0;
uVar15 = 0;
local_e4 = 0;
local_118 = 1;
local_114 = local_e0[0];
local_110 = FUN_14016d120();
*(undefined8 *)(local_110 + 0x28) = 1;
if (local_d0 == 0) {
iVar12 = local_c0;
if (local_c8 == (void *)0x0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
}
else {
iVar12 = *(int *)(local_d0 + 0x18);
}
if (iVar12 < 0) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
if (local_108 == (void *)0x0) {
if (iVar12 < 1) {
if (local_110 == 0) goto LAB_1401ef635;
iVar12 = 0;
}
else if (local_110 == 0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
FUN_14004f0e0(local_110,iVar12);
}
else {
if (local_100._4_4_ < iVar12) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
local_100 = CONCAT44(local_100._4_4_,iVar12);
}
LAB_1401ef635:
if (local_d0 == 0) {
if (local_c8 == (void *)0x0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
}
else {
local_c0 = *(int *)(local_d0 + 0x18);
}
pvVar10 = local_c8;
if (local_c8 == (void *)0x0) {
if (local_d0 == 0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
pvVar10 = pvVar13;
if (*(int *)(local_d0 + 0x18) != 0) {
pvVar10 = *(void **)(local_d0 + 0x10);
}
}
_Dst = local_108;
if (local_108 == (void *)0x0) {
if (local_110 == 0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
_Dst = pvVar13;
if (*(int *)(local_110 + 0x18) != 0) {
_Dst = *(void **)(local_110 + 0x10);
}
}
memcpy(_Dst,pvVar10,(longlong)local_c0);
local_a8 = 0;
local_a0 = 0;
local_98 = 0;
local_b0 = Proud::CReceivedMessageList::vftable;
local_90 = 1000;
local_8c = 1;
pvVar10 = pvVar13;
if (local_120 != (longlong *)0x0) {
pvVar10 = (void *)*local_120;
}
FUN_1401ff510((longlong)pvVar10 + 0x638,&local_118,&local_b0,&local_res18);
if ((int)local_res18 != 0) {
FUN_14016d8c0();
local_128 = (uint *)PTR_DAT_1403440a0;
uVar5 = FUN_14016d740(L"Stream Extract Error at Reliable UDP");
pvVar10 = pvVar13;
if ((local_128 != (uint *)0x0) &&
(pvVar10 = (void *)0x0, local_128 != (uint *)PTR_DAT_1403440a0)) {
pvVar10 = (void *)(ulonglong)local_128[-2];
}
uVar6 = 0;
uVar7 = uVar5;
if ((((int)uVar5 <= (int)pvVar10) && (uVar7 = uVar15, local_128 != (uint *)0x0)) &&
(uVar7 = uVar6, local_128 != (uint *)PTR_DAT_1403440a0)) {
uVar7 = local_128[-2];
}
uVar14 = 1;
if (1 < (int)uVar7) {
uVar14 = uVar7;
}
uVar7 = uVar6;
if ((local_128 != (uint *)0x0) && (local_128 != (uint *)PTR_DAT_1403440a0)) {
uVar7 = local_128[-2];
}
if ((int)uVar7 < (int)uVar14) {
if (local_128 == (uint *)0x0) {
local_128 = (uint *)PTR_DAT_1403440a0;
}
if ((int)uVar14 < 0) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
if (uVar14 == 0) {
FUN_14004eb70(&local_128);
}
else {
uVar7 = uVar15;
if ((local_128 != (uint *)0x0) && (local_128 != (uint *)PTR_DAT_1403440a0)) {
uVar7 = local_128[-2];
}
if (uVar14 != uVar7) {
puVar8 = (uint *)FUN_14016d940((longlong)(int)uVar14 * 2 + 10);
if (puVar8 != (uint *)0x0) {
*puVar8 = 0;
puVar8[1] = 1;
}
*puVar8 = uVar14;
uVar7 = uVar15;
if ((local_128 != (uint *)0x0) && (local_128 != (uint *)PTR_DAT_1403440a0)) {
uVar7 = local_128[-2];
}
puVar11 = (uint *)PTR_DAT_1403440a0;
if ((int)uVar14 < (int)uVar7) {
LAB_1401ef7e5:
if (local_128 != (uint *)0x0) {
puVar11 = local_128;
}
}
else {
uVar14 = uVar15;
if (local_128 != (uint *)0x0) {
if (local_128 != (uint *)PTR_DAT_1403440a0) {
uVar14 = local_128[-2];
}
goto LAB_1401ef7e5;
}
}
FUN_14016d770(puVar8 + 2,puVar11,uVar14);
FUN_14004eb70(&local_128);
local_128 = puVar8 + 2;
}
}
}
FUN_14004e850(&local_128);
puVar8 = local_128;
if (local_128 == (uint *)0x0) {
puVar8 = (uint *)PTR_DAT_1403440a0;
}
FUN_14016d770(puVar8,L"Stream Extract Error at Reliable UDP",uVar5);
puVar8 = local_128;
if (local_128 == (uint *)0x0) {
puVar8 = (uint *)PTR_DAT_1403440a0;
}
uVar5 = FUN_14016d740(puVar8);
uVar15 = 0;
if (0 < (int)uVar5) {
uVar15 = uVar5;
}
uVar5 = uVar6;
if ((local_128 != (uint *)0x0) && (local_128 != (uint *)PTR_DAT_1403440a0)) {
uVar5 = local_128[-2];
}
if (((int)uVar15 < (int)uVar5) || (uVar15 = uVar6, local_128 == (uint *)0x0)) {
LAB_1401ef881:
if (((local_128 != (uint *)PTR_DAT_1403440a0) && (local_128 != (uint *)0x0)) &&
(local_128 + -2 != (uint *)0x0)) {
local_128[-2] = uVar15;
*(undefined2 *)((longlong)local_128 + (longlong)(int)uVar15 * 2) = 0;
}
}
else if (local_128 != (uint *)PTR_DAT_1403440a0) {
uVar15 = local_128[-2];
goto LAB_1401ef881;
}
local_78 = 0;
local_70 = 0;
local_68 = 0;
local_60 = 0;
local_80 = Proud::ByteArray::vftable;
pvVar10 = pvVar13;
if (local_120 != (longlong *)0x0) {
pvVar10 = (void *)*local_120;
}
uVar9 = FUN_140198f80(local_48,(ulonglong)local_res18 & 0xffffffff,
*(undefined4 *)((longlong)pvVar10 + 0x56c),&local_128,&local_80);
(**(code **)(**(longlong **)(param_1 + 0x108) + 0x80))(*(longlong **)(param_1 + 0x108),uVar9);
FUN_14019a9e0(&local_80);
puVar8 = local_128;
if (((local_128 != (uint *)0x0) && (local_128 != (uint *)PTR_DAT_1403440a0)) &&
(puVar11 = local_128 + -2, puVar11 != (uint *)0x0)) {
uVar9 = FUN_14016d8c0();
local_58 = uVar9;
FUN_14016db50(uVar9);
local_50 = 1;
puVar8 = puVar8 + -1;
*puVar8 = *puVar8 - 1;
if (*puVar8 == 0) {
FUN_14016d970(puVar11);
}
FUN_14016dbe0(uVar9);
local_50 = 0;
}
local_128 = (uint *)PTR_DAT_1403440a0;
}
while (iVar12 = (int)pvVar13, iVar12 != (int)local_98) {
if ((iVar12 < 0) || ((int)local_98 <= iVar12)) {
/* WARNING: Subroutine does not return */
FUN_14016d6e0();
}
*(undefined1 *)(local_a0 + (longlong)iVar12 * 0x48 + 0x40) = 1;
FUN_1401f17a0(param_1,param_2);
if ((int)local_98 <= iVar12) {
/* WARNING: Subroutine does not return */
FUN_14016d6e0();
}
pvVar13 = (void *)(ulonglong)(iVar12 + 1);
}
FUN_1401a7fe0(&local_b0);
if (local_f8 != 0) {
plVar1 = (longlong *)(local_f8 + 8);
*plVar1 = *plVar1 + -1;
if (*plVar1 == 0) {
FUN_140178750(&local_f8,local_f8);
}
}
local_40 = &local_110;
FUN_14016d0e0(&local_110);
if (local_108 != (void *)0x0) {
if ((longlong)local_100 < 0) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
local_100 = local_100 & 0xffffffff00000000;
}
LAB_1401efa29:
if ((local_120 != (longlong *)0x0) && (local_120[1] = local_120[1] + -1, local_120[1] == 0)) {
puVar3 = (undefined8 *)*local_120;
if (puVar3 != (undefined8 *)0x0) {
(**(code **)*puVar3)(puVar3,1);
}
FUN_14016d970(local_120);
}
local_res18 = &local_d0;
FUN_14016d0e0(&local_d0);
if ((local_c8 != (void *)0x0) && (local_bc < 0)) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
return;
}