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