367 lines
10 KiB
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;
|
|
}
|
|
|