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

274 lines
7.9 KiB
C

/* AgentManager_Release_x64.exe sha256 8fd8ca91725858651a7839d34257b10c2970ac16c97e60c523b8b0c983fcb186
* Ghidra 12.1.2 decompiler output for 0x1400bcac0 FUN_1400bcac0
* Pseudocode, not original source. */
void FUN_1400bcac0(longlong *param_1,int param_2)
{
longlong lVar1;
uint uVar2;
undefined4 uVar3;
uint uVar4;
undefined4 uVar5;
undefined4 *puVar6;
longlong lVar7;
longlong lVar8;
longlong lVar9;
uint uVar10;
ulonglong uVar11;
uint uVar12;
uint uVar13;
uint uVar14;
byte *pbVar15;
byte *pbVar16;
longlong lVar17;
undefined1 *puVar18;
undefined1 *puVar19;
undefined1 *puVar20;
undefined1 *puVar21;
undefined1 *puVar22;
char cVar23;
uint uVar24;
uint uVar25;
int iVar26;
byte *pbVar27;
int local_60;
puVar6 = (undefined4 *)param_1[5];
lVar9 = param_1[3];
lVar17 = *(longlong *)(puVar6 + 0x16);
lVar7 = *(longlong *)(puVar6 + 0x18);
uVar2 = puVar6[0xd];
uVar14 = puVar6[0x10];
uVar25 = puVar6[0x11];
puVar18 = (undefined1 *)(param_1[2] + -1);
uVar3 = puVar6[0x1a];
pbVar15 = (byte *)(*param_1 + -1);
local_60 = (int)puVar18 - (param_2 - (int)lVar9);
iVar26 = puVar6[0xb];
uVar4 = puVar6[0xc];
lVar8 = *(longlong *)(puVar6 + 0xe);
pbVar27 = pbVar15 + ((int)param_1[1] - 5);
uVar5 = puVar6[0x1b];
puVar20 = puVar18;
LAB_1400bcb70:
if (uVar25 < 0xf) {
pbVar16 = pbVar15 + 1;
pbVar15 = pbVar15 + 2;
uVar14 = uVar14 + ((uint)*pbVar16 << ((byte)uVar25 & 0x1f)) +
((uint)*pbVar15 << ((byte)uVar25 + 8 & 0x1f));
uVar25 = uVar25 + 0x10;
}
uVar12 = *(uint *)(lVar17 + (ulonglong)(uVar14 & (1 << ((byte)uVar3 & 0x1f)) - 1U) * 4);
uVar14 = uVar14 >> ((byte)(uVar12 >> 8) & 0x1f);
uVar25 = uVar25 - (uVar12 >> 8 & 0xff);
cVar23 = (char)uVar12;
while (cVar23 != '\0') {
puVar19 = puVar20;
if ((uVar12 & 0x10) != 0) {
uVar24 = uVar12 >> 0x10;
uVar12 = uVar12 & 0xf;
pbVar16 = pbVar15;
if (uVar12 != 0) {
if (uVar25 < uVar12) {
pbVar16 = pbVar15 + 1;
pbVar15 = pbVar15 + 1;
uVar14 = uVar14 + ((uint)*pbVar16 << ((byte)uVar25 & 0x1f));
uVar25 = uVar25 + 8;
}
uVar10 = (1 << (sbyte)uVar12) - 1U & uVar14;
uVar14 = uVar14 >> (sbyte)uVar12;
uVar24 = uVar24 + uVar10;
uVar25 = uVar25 - uVar12;
pbVar16 = pbVar15;
}
if (uVar25 < 0xf) {
pbVar15 = pbVar16 + 1;
pbVar16 = pbVar16 + 2;
uVar14 = uVar14 + ((uint)*pbVar15 << ((byte)uVar25 & 0x1f)) +
((uint)*pbVar16 << ((byte)uVar25 + 8 & 0x1f));
uVar25 = uVar25 + 0x10;
}
uVar12 = *(uint *)(lVar7 + (ulonglong)((1 << ((byte)uVar5 & 0x1f)) - 1U & uVar14) * 4);
uVar14 = uVar14 >> ((byte)(uVar12 >> 8) & 0x1f);
uVar25 = uVar25 - (uVar12 >> 8 & 0xff);
goto joined_r0x0001400bcc7d;
}
if ((uVar12 & 0x40) != 0) {
if ((uVar12 & 0x20) == 0) {
param_1[4] = (longlong)"invalid literal/length code";
*puVar6 = 0x1d;
}
else {
*puVar6 = 0xb;
}
goto LAB_1400bcf45;
}
uVar12 = *(uint *)(lVar17 + (ulonglong)
(((1 << ((byte)uVar12 & 0x1f)) - 1U & uVar14) + (uVar12 >> 0x10)) *
4);
uVar14 = uVar14 >> ((byte)(uVar12 >> 8) & 0x1f);
uVar25 = uVar25 - (uVar12 >> 8 & 0xff);
cVar23 = (char)uVar12;
}
puVar20[1] = (char)(uVar12 >> 0x10);
puVar19 = puVar20 + 1;
goto LAB_1400bcec7;
joined_r0x0001400bcc7d:
pbVar15 = pbVar16;
if ((uVar12 & 0x10) != 0) goto LAB_1400bccc2;
if ((uVar12 & 0x40) != 0) {
param_1[4] = (longlong)"invalid distance code";
*puVar6 = 0x1d;
goto LAB_1400bcf45;
}
uVar12 = *(uint *)(lVar7 + (ulonglong)
(((1 << ((byte)uVar12 & 0x1f)) - 1U & uVar14) + (uVar12 >> 0x10)) * 4);
uVar14 = uVar14 >> ((byte)(uVar12 >> 8) & 0x1f);
uVar25 = uVar25 - (uVar12 >> 8 & 0xff);
goto joined_r0x0001400bcc7d;
LAB_1400bccc2:
uVar13 = uVar12 & 0xf;
uVar10 = uVar25;
if (uVar25 < uVar13) {
pbVar15 = pbVar16 + 1;
uVar10 = uVar25 + 8;
uVar14 = uVar14 + ((uint)pbVar16[1] << ((byte)uVar25 & 0x1f));
if (uVar10 < uVar13) {
pbVar15 = pbVar16 + 2;
uVar14 = uVar14 + ((uint)pbVar16[2] << ((byte)uVar10 & 0x1f));
uVar10 = uVar25 + 0x10;
}
}
uVar25 = uVar10 - uVar13;
uVar10 = (1 << (sbyte)uVar13) - 1U & uVar14;
uVar14 = uVar14 >> (sbyte)uVar13;
uVar10 = (uVar12 >> 0x10) + uVar10;
uVar12 = (int)puVar20 - local_60;
if (uVar10 <= uVar12) {
puVar19 = puVar20 + -(ulonglong)uVar10;
do {
puVar22 = puVar20;
puVar21 = puVar19;
puVar20 = puVar22 + 3;
puVar22[1] = puVar21[1];
uVar24 = uVar24 - 3;
puVar22[2] = puVar21[2];
*puVar20 = puVar21[3];
puVar19 = puVar21 + 3;
} while (2 < uVar24);
puVar19 = puVar20;
if (uVar24 != 0) {
puVar22[4] = puVar21[4];
puVar19 = puVar22 + 4;
if (1 < uVar24) {
puVar22[5] = puVar21[5];
puVar19 = puVar22 + 5;
}
}
goto LAB_1400bcec7;
}
uVar12 = uVar10 - uVar12;
if ((uVar4 < uVar12) && (puVar6[0x6f6] != 0)) {
param_1[4] = (longlong)"invalid distance too far back";
*puVar6 = 0x1d;
LAB_1400bcf45:
lVar17 = (longlong)pbVar15 - (ulonglong)(uVar25 >> 3);
iVar26 = uVar25 + (uVar25 >> 3) * -8;
*param_1 = lVar17 + 1;
param_1[2] = (longlong)(puVar19 + 1);
*(int *)(param_1 + 1) = ((int)pbVar27 - (int)lVar17) + 5;
*(int *)(param_1 + 3) = ((int)(puVar18 + ((int)lVar9 - 0x101)) - (int)puVar19) + 0x101;
puVar6[0x10] = uVar14 & (1 << ((byte)iVar26 & 0x1f)) - 1U;
puVar6[0x11] = iVar26;
return;
}
lVar1 = lVar8 + -1;
if (uVar2 == 0) {
puVar21 = (undefined1 *)(lVar1 + (ulonglong)(iVar26 - uVar12));
if (uVar12 < uVar24) {
uVar24 = uVar24 - uVar12;
do {
puVar20 = puVar21 + 1;
puVar21 = puVar21 + 1;
puVar19 = puVar19 + 1;
uVar12 = uVar12 - 1;
*puVar19 = *puVar20;
} while (uVar12 != 0);
LAB_1400bcdf2:
puVar21 = puVar19 + -(ulonglong)uVar10;
puVar20 = puVar19;
}
}
else if (uVar2 < uVar12) {
uVar13 = uVar12 - uVar2;
puVar21 = (undefined1 *)(lVar1 + (ulonglong)((uVar2 - uVar12) + iVar26));
if (uVar13 < uVar24) {
uVar24 = uVar24 - uVar13;
do {
puVar22 = puVar19 + (longlong)(puVar21 + (1 - (longlong)puVar20));
puVar19 = puVar19 + 1;
uVar13 = uVar13 - 1;
*puVar19 = *puVar22;
} while (uVar13 != 0);
puVar21 = (undefined1 *)(lVar8 + -1);
puVar20 = puVar19;
if (uVar2 < uVar24) {
uVar24 = uVar24 - uVar2;
uVar12 = uVar2;
do {
puVar20 = puVar21 + 1;
puVar21 = puVar21 + 1;
puVar19 = puVar19 + 1;
uVar12 = uVar12 - 1;
*puVar19 = *puVar20;
} while (uVar12 != 0);
goto LAB_1400bcdf2;
}
}
}
else {
puVar21 = (undefined1 *)(lVar1 + (ulonglong)(uVar2 - uVar12));
if (uVar12 < uVar24) {
uVar24 = uVar24 - uVar12;
do {
puVar20 = puVar21 + 1;
puVar21 = puVar21 + 1;
puVar19 = puVar19 + 1;
uVar12 = uVar12 - 1;
*puVar19 = *puVar20;
} while (uVar12 != 0);
goto LAB_1400bcdf2;
}
}
if (2 < uVar24) {
uVar11 = (ulonglong)((uVar24 - 3) / 3 + 1);
puVar19 = puVar20;
puVar22 = puVar21;
do {
puVar21 = puVar22 + 3;
puVar20 = puVar19 + 3;
puVar19[1] = puVar22[1];
uVar24 = uVar24 - 3;
uVar11 = uVar11 - 1;
puVar19[2] = puVar22[2];
*puVar20 = *puVar21;
puVar19 = puVar20;
puVar22 = puVar21;
} while (uVar11 != 0);
}
puVar19 = puVar20;
if (uVar24 != 0) {
puVar20[1] = puVar21[1];
puVar19 = puVar20 + 1;
if (1 < uVar24) {
puVar20[2] = puVar21[2];
puVar19 = puVar20 + 2;
}
}
LAB_1400bcec7:
if ((pbVar27 <= pbVar15) || (puVar20 = puVar19, puVar18 + ((int)lVar9 - 0x101) <= puVar19))
goto LAB_1400bcf45;
goto LAB_1400bcb70;
}