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

260 lines
7.4 KiB
C

/* AgentManager_Release_x64.exe sha256 8fd8ca91725858651a7839d34257b10c2970ac16c97e60c523b8b0c983fcb186
* Ghidra 12.1.2 decompiler output for 0x1400ea034 FUN_1400ea034
* Pseudocode, not original source. */
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
undefined8
FUN_1400ea034(int param_1,ushort *param_2,uint param_3,longlong *param_4,uint *param_5,
undefined *param_6)
{
byte bVar1;
ushort uVar2;
ushort *puVar3;
undefined8 uVar4;
byte bVar5;
longlong lVar6;
ulonglong uVar7;
ulonglong uVar8;
ulonglong uVar9;
uint uVar10;
uint uVar11;
uint uVar12;
int iVar13;
char cVar14;
uint uVar15;
uint uVar16;
int iVar17;
int iVar18;
uint uVar19;
byte bVar21;
ulonglong uVar22;
uint uVar23;
undefined *puVar24;
undefined4 local_d8;
longlong local_d0;
uint local_c8;
uint local_c4;
uint local_c0;
uint local_bc;
undefined *local_b0;
ushort local_80 [32];
ulonglong local_40;
ulonglong uVar20;
local_40 = DAT_14016f5a0 ^ (ulonglong)&local_d8;
uVar22 = 0;
uVar23 = 1;
puVar3 = local_80;
for (lVar6 = 0x10; lVar6 != 0; lVar6 = lVar6 + -1) {
*puVar3 = 0;
puVar3 = puVar3 + 1;
}
if (param_3 != 0) {
uVar8 = (ulonglong)param_3;
puVar3 = param_2;
do {
uVar2 = *puVar3;
puVar3 = puVar3 + 1;
local_80[uVar2] = local_80[uVar2] + 1;
uVar8 = uVar8 - 1;
} while (uVar8 != 0);
}
uVar10 = 0xf;
local_c4 = 0xffffffff;
puVar3 = local_80 + 0xf;
do {
if (*puVar3 != 0) break;
uVar10 = uVar10 - 1;
puVar3 = puVar3 + -1;
} while (uVar10 != 0);
uVar16 = *param_5;
if (uVar10 < *param_5) {
uVar16 = uVar10;
}
if (uVar10 == 0) {
*(undefined4 *)*param_4 = 0x140;
*param_4 = *param_4 + 4;
*(undefined4 *)*param_4 = 0x140;
*param_4 = *param_4 + 4;
*param_5 = 1;
LAB_1400ea102:
uVar4 = 0;
}
else {
puVar3 = local_80;
uVar15 = uVar23;
do {
puVar3 = puVar3 + 1;
if (*puVar3 != 0) break;
uVar15 = uVar15 + 1;
} while (uVar15 < 0x10);
uVar8 = (ulonglong)uVar16;
uVar11 = uVar23;
if (uVar16 < uVar15) {
uVar8 = (ulonglong)uVar15;
}
do {
uVar23 = uVar23 * 2 - (uint)local_80[uVar11];
if ((int)uVar23 < 0) goto LAB_1400ea471;
uVar11 = uVar11 + 1;
} while (uVar11 < 0x10);
if (((int)uVar23 < 1) || ((param_1 != 0 && (uVar10 == 1)))) {
local_80[0x11] = 0;
lVar6 = 0xe;
uVar7 = uVar22;
do {
lVar6 = lVar6 + -1;
*(short *)((longlong)local_80 + uVar7 + 0x24) =
*(short *)((longlong)local_80 + uVar7 + 2) +
*(short *)((longlong)local_80 + uVar7 + 0x22);
uVar7 = uVar7 + 2;
} while (lVar6 != 0);
puVar3 = param_2;
uVar7 = uVar22;
if (param_3 != 0) {
do {
if (*puVar3 != 0) {
*(short *)(param_6 + (ulonglong)local_80[(ulonglong)*puVar3 + 0x10] * 2) = (short)uVar7;
local_80[(ulonglong)*puVar3 + 0x10] = local_80[(ulonglong)*puVar3 + 0x10] + 1;
}
uVar23 = (int)uVar7 + 1;
puVar3 = puVar3 + 1;
uVar7 = (ulonglong)uVar23;
} while (uVar23 < param_3);
}
if (param_1 == 0) {
local_b0 = param_6;
iVar13 = 0x13;
puVar24 = param_6;
}
else if (param_1 == 1) {
iVar13 = 0x100;
local_b0 = &DAT_14012b67e;
puVar24 = &UNK_14012b63e;
}
else {
iVar13 = -1;
local_b0 = &DAT_14012b900;
puVar24 = &DAT_14012b8c0;
}
local_d0 = *param_4;
uVar16 = (uint)uVar8;
bVar5 = (byte)uVar8;
local_bc = 1 << (bVar5 & 0x1f);
uVar23 = local_bc - 1;
local_c0 = 0;
uVar7 = uVar22;
uVar9 = uVar22;
local_c8 = local_bc;
if ((param_1 != 1) || (uVar7 = 0, uVar9 = 0, local_bc < 0x5b0)) {
LAB_1400ea254:
cVar14 = (char)uVar15;
bVar21 = (byte)uVar22;
bVar1 = cVar14 - bVar21;
uVar2 = *(ushort *)(param_6 + uVar9 * 2);
if ((int)(uint)uVar2 < iVar13) {
local_d8._0_2_ = (ushort)bVar1 << 8;
}
else if (iVar13 < (int)(uint)uVar2) {
local_d8._0_2_ = CONCAT11(bVar1,local_b0[(ulonglong)*(ushort *)(param_6 + uVar9 * 2) * 2])
;
uVar2 = *(ushort *)(puVar24 + (ulonglong)*(ushort *)(param_6 + uVar9 * 2) * 2);
}
else {
local_d8 = CONCAT31((uint3)bVar1,0x60);
uVar2 = 0;
}
uVar12 = (uint)uVar7;
local_d8 = CONCAT22(uVar2,(ushort)local_d8);
iVar17 = 1 << (cVar14 - bVar21 & 0x1f);
uVar7 = (ulonglong)((uVar12 >> (bVar21 & 0x1f)) + local_bc);
uVar11 = local_bc;
do {
uVar7 = (ulonglong)(uint)((int)uVar7 - iVar17);
uVar11 = uVar11 - iVar17;
*(uint *)(local_d0 + uVar7 * 4) = local_d8;
} while (uVar11 != 0);
for (uVar11 = 1 << (cVar14 - 1U & 0x1f); (uVar12 & uVar11) != 0; uVar11 = uVar11 >> 1) {
}
uVar19 = 0;
if (uVar11 != 0) {
uVar19 = uVar11 + (uVar11 - 1 & uVar12);
}
uVar7 = (ulonglong)uVar19;
local_c0 = local_c0 + 1;
uVar9 = (ulonglong)local_c0;
puVar3 = local_80 + uVar15;
*puVar3 = *puVar3 - 1;
if (*puVar3 != 0) goto LAB_1400ea31e;
if (uVar15 != uVar10) {
uVar15 = (uint)param_2[*(ushort *)(param_6 + uVar9 * 2)];
goto LAB_1400ea31e;
}
local_d8._0_2_ = CONCAT11(cVar14 - bVar21,0x40);
local_d8 = (uint)(ushort)local_d8;
while (uVar19 != 0) {
uVar10 = (uint)uVar7;
if (((int)uVar22 != 0) && ((uVar23 & uVar10) != local_c4)) {
local_d0 = *param_4;
uVar22 = 0;
local_d8._0_2_ = CONCAT11(bVar5,(undefined1)local_d8);
local_d8 = (uint)(ushort)local_d8;
uVar15 = uVar16;
}
*(uint *)(local_d0 + (uVar7 >> ((byte)uVar22 & 0x3f)) * 4) = local_d8;
for (uVar11 = 1 << ((char)uVar15 - 1U & 0x1f); (uVar10 & uVar11) != 0;
uVar11 = uVar11 >> 1) {
}
uVar19 = 0;
if (uVar11 != 0) {
uVar19 = uVar11 + (uVar11 - 1 & uVar10);
}
uVar7 = (ulonglong)uVar19;
}
*param_4 = *param_4 + (ulonglong)local_c8 * 4;
*param_5 = uVar16;
goto LAB_1400ea102;
}
LAB_1400ea245:
uVar4 = 1;
}
else {
LAB_1400ea471:
uVar4 = 0xffffffff;
}
}
return uVar4;
LAB_1400ea31e:
if (uVar16 < uVar15) {
uVar19 = uVar23 & uVar19;
uVar20 = (ulonglong)uVar19;
if (uVar19 == local_c4) goto LAB_1400ea254;
if ((int)uVar22 == 0) {
uVar22 = uVar8;
}
local_d0 = local_d0 + (ulonglong)local_bc * 4;
iVar18 = uVar15 - (int)uVar22;
uVar11 = (int)uVar22 + iVar18;
for (iVar17 = 1 << ((byte)iVar18 & 0x1f);
(uVar11 < uVar10 && (uVar9 = (ulonglong)uVar11, 0 < (int)(iVar17 - (uint)local_80[uVar9])));
iVar17 = (iVar17 - (uint)local_80[uVar9]) * 2) {
uVar11 = uVar11 + 1;
iVar18 = iVar18 + 1;
}
local_bc = 1 << ((byte)iVar18 & 0x1f);
local_c8 = local_c8 + local_bc;
if ((param_1 != 1) || (local_c8 < 0x5b0)) {
*(byte *)(*param_4 + uVar20 * 4) = (byte)iVar18;
uVar9 = (ulonglong)local_c0;
*(byte *)(*param_4 + 1 + uVar20 * 4) = bVar5;
*(short *)(*param_4 + 2 + uVar20 * 4) = (short)(local_d0 - *param_4 >> 2);
local_c4 = uVar19;
goto LAB_1400ea254;
}
goto LAB_1400ea245;
}
goto LAB_1400ea254;
}