/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1 * Ghidra 12.1.2 decompiler output for 0x140100cf0 FUN_140100cf0 * Pseudocode, not original source. */ void FUN_140100cf0(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_140100da0: 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_r0x000140100ead; } if ((uVar12 & 0x40) != 0) { if ((uVar12 & 0x20) == 0) { param_1[4] = (longlong)"invalid literal/length code"; *puVar6 = 0x1d; } else { *puVar6 = 0xb; } goto LAB_140101175; } 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_1401010f7; joined_r0x000140100ead: pbVar15 = pbVar16; if ((uVar12 & 0x10) != 0) goto LAB_140100ef2; if ((uVar12 & 0x40) != 0) { param_1[4] = (longlong)"invalid distance code"; *puVar6 = 0x1d; goto LAB_140101175; } 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_r0x000140100ead; LAB_140100ef2: 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_1401010f7; } uVar12 = uVar10 - uVar12; if ((uVar4 < uVar12) && (puVar6[0x6f6] != 0)) { param_1[4] = (longlong)"invalid distance too far back"; *puVar6 = 0x1d; LAB_140101175: 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_140101022: 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_140101022; } } } 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_140101022; } } 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_1401010f7: if ((pbVar27 <= pbVar15) || (puVar20 = puVar19, puVar18 + ((int)lVar9 - 0x101) <= puVar19)) goto LAB_140101175; goto LAB_140100da0; }