server-re/decomp/Agent_Release_x64/full/functions/0x1400d8ec4.c
2026-10-14 16:45:19 -04:00

262 lines
7.3 KiB
C

/* Agent_Release_x64.exe sha256 6f2be7b8eb799ba51b359d1958720aac5baee5b7ee0d1d36684d3cbd72d45469
* Ghidra 12.1.2 decompiler output for 0x1400d8ec4 FUN_1400d8ec4
* Pseudocode, not original source. */
void FUN_1400d8ec4(longlong *param_1,int param_2)
{
uint uVar1;
undefined4 uVar2;
uint uVar3;
undefined4 uVar4;
undefined4 *puVar5;
longlong lVar6;
longlong lVar7;
longlong lVar8;
uint uVar9;
uint uVar10;
char *pcVar11;
ulonglong uVar12;
uint uVar13;
uint uVar14;
byte *pbVar15;
byte *pbVar16;
longlong lVar17;
undefined1 *puVar18;
undefined1 *puVar19;
undefined1 *puVar20;
undefined1 *puVar21;
longlong lVar22;
undefined1 *puVar23;
uint uVar24;
int iVar25;
uint uVar26;
byte *pbVar27;
int local_68;
puVar5 = (undefined4 *)param_1[5];
lVar17 = *(longlong *)(puVar5 + 0x16);
lVar6 = *(longlong *)(puVar5 + 0x18);
uVar1 = puVar5[0xd];
uVar14 = puVar5[0x10];
uVar24 = puVar5[0x11];
lVar8 = param_1[3];
puVar18 = (undefined1 *)(param_1[2] + -1);
uVar2 = puVar5[0x1a];
pbVar15 = (byte *)(*param_1 + -1);
local_68 = (int)puVar18 - (param_2 - (int)lVar8);
iVar25 = puVar5[0xb];
uVar3 = puVar5[0xc];
lVar7 = *(longlong *)(puVar5 + 0xe);
pbVar27 = pbVar15 + ((int)param_1[1] - 5);
uVar4 = puVar5[0x1b];
puVar19 = puVar18;
LAB_1400d8f7e:
if (uVar24 < 0xf) {
pbVar16 = pbVar15 + 1;
pbVar15 = pbVar15 + 2;
uVar14 = uVar14 + ((uint)*pbVar16 << ((byte)uVar24 & 0x1f)) +
((uint)*pbVar15 << ((byte)uVar24 + 8 & 0x1f));
uVar24 = uVar24 + 0x10;
}
uVar9 = uVar14 & (1 << ((byte)uVar2 & 0x1f)) - 1U;
while( true ) {
uVar9 = *(uint *)(lVar17 + (ulonglong)uVar9 * 4);
uVar14 = uVar14 >> ((byte)(uVar9 >> 8) & 0x1f);
uVar24 = uVar24 - (uVar9 >> 8 & 0xff);
if ((byte)uVar9 == 0) break;
pbVar16 = pbVar15;
if ((uVar9 & 0x10) != 0) {
uVar26 = uVar9 >> 0x10;
uVar9 = uVar9 & 0xf;
if (uVar9 != 0) {
if (uVar24 < uVar9) {
pbVar15 = pbVar15 + 1;
uVar14 = uVar14 + ((uint)*pbVar15 << ((byte)uVar24 & 0x1f));
uVar24 = uVar24 + 8;
}
uVar10 = (1 << (sbyte)uVar9) - 1U & uVar14;
uVar14 = uVar14 >> (sbyte)uVar9;
uVar26 = uVar26 + uVar10;
uVar24 = uVar24 - uVar9;
pbVar16 = pbVar15;
}
if (uVar24 < 0xf) {
pbVar15 = pbVar16 + 1;
pbVar16 = pbVar16 + 2;
uVar14 = uVar14 + ((uint)*pbVar15 << ((byte)uVar24 & 0x1f)) +
((uint)*pbVar16 << ((byte)uVar24 + 8 & 0x1f));
uVar24 = uVar24 + 0x10;
}
uVar9 = *(uint *)(lVar6 + (ulonglong)((1 << ((byte)uVar4 & 0x1f)) - 1U & uVar14) * 4);
goto LAB_1400d9085;
}
if ((uVar9 & 0x40) != 0) {
if ((uVar9 & 0x20) == 0) {
pcVar11 = "invalid literal/length code";
goto LAB_1400d92b0;
}
*puVar5 = 0xb;
goto LAB_1400d92bc;
}
uVar9 = ((1 << ((byte)uVar9 & 0x1f)) - 1U & uVar14) + (uVar9 >> 0x10);
}
puVar19[1] = (char)(uVar9 >> 0x10);
puVar20 = puVar19 + 1;
goto LAB_1400d9274;
LAB_1400d9085:
uVar14 = uVar14 >> ((byte)(uVar9 >> 8) & 0x1f);
uVar24 = uVar24 - (uVar9 >> 8 & 0xff);
if ((uVar9 & 0x10) != 0) goto code_r0x0001400d90a2;
if ((uVar9 & 0x40) != 0) {
pcVar11 = "invalid distance code";
goto LAB_1400d92b0;
}
uVar9 = *(uint *)(lVar6 + (ulonglong)
(((1 << ((byte)uVar9 & 0x1f)) - 1U & uVar14) + (uVar9 >> 0x10)) * 4);
goto LAB_1400d9085;
code_r0x0001400d90a2:
uVar13 = uVar9 & 0xf;
pbVar15 = pbVar16;
uVar10 = uVar24;
if (uVar24 < uVar13) {
pbVar15 = pbVar16 + 1;
uVar10 = uVar24 + 8;
uVar14 = uVar14 + ((uint)*pbVar15 << ((byte)uVar24 & 0x1f));
if (uVar10 < uVar13) {
pbVar15 = pbVar16 + 2;
uVar14 = uVar14 + ((uint)*pbVar15 << ((byte)uVar10 & 0x1f));
uVar10 = uVar24 + 0x10;
}
}
uVar24 = uVar10 - uVar13;
uVar10 = (1 << (sbyte)uVar13) - 1U & uVar14;
uVar14 = uVar14 >> (sbyte)uVar13;
uVar10 = (uVar9 >> 0x10) + uVar10;
uVar9 = (int)puVar19 - local_68;
if (uVar10 <= uVar9) {
puVar20 = puVar19 + -(ulonglong)uVar10;
do {
puVar23 = puVar19;
puVar21 = puVar20;
puVar19 = puVar23 + 3;
puVar23[1] = puVar21[1];
uVar26 = uVar26 - 3;
puVar23[2] = puVar21[2];
*puVar19 = puVar21[3];
puVar20 = puVar21 + 3;
} while (2 < uVar26);
puVar20 = puVar19;
if (uVar26 != 0) {
puVar23[4] = puVar21[4];
puVar20 = puVar23 + 4;
if (1 < uVar26) {
puVar23[5] = puVar21[5];
puVar20 = puVar23 + 5;
}
}
goto LAB_1400d9274;
}
uVar9 = uVar10 - uVar9;
if (uVar3 < uVar9) {
pcVar11 = "invalid distance too far back";
pbVar16 = pbVar15;
LAB_1400d92b0:
param_1[4] = (longlong)pcVar11;
*puVar5 = 0x1b;
LAB_1400d92bc:
*(int *)(param_1 + 3) = ((int)(puVar18 + ((int)lVar8 - 0x101)) - (int)puVar19) + 0x101;
lVar17 = (longlong)pbVar16 - (ulonglong)(uVar24 >> 3);
iVar25 = uVar24 + (uVar24 >> 3) * -8;
*param_1 = lVar17 + 1;
*(int *)(param_1 + 1) = ((int)pbVar27 - (int)lVar17) + 5;
param_1[2] = (longlong)(puVar19 + 1);
puVar5[0x11] = iVar25;
puVar5[0x10] = (1 << ((byte)iVar25 & 0x1f)) - 1U & uVar14;
return;
}
lVar22 = lVar7 + -1;
if (uVar1 == 0) {
puVar21 = (undefined1 *)(lVar22 + (ulonglong)(iVar25 - uVar9));
if (uVar9 < uVar26) {
uVar26 = uVar26 - uVar9;
do {
puVar21 = puVar21 + 1;
puVar19 = puVar19 + 1;
uVar9 = uVar9 - 1;
*puVar19 = *puVar21;
} while (uVar9 != 0);
LAB_1400d91ac:
puVar21 = puVar19 + -(ulonglong)uVar10;
}
}
else if (uVar1 < uVar9) {
uVar13 = uVar9 - uVar1;
puVar21 = (undefined1 *)(lVar22 + (ulonglong)((uVar1 - uVar9) + iVar25));
if (uVar13 < uVar26) {
uVar26 = uVar26 - uVar13;
lVar22 = (longlong)puVar21 - (longlong)puVar19;
do {
puVar19 = puVar19 + 1;
uVar13 = uVar13 - 1;
*puVar19 = puVar19[lVar22];
} while (uVar13 != 0);
puVar21 = (undefined1 *)(lVar7 + -1);
if (uVar1 < uVar26) {
uVar26 = uVar26 - uVar1;
uVar9 = uVar1;
do {
puVar21 = puVar21 + 1;
puVar19 = puVar19 + 1;
uVar9 = uVar9 - 1;
*puVar19 = *puVar21;
} while (uVar9 != 0);
goto LAB_1400d91ac;
}
}
}
else {
puVar21 = (undefined1 *)(lVar22 + (ulonglong)(uVar1 - uVar9));
if (uVar9 < uVar26) {
uVar26 = uVar26 - uVar9;
do {
puVar21 = puVar21 + 1;
puVar19 = puVar19 + 1;
uVar9 = uVar9 - 1;
*puVar19 = *puVar21;
} while (uVar9 != 0);
goto LAB_1400d91ac;
}
}
if (2 < uVar26) {
uVar12 = (ulonglong)((uVar26 - 3) / 3 + 1);
puVar20 = puVar19;
puVar23 = puVar21;
do {
puVar21 = puVar23 + 3;
puVar19 = puVar20 + 3;
puVar20[1] = puVar23[1];
uVar26 = uVar26 - 3;
uVar12 = uVar12 - 1;
puVar20[2] = puVar23[2];
*puVar19 = *puVar21;
puVar20 = puVar19;
puVar23 = puVar21;
} while (uVar12 != 0);
}
puVar20 = puVar19;
if (uVar26 != 0) {
puVar19[1] = puVar21[1];
puVar20 = puVar19 + 1;
if (1 < uVar26) {
puVar19[2] = puVar21[2];
puVar20 = puVar19 + 2;
}
}
LAB_1400d9274:
pbVar16 = pbVar15;
puVar19 = puVar20;
if ((pbVar27 <= pbVar15) || (puVar18 + ((int)lVar8 - 0x101) <= puVar20)) goto LAB_1400d92bc;
goto LAB_1400d8f7e;
}