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

340 lines
11 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x1401b8b00 FUN_1401b8b00
* Pseudocode, not original source. */
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
undefined8
FUN_1401b8b00(undefined8 *param_1,undefined8 param_2,int param_3,longlong param_4,char param_5,
longlong param_6,longlong *param_7,undefined8 param_8)
{
ulonglong uVar1;
int iVar2;
char cVar3;
int iVar4;
undefined4 uVar5;
longlong lVar6;
undefined8 uVar7;
longlong *plVar8;
uint *puVar9;
longlong lVar10;
char cVar11;
uint *puVar12;
uint *puVar13;
int iVar14;
undefined1 auStack_108 [32];
int local_e8;
longlong *local_d8;
int local_d0 [2];
longlong local_c8;
uint *local_c0;
int local_b8;
int local_b4;
int local_a8;
longlong local_a0;
int local_98;
longlong *local_90;
longlong local_88 [2];
short local_78 [2];
int local_74;
uint local_70;
int local_6c;
ulonglong local_68;
local_88[1] = 0xfffffffffffffffe;
local_68 = DAT_1403463c0 ^ (ulonglong)auStack_108;
local_90 = param_7;
local_a8 = param_3;
local_a0 = param_4;
FUN_14016b440(local_d0);
FUN_14016b0c0(local_d0,param_2,param_3);
FUN_14016b5a0(local_d0,param_3);
FUN_14016b040(local_d0,0);
cVar3 = FUN_14016b370(local_d0,local_78,0x10);
if (cVar3 == '\0') {
FUN_14004c050(param_8,L"UDP frag header missing!");
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
if (local_78[0] == -0x5433) {
if ((((local_74 < 1) || (iVar4 = (**(code **)(*(longlong *)*param_1 + 8))(), iVar4 < local_74))
|| (local_6c < 0)) || (local_74 / DAT_140344d48 < local_6c)) {
uVar5 = (**(code **)(*(longlong *)*param_1 + 8))();
local_e8 = local_6c;
FUN_14004c020(param_8,L"UDP frag length is wrong #1! packetlength=%d, maxlength=%d, fragID=%d"
,local_74,uVar5);
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
if (local_78[0] != -0x5432) goto LAB_1401b8cdf;
}
else if (local_78[0] != -0x5432) {
FUN_14004c020(param_8,L"Cannot identify UDP fragment nor full packet! fragheaderSplitter=%u",
local_78[0]);
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
if ((local_74 < 1) || (iVar4 = (**(code **)(*(longlong *)*param_1 + 8))(), iVar4 < local_74)) {
FUN_14004c050(param_8,L"UDP full packet length is wrong!");
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
LAB_1401b8cdf:
cVar3 = (**(code **)(*(longlong *)*param_1 + 0x20))();
iVar4 = local_6c;
puVar13 = local_c0;
lVar10 = local_c8;
cVar11 = (char)((ushort)local_78[1] >> 8);
if ((((cVar11 == '\0') || (param_5 == '\0')) || (cVar11 == param_5)) &&
((((char)local_78[1] == '\0' || (cVar3 == '\0')) || ((char)local_78[1] == cVar3)))) {
local_98 = DAT_140344d48 * local_6c;
iVar2 = local_74 - local_98;
if (DAT_140344d48 < local_74 - local_98) {
iVar2 = DAT_140344d48;
}
if (local_c8 == 0) {
if (local_c0 == (uint *)0x0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
}
else {
local_b8 = *(int *)(local_c8 + 0x18);
}
iVar14 = local_b8 - ((int)(local_d0[0] + (local_d0[0] >> 0x1f & 7U)) >> 3);
if ((local_78[0] == -0x5433) && (iVar2 != iVar14)) {
FUN_14004c020(param_8,
L"UDP frag length is wrong #2! desiredFragLength=%d, fragPayloadLength=%d",iVar2
,iVar14);
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
local_d8 = param_1 + 1;
lVar6 = FUN_1401b5b40(local_d8);
if (lVar6 == 0) {
uVar7 = (**(code **)(*(longlong *)*param_1 + 0x18))();
lVar6 = FUN_1401b86f0(uVar7);
*(longlong *)(lVar6 + 0x70) = param_6;
local_88[0] = lVar6;
FUN_1401b7c60(local_d8,local_a0,local_88);
lVar10 = local_c8;
puVar13 = local_c0;
iVar4 = local_6c;
}
else {
lVar6 = *(longlong *)(lVar6 + 0x10);
}
plVar8 = local_90;
if (local_78[0] == -0x5433) {
uVar1 = (ulonglong)local_70 % (ulonglong)*(uint *)(lVar6 + 0x28);
puVar13 = (uint *)0x0;
puVar9 = puVar13;
if ((*(longlong *)(lVar6 + 8) != 0) &&
(puVar12 = *(uint **)(*(longlong *)(lVar6 + 8) + uVar1 * 8), puVar12 != (uint *)0x0)) {
while (puVar9 = puVar13, (uint)uVar1 == puVar12[8] % *(uint *)(lVar6 + 0x28)) {
puVar9 = puVar12;
if ((*puVar12 == local_70) ||
(puVar12 = *(uint **)(puVar12 + 4), puVar9 = puVar13, puVar12 == (uint *)0x0)) break;
}
}
if (puVar9 == (uint *)0x0) {
plVar8 = (longlong *)FUN_1401b6970();
local_d8 = plVar8;
FUN_14004f0e0(plVar8 + 5,local_74);
FUN_1401a3f80(plVar8);
plVar8[0xb] = param_6;
puVar9 = puVar13;
if ((int)plVar8[3] != 0) {
puVar9 = (uint *)plVar8[2];
}
memset(puVar9,0,(longlong)(int)plVar8[3]);
puVar9 = (uint *)FUN_1401b7bc0(lVar6,&local_70,&local_d8);
iVar4 = local_6c;
}
else {
plVar8 = *(longlong **)(puVar9 + 2);
if ((int)plVar8[8] != local_74) {
FUN_14004c020(param_8,
L"UDP frag length is wrong #3! assembledDataCount=%d, packetLength=%d",
(int)plVar8[8],local_74);
FUN_140174c00(lVar6,puVar9,0);
FUN_1401a4a90(plVar8);
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
}
iVar2 = (int)plVar8[3];
if (iVar2 <= iVar4) {
FUN_14004c050(param_8,L"UDP FragID is wrong!");
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
return 2;
}
if ((int)plVar8[8] < iVar14 + local_98) {
FUN_14004c050(param_8,L"UDP Frag Payload Length is wrong!");
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 2;
}
if (-1 < local_b4) {
return 2;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
if ((iVar4 < 0) || (iVar2 <= iVar4)) {
/* WARNING: Subroutine does not return */
FUN_14016d6e0();
}
if (*(char *)(plVar8[2] + (longlong)iVar4) == '\0') {
if (iVar2 <= iVar4) {
/* WARNING: Subroutine does not return */
FUN_14016d6e0();
}
*(undefined1 *)(plVar8[2] + (longlong)iVar4) = 1;
*(int *)(plVar8 + 10) = (int)plVar8[10] + 1;
*(double *)(lVar6 + 0x60) = (double)local_a8 + *(double *)(lVar6 + 0x60);
*(longlong *)(lVar6 + 0x70) = param_6;
puVar12 = local_c0;
if (local_c0 == (uint *)0x0) {
if (local_c8 == 0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
puVar12 = puVar13;
if (*(int *)(local_c8 + 0x18) != 0) {
puVar12 = *(uint **)(local_c8 + 0x10);
}
}
if ((int)plVar8[8] != 0) {
puVar13 = (uint *)plVar8[7];
}
FUN_14004f1a0((longlong)puVar13 + (longlong)local_98,
(longlong)((int)(local_d0[0] + (local_d0[0] >> 0x1f & 7U)) >> 3) +
(longlong)puVar12,(longlong)iVar14);
}
if ((int)plVar8[3] == (int)plVar8[10]) {
*(undefined4 *)(local_90 + 2) = *(undefined4 *)(local_a0 + 8);
*(undefined2 *)((longlong)local_90 + 0x14) = *(undefined2 *)(local_a0 + 0xc);
*local_90 = (longlong)plVar8;
if (puVar9 == (uint *)0x0) {
/* WARNING: Subroutine does not return */
FUN_14004dc60(0x80004005);
}
FUN_140174c00(lVar6,puVar9,0);
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if (local_c0 == (uint *)0x0) {
return 0;
}
if (-1 < local_b4) {
return 0;
}
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
}
else if ((local_78[0] == -0x5432) && (0 < iVar14)) {
puVar9 = (uint *)0x0;
if (puVar13 == (uint *)0x0) {
if (lVar10 == 0) {
/* WARNING: Subroutine does not return */
FUN_14016d1e0();
}
puVar13 = puVar9;
if (*(int *)(lVar10 + 0x18) != 0) {
puVar13 = *(uint **)(lVar10 + 0x10);
}
}
*(double *)(lVar6 + 0x60) = (double)local_a8 + *(double *)(lVar6 + 0x60);
*(longlong *)(lVar6 + 0x70) = param_6;
*(undefined4 *)(local_90 + 2) = *(undefined4 *)(local_a0 + 8);
*(undefined2 *)((longlong)local_90 + 0x14) = *(undefined2 *)(local_a0 + 0xc);
lVar10 = FUN_1401b6970();
FUN_14004f0e0(lVar10 + 0x28,iVar14);
if (*(int *)(lVar10 + 0x40) != 0) {
puVar9 = *(uint **)(lVar10 + 0x38);
}
FUN_14004f1a0(puVar9,(longlong)((int)(local_d0[0] + (local_d0[0] >> 0x1f & 7U)) >> 3) +
(longlong)puVar13,(longlong)iVar14);
*plVar8 = lVar10;
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
return 0;
}
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
}
else {
local_d8 = &local_c8;
FUN_14016d0e0(&local_c8);
if ((local_c0 != (uint *)0x0) && (local_b4 < 0)) {
/* WARNING: Subroutine does not return */
FUN_14016d6b0();
}
}
return 1;
}