/* 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; }