server-re/decomp/AgentManager_Release_x64/full/functions/0x1400be2a0.c
2026-10-15 09:58:24 -04:00

275 lines
8.1 KiB
C

/* AgentManager_Release_x64.exe sha256 8fd8ca91725858651a7839d34257b10c2970ac16c97e60c523b8b0c983fcb186
* Ghidra 12.1.2 decompiler output for 0x1400be2a0 FUN_1400be2a0
* Pseudocode, not original source. */
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
/* WARNING: Type propagation algorithm not settling */
undefined8
FUN_1400be2a0(int param_1,ushort *param_2,uint param_3,longlong *param_4,uint *param_5,
undefined *param_6)
{
uint uVar1;
byte bVar2;
ushort uVar4;
uint uVar5;
ushort *puVar6;
undefined8 uVar7;
byte bVar8;
longlong lVar9;
ulonglong uVar10;
uint uVar11;
ulonglong uVar12;
uint uVar13;
ulonglong uVar14;
int iVar15;
ulonglong uVar16;
uint uVar17;
int iVar18;
int iVar19;
uint uVar20;
uint uVar21;
byte bVar22;
bool bVar23;
undefined4 local_d8;
uint local_d0;
uint local_cc;
undefined *local_b0;
undefined *local_a8;
ushort local_88 [15];
ushort local_6a [17];
ulonglong local_48;
char cVar3;
local_48 = DAT_14016f5a0 ^ (ulonglong)&local_d8;
uVar16 = 0;
puVar6 = local_88;
for (lVar9 = 0x10; lVar9 != 0; lVar9 = lVar9 + -1) {
*puVar6 = 0;
puVar6 = puVar6 + 1;
}
if (param_3 != 0) {
uVar12 = (ulonglong)param_3;
puVar6 = param_2;
do {
uVar4 = *puVar6;
puVar6 = puVar6 + 1;
local_88[uVar4] = local_88[uVar4] + 1;
uVar12 = uVar12 - 1;
} while (uVar12 != 0);
}
uVar20 = 0xf;
puVar6 = local_6a;
uVar12 = 0xffffffff;
do {
if (*puVar6 != 0) break;
uVar20 = uVar20 - 1;
puVar6 = puVar6 + -1;
} while (uVar20 != 0);
uVar1 = *param_5;
if (uVar20 < *param_5) {
uVar1 = uVar20;
}
if (uVar20 == 0) {
*(undefined4 *)*param_4 = 0x140;
*param_4 = *param_4 + 4;
*(undefined4 *)*param_4 = 0x140;
*param_4 = *param_4 + 4;
*param_5 = 1;
uVar7 = 0;
}
else {
uVar21 = 1;
if (1 < uVar20) {
puVar6 = local_88;
do {
puVar6 = puVar6 + 1;
if (*puVar6 != 0) break;
uVar21 = uVar21 + 1;
} while (uVar21 < uVar20);
}
iVar15 = 1;
if (uVar1 < uVar21) {
uVar1 = uVar21;
}
uVar10 = 1;
do {
iVar15 = iVar15 * 2 - (uint)local_88[uVar10];
if (iVar15 < 0) goto LAB_1400be74c;
uVar11 = (int)uVar10 + 1;
uVar10 = (ulonglong)uVar11;
} while (uVar11 < 0x10);
if ((iVar15 < 1) || ((param_1 != 0 && (uVar20 == 1)))) {
local_6a[2] = 0;
lVar9 = 0xe;
uVar10 = uVar16;
do {
lVar9 = lVar9 + -1;
*(short *)((longlong)local_6a + uVar10 + 6) =
*(short *)((longlong)local_88 + uVar10 + 2) +
*(short *)((longlong)local_6a + uVar10 + 4);
uVar10 = uVar10 + 2;
} while (lVar9 != 0);
puVar6 = param_2;
uVar10 = uVar16;
if (param_3 != 0) {
do {
if (*puVar6 != 0) {
*(short *)(param_6 + (ulonglong)local_6a[(ulonglong)*puVar6 + 1] * 2) = (short)uVar10;
local_6a[(ulonglong)*puVar6 + 1] = local_6a[(ulonglong)*puVar6 + 1] + 1;
}
uVar11 = (int)uVar10 + 1;
puVar6 = puVar6 + 1;
uVar10 = (ulonglong)uVar11;
} while (uVar11 < param_3);
}
if (param_1 == 0) {
local_a8 = param_6;
local_b0 = param_6;
iVar15 = 0x13;
}
else if (param_1 == 1) {
iVar15 = 0x100;
local_b0 = &DAT_140123116;
local_a8 = &DAT_140123156;
}
else {
iVar15 = -1;
local_b0 = &DAT_1401233a0;
local_a8 = &DAT_1401233e0;
}
bVar8 = (byte)uVar1;
local_cc = 1 << (bVar8 & 0x1f);
uVar14 = (ulonglong)local_cc;
local_d0 = 0;
lVar9 = *param_4;
uVar5 = local_cc - 1;
uVar10 = uVar16;
uVar11 = 0;
if (param_1 == 1) {
uVar12 = 0xffffffff;
if (local_cc < 0x354) {
LAB_1400be510:
do {
do {
cVar3 = (char)uVar21;
bVar22 = (byte)uVar11;
bVar2 = cVar3 - bVar22;
uVar4 = *(ushort *)(param_6 + uVar10 * 2);
if ((int)(uint)uVar4 < iVar15) {
local_d8._0_2_ = (ushort)bVar2 << 8;
}
else if (iVar15 < (int)(uint)uVar4) {
local_d8._0_2_ =
CONCAT11(bVar2,local_a8[(ulonglong)*(ushort *)(param_6 + uVar10 * 2) * 2]);
uVar4 = *(ushort *)(local_b0 + (ulonglong)*(ushort *)(param_6 + uVar10 * 2) * 2);
}
else {
local_d8 = CONCAT31((uint3)bVar2,0x60);
uVar4 = 0;
}
uVar13 = (uint)uVar16;
local_d8 = CONCAT22(uVar4,(ushort)local_d8);
iVar18 = 1 << (cVar3 - bVar22 & 0x1f);
uVar10 = (ulonglong)((uVar13 >> (bVar22 & 0x1f)) + (int)uVar14);
uVar16 = uVar14;
do {
uVar10 = (ulonglong)(uint)((int)uVar10 - iVar18);
uVar17 = (int)uVar16 - iVar18;
uVar16 = (ulonglong)uVar17;
*(uint *)(lVar9 + uVar10 * 4) = local_d8;
} while (uVar17 != 0);
for (uVar17 = 1 << (cVar3 - 1U & 0x1f); (uVar13 & uVar17) != 0; uVar17 = uVar17 >> 1)
{
}
if (uVar17 == 0) {
uVar16 = 0;
}
else {
uVar16 = (ulonglong)(uVar17 + (uVar17 - 1 & uVar13));
}
local_d0 = local_d0 + 1;
uVar10 = (ulonglong)local_d0;
puVar6 = local_88 + uVar21;
*puVar6 = *puVar6 - 1;
uVar13 = (uint)uVar16;
if (*puVar6 == 0) {
if (uVar21 == uVar20) {
local_d8._0_2_ = CONCAT11(cVar3 - bVar22,0x40);
local_d8 = (uint)(ushort)local_d8;
goto joined_r0x0001400be6dc;
}
uVar21 = (uint)param_2[*(ushort *)(param_6 + uVar10 * 2)];
}
} while (uVar21 <= uVar1);
uVar13 = uVar5 & uVar13;
} while (uVar13 == (uint)uVar12);
if (uVar11 == 0) {
uVar11 = uVar1;
}
lVar9 = lVar9 + uVar14 * 4;
iVar19 = uVar21 - uVar11;
uVar17 = uVar11 + iVar19;
for (iVar18 = 1 << ((byte)iVar19 & 0x1f);
(uVar17 < uVar20 &&
(uVar12 = (ulonglong)uVar17, 0 < (int)(iVar18 - (uint)local_88[uVar12])));
iVar18 = (iVar18 - (uint)local_88[uVar12]) * 2) {
uVar17 = uVar17 + 1;
iVar19 = iVar19 + 1;
}
uVar17 = 1 << ((byte)iVar19 & 0x1f);
uVar14 = (ulonglong)uVar17;
local_cc = local_cc + uVar17;
if (param_1 == 1) {
bVar23 = local_cc < 0x354;
LAB_1400be67e:
if (!bVar23) goto LAB_1400be4ea;
}
else if (param_1 == 2) {
bVar23 = local_cc < 0x250;
goto LAB_1400be67e;
}
uVar12 = (ulonglong)uVar13;
*(byte *)(*param_4 + (ulonglong)uVar13 * 4) = (byte)iVar19;
*(byte *)(*param_4 + 1 + uVar12 * 4) = bVar8;
*(short *)(*param_4 + 2 + uVar12 * 4) = (short)(lVar9 - *param_4 >> 2);
uVar10 = (ulonglong)local_d0;
goto LAB_1400be510;
}
}
else if ((param_1 != 2) || (uVar16 = 0, uVar10 = 0, uVar11 = 0, local_cc < 0x250))
goto LAB_1400be510;
LAB_1400be4ea:
uVar7 = 1;
}
else {
LAB_1400be74c:
uVar7 = 0xffffffff;
}
}
return uVar7;
joined_r0x0001400be6dc:
if (uVar13 == 0) {
LAB_1400be738:
*param_4 = *param_4 + (ulonglong)local_cc * 4;
*param_5 = uVar1;
return 0;
}
uVar20 = (uint)uVar16;
if ((uVar11 != 0) && ((uVar5 & uVar20) != (uint)uVar12)) {
lVar9 = *param_4;
local_d8._0_2_ = CONCAT11(bVar8,(undefined1)local_d8);
local_d8 = (uint)(ushort)local_d8;
uVar21 = uVar1;
uVar11 = 0;
}
*(uint *)(lVar9 + (uVar16 >> ((byte)uVar11 & 0x3f)) * 4) = local_d8;
for (uVar13 = 1 << ((char)uVar21 - 1U & 0x1f); (uVar20 & uVar13) != 0; uVar13 = uVar13 >> 1) {
}
if (uVar13 == 0) goto LAB_1400be738;
uVar13 = (uVar20 & uVar13 - 1) + uVar13;
uVar16 = (ulonglong)uVar13;
goto joined_r0x0001400be6dc;
}