/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x1401c4220 FUN_1401c4220 * Pseudocode, not original source. */ int FUN_1401c4220(longlong *param_1,int param_2) { byte bVar1; uint *puVar2; uint uVar3; char cVar4; int iVar5; int iVar6; uint uVar7; uint uVar8; byte bVar9; ushort uVar10; uint uVar11; uint uVar12; uint uVar13; longlong lVar14; uint uVar15; uint uVar16; byte *pbVar17; ulonglong uVar18; undefined1 *puVar19; undefined1 *puVar20; byte *_Src; uint uVar21; ulonglong uVar22; int local_res18; uint local_res20; undefined2 local_68; undefined1 local_66; undefined1 local_65; undefined4 local_64; uint local_60; uint local_5c; undefined1 *local_58; if ((((param_1 == (longlong *)0x0) || (puVar2 = (uint *)param_1[5], puVar2 == (uint *)0x0)) || (param_1[2] == 0)) || ((*param_1 == 0 && ((int)param_1[1] != 0)))) { return -2; } uVar16 = *puVar2; uVar7 = puVar2[0x11]; uVar8 = puVar2[0x10]; if (uVar16 == 0xb) { uVar16 = 0xc; } *puVar2 = uVar16; uVar11 = *(uint *)(param_1 + 3); puVar19 = (undefined1 *)param_1[2]; uVar15 = *(uint *)(param_1 + 1); _Src = (byte *)*param_1; local_res18 = 0; local_res20 = uVar11; local_60 = uVar11; local_58 = puVar19; local_5c = uVar15; do { if (0x1e < uVar16) { return -2; } uVar22 = 0; uVar21 = 0; uVar13 = uVar15; uVar12 = local_64; switch(uVar16) { case 0: if (puVar2[2] == 0) { *puVar2 = 0xc; } else { for (; uVar7 < 0x10; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } if (((puVar2[2] & 2) == 0) || (uVar8 != 0x8b1f)) { puVar2[4] = 0; if (*(longlong *)(puVar2 + 8) != 0) { *(undefined4 *)(*(longlong *)(puVar2 + 8) + 0x40) = 0xffffffff; } if (((puVar2[2] & 1) == 0) || (uVar16 = (uVar8 & 0xff) * 0x100 + (uVar8 >> 8), uVar16 != (uVar16 / 0x1f) * 0x1f)) { param_1[4] = (longlong)"incorrect header check"; *puVar2 = 0x1d; } else { if (((byte)uVar8 & 0xf) != 8) goto LAB_1401c43bf; uVar7 = uVar7 - 4; uVar16 = (uVar8 >> 4 & 0xf) + 8; if (puVar2[10] == 0) { puVar2[10] = uVar16; } else if (puVar2[10] < uVar16) { param_1[4] = (longlong)"invalid window size"; *puVar2 = 0x1d; uVar8 = uVar8 >> 4; break; } puVar2[5] = 1 << (sbyte)uVar16; uVar16 = FUN_1401e5880(0,0,0); puVar2[6] = uVar16; *(uint *)((longlong)param_1 + 0x4c) = uVar16; uVar7 = 0; *puVar2 = ~(uVar8 >> 0xc) & 2 | 9; uVar8 = 0; puVar19 = local_58; uVar11 = local_res20; } } else { uVar16 = FUN_1401c4210(0,0,0); puVar2[6] = uVar16; local_68 = 0x8b1f; uVar16 = FUN_1401c3ef0(uVar16,&local_68,2); uVar8 = 0; uVar7 = 0; puVar2[6] = uVar16; *puVar2 = 1; puVar19 = local_58; uVar11 = local_res20; } } break; case 1: for (; uVar7 < 0x10; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } puVar2[4] = uVar8; if ((char)uVar8 == '\b') { if ((uVar8 & 0xe000) == 0) { if (*(uint **)(puVar2 + 8) != (uint *)0x0) { **(uint **)(puVar2 + 8) = uVar8 >> 8 & 1; } if ((puVar2[4] & 0x200) != 0) { local_68 = (undefined2)uVar8; uVar16 = FUN_1401c3ef0(puVar2[6],&local_68); puVar2[6] = uVar16; } *puVar2 = 2; uVar7 = uVar21; uVar8 = uVar21; do { uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar16 = uVar7 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); joined_r0x0001401c4506: uVar7 = uVar16; } while (uVar16 < 0x20); if (*(longlong *)(puVar2 + 8) != 0) { *(uint *)(*(longlong *)(puVar2 + 8) + 4) = uVar8; } if ((puVar2[4] & 0x200) != 0) { local_68 = (undefined2)uVar8; local_65 = (undefined1)(uVar8 >> 0x18); local_66 = (undefined1)(uVar8 >> 0x10); uVar16 = FUN_1401c3ef0(puVar2[6],&local_68); puVar2[6] = uVar16; } *puVar2 = 3; uVar7 = uVar21; uVar8 = uVar21; do { uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar16 = uVar7 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); joined_r0x0001401c4587: uVar7 = uVar16; } while (uVar16 < 0x10); if (*(longlong *)(puVar2 + 8) != 0) { *(uint *)(*(longlong *)(puVar2 + 8) + 8) = uVar8 & 0xff; *(uint *)(*(longlong *)(puVar2 + 8) + 0xc) = uVar8 >> 8; } if ((puVar2[4] & 0x200) != 0) { local_68 = (undefined2)uVar8; uVar16 = FUN_1401c3ef0(puVar2[6],&local_68); puVar2[6] = uVar16; } *puVar2 = 4; uVar7 = uVar21; uVar8 = uVar21; goto switchD_1401c42e1_caseD_4; } param_1[4] = (longlong)"unknown header flags set"; *puVar2 = 0x1d; } else { LAB_1401c43bf: param_1[4] = (longlong)"unknown compression method"; *puVar2 = 0x1d; } break; case 2: uVar16 = uVar7; goto joined_r0x0001401c4506; case 3: uVar16 = uVar7; goto joined_r0x0001401c4587; case 4: switchD_1401c42e1_caseD_4: if ((puVar2[4] & 0x400) == 0) { uVar16 = uVar8; if (*(longlong *)(puVar2 + 8) != 0) { *(undefined8 *)(*(longlong *)(puVar2 + 8) + 0x10) = 0; } } else { for (; uVar7 < 0x10; uVar7 = uVar7 + 8) { uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } puVar2[0x12] = uVar8; if (*(longlong *)(puVar2 + 8) != 0) { *(uint *)(*(longlong *)(puVar2 + 8) + 0x18) = uVar8; } uVar7 = uVar21; uVar16 = uVar21; if ((puVar2[4] & 0x200) != 0) { local_68 = (undefined2)uVar8; uVar8 = FUN_1401c3ef0(puVar2[6],&local_68); puVar2[6] = uVar8; } } uVar8 = uVar16; *puVar2 = 5; case 5: if ((puVar2[4] & 0x400) == 0) { LAB_1401c4723: puVar2[0x12] = 0; *puVar2 = 6; switchD_1401c42e1_caseD_6: if ((puVar2[4] & 0x800) == 0) { if (*(longlong *)(puVar2 + 8) != 0) { *(undefined8 *)(*(longlong *)(puVar2 + 8) + 0x20) = 0; } LAB_1401c47ce: puVar2[0x12] = 0; *puVar2 = 7; switchD_1401c42e1_caseD_7: uVar22 = 0; if ((puVar2[4] & 0x1000) == 0) { if (*(longlong *)(puVar2 + 8) != 0) { *(undefined8 *)(*(longlong *)(puVar2 + 8) + 0x30) = 0; } LAB_1401c486e: *puVar2 = 8; puVar19 = local_58; uVar11 = local_res20; switchD_1401c42e1_caseD_8: if ((puVar2[4] & 0x200) != 0) { for (; uVar7 < 0x10; uVar7 = uVar7 + 8) { uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } if (uVar8 != (ushort)puVar2[6]) { param_1[4] = (longlong)"header crc mismatch"; *puVar2 = 0x1d; break; } uVar7 = 0; uVar8 = uVar7; } if (*(longlong *)(puVar2 + 8) != 0) { *(uint *)(*(longlong *)(puVar2 + 8) + 0x3c) = (int)puVar2[4] >> 9 & 1; *(undefined4 *)(*(longlong *)(puVar2 + 8) + 0x40) = 1; } uVar16 = FUN_1401c4210(0,0,0); puVar2[6] = uVar16; *(uint *)((longlong)param_1 + 0x4c) = uVar16; LAB_1401c4909: *puVar2 = 0xb; puVar19 = local_58; uVar11 = local_res20; break; } pbVar17 = _Src; uVar13 = uVar15; uVar12 = local_64; if (uVar15 != 0) { do { lVar14 = *(longlong *)(puVar2 + 8); bVar1 = *pbVar17; uVar16 = (int)uVar22 + 1; uVar22 = (ulonglong)uVar16; if (((lVar14 != 0) && (*(longlong *)(lVar14 + 0x30) != 0)) && (puVar2[0x12] < *(uint *)(lVar14 + 0x38))) { *(byte *)((ulonglong)puVar2[0x12] + *(longlong *)(lVar14 + 0x30)) = bVar1; puVar2[0x12] = puVar2[0x12] + 1; } } while ((bVar1 != 0) && (pbVar17 = pbVar17 + 1, uVar16 < uVar15)); if ((puVar2[4] & 0x200) != 0) { if (_Src == (byte *)0x0) { uVar11 = 0; } else { uVar11 = FUN_1401c3ef0(puVar2[6],_Src); } puVar2[6] = uVar11; } uVar15 = uVar15 - uVar16; _Src = _Src + uVar22; uVar13 = uVar15; uVar12 = local_64; if (bVar1 == 0) goto LAB_1401c486e; } } else { pbVar17 = _Src; uVar13 = uVar15; uVar12 = local_64; if (uVar15 != 0) { do { lVar14 = *(longlong *)(puVar2 + 8); bVar1 = *pbVar17; uVar13 = (int)uVar22 + 1; uVar22 = (ulonglong)uVar13; if (((lVar14 != 0) && (*(longlong *)(lVar14 + 0x20) != 0)) && (puVar2[0x12] < *(uint *)(lVar14 + 0x28))) { *(byte *)((ulonglong)puVar2[0x12] + *(longlong *)(lVar14 + 0x20)) = bVar1; puVar2[0x12] = puVar2[0x12] + 1; } } while ((bVar1 != 0) && (pbVar17 = pbVar17 + 1, uVar13 < uVar15)); if ((puVar2[4] & 0x200) != 0) { if (_Src == (byte *)0x0) { uVar16 = 0; } else { uVar16 = FUN_1401c3ef0(puVar2[6],_Src); } puVar2[6] = uVar16; } uVar13 = uVar15 - uVar13; _Src = _Src + uVar22; uVar15 = uVar13; uVar12 = local_64; if (bVar1 == 0) goto LAB_1401c47ce; } } } else { uVar16 = puVar2[0x12]; uVar11 = uVar16; if (uVar15 < uVar16) { uVar11 = uVar15; } uVar13 = uVar15; if (uVar11 != 0) { lVar14 = *(longlong *)(puVar2 + 8); if ((lVar14 != 0) && (*(longlong *)(lVar14 + 0x10) != 0)) { uVar16 = *(int *)(lVar14 + 0x18) - uVar16; uVar12 = uVar11; if (*(uint *)(lVar14 + 0x1c) < uVar11 + uVar16) { uVar12 = *(uint *)(lVar14 + 0x1c) - uVar16; } memcpy((void *)((ulonglong)uVar16 + *(longlong *)(lVar14 + 0x10)),_Src,(ulonglong)uVar12 ); } if ((puVar2[4] & 0x200) != 0) { if (_Src != (byte *)0x0) { uVar21 = FUN_1401c3ef0(puVar2[6],_Src); } puVar2[6] = uVar21; } uVar13 = uVar15 - uVar11; _Src = _Src + uVar11; puVar2[0x12] = puVar2[0x12] - uVar11; } uVar15 = uVar13; uVar12 = local_64; if (puVar2[0x12] == 0) goto LAB_1401c4723; } LAB_1401c4abe: local_64 = uVar12; uVar16 = local_60; param_1[2] = (longlong)local_58; *param_1 = (longlong)_Src; *(uint *)(param_1 + 3) = local_res20; *(uint *)(param_1 + 1) = uVar13; puVar2[0x11] = uVar7; puVar2[0x10] = uVar8; if (((puVar2[0xb] == 0) && ((0x19 < (int)*puVar2 || (local_60 == *(uint *)(param_1 + 3))))) || (iVar5 = FUN_1401c3d90(param_1,local_60), iVar5 == 0)) { uVar16 = uVar16 - (int)param_1[3]; local_5c = local_5c - (int)param_1[1]; *(int *)((longlong)param_1 + 0x1c) = *(int *)((longlong)param_1 + 0x1c) + uVar16; *(int *)((longlong)param_1 + 0xc) = *(int *)((longlong)param_1 + 0xc) + local_5c; puVar2[7] = puVar2[7] + uVar16; if ((puVar2[2] != 0) && (uVar16 != 0)) { if (puVar2[4] == 0) { uVar8 = FUN_1401e5880(puVar2[6],param_1[2] - (ulonglong)uVar16); } else if (param_1[2] == (ulonglong)uVar16) { uVar8 = 0; } else { uVar8 = FUN_1401c3ef0(); } puVar2[6] = uVar8; *(uint *)((longlong)param_1 + 0x4c) = uVar8; } uVar8 = *puVar2; if ((uVar8 == 0x13) || (uVar8 == 0xe)) { iVar5 = 0x100; } else { iVar5 = 0; } iVar6 = 0; if (uVar8 == 0xb) { iVar6 = 0x80; } *(uint *)(param_1 + 9) = iVar6 + iVar5 + (-(uint)(puVar2[1] != 0) & 0x40) + puVar2[0x11]; if (((local_5c != 0) || (uVar16 != 0)) && (param_2 != 4)) { return local_res18; } if (local_res18 != 0) { return local_res18; } return -5; } *puVar2 = 0x1e; LAB_1401c4b19: return -4; case 6: goto switchD_1401c42e1_caseD_6; case 7: goto switchD_1401c42e1_caseD_7; case 8: goto switchD_1401c42e1_caseD_8; case 9: for (; uVar7 < 0x20; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } uVar16 = (uVar8 >> 8 & 0xff00) + ((uVar8 & 0xff00) + uVar8 * 0x10000) * 0x100 + (uVar8 >> 0x18); puVar2[6] = uVar16; *(uint *)((longlong)param_1 + 0x4c) = uVar16; *puVar2 = 10; uVar7 = uVar21; uVar8 = uVar21; case 10: if (puVar2[3] == 0) { param_1[2] = (longlong)puVar19; *(uint *)(param_1 + 3) = uVar11; *param_1 = (longlong)_Src; *(uint *)(param_1 + 1) = uVar15; puVar2[0x10] = uVar8; puVar2[0x11] = uVar7; return 2; } uVar16 = FUN_1401e5880(0,0); puVar2[6] = uVar16; *(uint *)((longlong)param_1 + 0x4c) = uVar16; *puVar2 = 0xb; puVar19 = local_58; uVar11 = local_res20; switchD_1401c42e1_caseD_b: uVar13 = uVar15; uVar12 = local_64; if ((param_2 != 5) && (param_2 != 6)) { switchD_1401c42e1_caseD_c: if (puVar2[1] == 0) { for (; uVar12 = local_64, uVar7 < 3; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } puVar2[1] = uVar8 & 1; uVar16 = uVar8 >> 1 & 3; if (uVar16 == 0) { *puVar2 = 0xd; } else { if (uVar16 != 1) { if (uVar16 == 2) { *puVar2 = 0x10; uVar7 = uVar7 - 3; uVar8 = uVar8 >> 3; } else { if (uVar16 != 3) goto LAB_1401c4b45; uVar7 = uVar7 - 3; param_1[4] = (longlong)"invalid block type"; *puVar2 = 0x1d; uVar8 = uVar8 >> 3; } break; } puVar2[0x1a] = 9; puVar2[0x1b] = 5; *(undefined **)(puVar2 + 0x16) = &DAT_14028a700; *puVar2 = 0x13; *(undefined **)(puVar2 + 0x18) = &DAT_14028af00; if (param_2 == 6) { uVar8 = uVar8 >> 3; uVar7 = uVar7 - 3; uVar13 = uVar15; goto LAB_1401c4abe; } } LAB_1401c4b45: uVar7 = uVar7 - 3; uVar8 = uVar8 >> 3; } else { *puVar2 = 0x1a; uVar16 = uVar7 & 7; uVar7 = uVar7 - uVar16; uVar8 = uVar8 >> (sbyte)uVar16; } break; } goto LAB_1401c4abe; case 0xb: goto switchD_1401c42e1_caseD_b; case 0xc: goto switchD_1401c42e1_caseD_c; case 0xd: uVar8 = uVar8 >> (sbyte)(uVar7 & 7); for (uVar7 = uVar7 - (uVar7 & 7); uVar7 < 0x20; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } if ((uVar8 & 0xffff) == ~uVar8 >> 0x10) { puVar2[0x12] = uVar8 & 0xffff; *puVar2 = 0xe; uVar7 = uVar21; uVar8 = uVar21; uVar13 = uVar15; if (param_2 != 6) goto switchD_1401c42e1_caseD_e; goto LAB_1401c4abe; } param_1[4] = (longlong)"invalid stored block lengths"; *puVar2 = 0x1d; break; case 0xe: switchD_1401c42e1_caseD_e: *puVar2 = 0xf; case 0xf: uVar16 = puVar2[0x12]; if (uVar16 == 0) { *puVar2 = 0xb; break; } if (uVar15 < uVar16) { uVar16 = uVar15; } if (uVar11 < uVar16) { uVar16 = uVar11; } uVar22 = (ulonglong)uVar16; uVar13 = uVar15; if (uVar16 != 0) { memcpy(puVar19,_Src,uVar22); local_res20 = local_res20 - uVar16; _Src = _Src + uVar22; local_58 = local_58 + uVar22; uVar15 = uVar15 - uVar16; puVar2[0x12] = puVar2[0x12] - uVar16; puVar19 = local_58; uVar11 = local_res20; break; } goto LAB_1401c4abe; case 0x10: for (; uVar7 < 0xe; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } uVar7 = uVar7 - 0xe; uVar21 = uVar8 >> 10; uVar16 = (uVar8 & 0x1f) + 0x101; uVar13 = (uVar8 >> 5 & 0x1f) + 1; uVar8 = uVar8 >> 0xe; puVar2[0x1d] = uVar16; puVar2[0x1e] = uVar13; puVar2[0x1c] = (uVar21 & 0xf) + 4; if ((uVar16 < 0x11f) && (uVar13 < 0x1f)) { puVar2[0x1f] = 0; *puVar2 = 0x11; goto switchD_1401c42e1_caseD_11; } param_1[4] = (longlong)"too many length or distance symbols"; *puVar2 = 0x1d; break; case 0x11: switchD_1401c42e1_caseD_11: if (puVar2[0x1f] < puVar2[0x1c]) { do { for (; uVar7 < 3; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } uVar7 = uVar7 - 3; uVar10 = (ushort)uVar8; uVar8 = uVar8 >> 3; *(ushort *) ((longlong)puVar2 + (ulonglong)*(ushort *)(&DAT_14028af80 + (ulonglong)puVar2[0x1f] * 2) * 2 + 0x88) = uVar10 & 7; puVar2[0x1f] = puVar2[0x1f] + 1; } while (puVar2[0x1f] < puVar2[0x1c]); } uVar16 = puVar2[0x1f]; while (uVar16 < 0x13) { *(undefined2 *) ((longlong)puVar2 + (ulonglong)*(ushort *)(&DAT_14028af80 + (ulonglong)puVar2[0x1f] * 2) * 2 + 0x88) = 0; puVar2[0x1f] = puVar2[0x1f] + 1; uVar16 = puVar2[0x1f]; } *(uint **)(puVar2 + 0x20) = puVar2 + 0x152; *(uint **)(puVar2 + 0x16) = puVar2 + 0x152; puVar2[0x1a] = 7; local_res18 = FUN_1401e97b0(0,puVar2 + 0x22,0x13,puVar2 + 0x20,puVar2 + 0x1a,puVar2 + 0xc2); if (local_res18 == 0) { puVar2[0x1f] = 0; *puVar2 = 0x12; uVar11 = local_res20; goto switchD_1401c42e1_caseD_12; } param_1[4] = (longlong)"invalid code lengths set"; *puVar2 = 0x1d; puVar19 = local_58; uVar11 = local_res20; break; case 0x12: switchD_1401c42e1_caseD_12: puVar19 = local_58; if (puVar2[0x1f] < puVar2[0x1e] + puVar2[0x1d]) { do { uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) + (ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4); uVar16 = uVar7; local_64 = uVar12; if (uVar7 < (uVar12 >> 8 & 0xff)) { do { uVar7 = uVar16; uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; uVar7 = uVar16 + 8; uVar15 = uVar15 - 1; uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar16 & 0x1f)); _Src = _Src + 1; uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) + (ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4); uVar16 = uVar7; local_64 = uVar12; } while (uVar7 < (uVar12 >> 8 & 0xff)); } uVar10 = (ushort)(uVar12 >> 0x10); local_64._1_1_ = (byte)(uVar12 >> 8); local_64 = uVar12; if (0xf < uVar10) { if (uVar10 == 0x10) { for (; uVar7 < local_64._1_1_ + 2; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } uVar7 = uVar7 - local_64._1_1_; uVar8 = uVar8 >> (local_64._1_1_ & 0x1f); if (puVar2[0x1f] != 0) { iVar5 = (uVar8 & 3) + 3; uVar7 = uVar7 - 2; uVar18 = (ulonglong) *(ushort *)((longlong)puVar2 + (ulonglong)(puVar2[0x1f] - 1) * 2 + 0x88); uVar8 = uVar8 >> 2; goto LAB_1401c4fc0; } } else { if (uVar10 == 0x11) { for (; uVar7 < local_64._1_1_ + 3; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } iVar6 = -3; uVar8 = uVar8 >> (local_64._1_1_ & 0x1f); iVar5 = (uVar8 & 7) + 3; uVar8 = uVar8 >> 3; } else { for (; uVar7 < local_64._1_1_ + 7; uVar7 = uVar7 + 8) { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); } iVar6 = -7; uVar8 = uVar8 >> (local_64._1_1_ & 0x1f); iVar5 = (uVar8 & 0x7f) + 0xb; uVar8 = uVar8 >> 7; } uVar7 = uVar7 + (iVar6 - (uint)local_64._1_1_); uVar18 = uVar22; LAB_1401c4fc0: if (iVar5 + puVar2[0x1f] <= puVar2[0x1e] + puVar2[0x1d]) { for (; iVar5 != 0; iVar5 = iVar5 + -1) { *(short *)((longlong)puVar2 + (ulonglong)puVar2[0x1f] * 2 + 0x88) = (short)uVar18; puVar2[0x1f] = puVar2[0x1f] + 1; } goto LAB_1401c4ff5; } } param_1[4] = (longlong)"invalid bit length repeat"; *puVar2 = 0x1d; goto LAB_1401c4918; } uVar16 = uVar7; if (uVar7 < (uVar12 >> 8 & 0xff)) { do { uVar7 = uVar16; uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar7 = uVar16 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar16 & 0x1f)); uVar16 = uVar7; } while (uVar7 < local_64._1_1_); } uVar8 = uVar8 >> (local_64._1_1_ & 0x1f); uVar7 = uVar7 - local_64._1_1_; *(ushort *)((longlong)puVar2 + (ulonglong)puVar2[0x1f] * 2 + 0x88) = uVar10; puVar2[0x1f] = puVar2[0x1f] + 1; LAB_1401c4ff5: } while (puVar2[0x1f] < puVar2[0x1e] + puVar2[0x1d]); } if (*puVar2 != 0x1d) { if ((short)puVar2[0xa2] == 0) { param_1[4] = (longlong)"invalid code -- missing end-of-block"; *puVar2 = 0x1d; } else { *(uint **)(puVar2 + 0x20) = puVar2 + 0x152; *(uint **)(puVar2 + 0x16) = puVar2 + 0x152; puVar2[0x1a] = 9; local_res18 = FUN_1401e97b0(1,puVar2 + 0x22,puVar2[0x1d],puVar2 + 0x20,puVar2 + 0x1a, puVar2 + 0xc2); if (local_res18 == 0) { *(undefined8 *)(puVar2 + 0x18) = *(undefined8 *)(puVar2 + 0x20); puVar2[0x1b] = 6; local_res18 = FUN_1401e97b0(2,(longlong)puVar2 + (ulonglong)puVar2[0x1d] * 2 + 0x88, puVar2[0x1e],puVar2 + 0x20,puVar2 + 0x1b,puVar2 + 0xc2); puVar19 = local_58; if (local_res18 == 0) { *puVar2 = 0x13; uVar11 = local_res20; uVar13 = uVar15; uVar12 = local_64; if (param_2 != 6) goto switchD_1401c42e1_caseD_13; goto LAB_1401c4abe; } param_1[4] = (longlong)"invalid distances set"; *puVar2 = 0x1d; uVar11 = local_res20; } else { param_1[4] = (longlong)"invalid literal/lengths set"; *puVar2 = 0x1d; puVar19 = local_58; uVar11 = local_res20; } } } break; case 0x13: switchD_1401c42e1_caseD_13: *puVar2 = 0x14; case 0x14: if ((5 < uVar15) && (0x101 < uVar11)) { param_1[2] = (longlong)puVar19; *(uint *)(param_1 + 3) = uVar11; *param_1 = (longlong)_Src; *(uint *)(param_1 + 1) = uVar15; puVar2[0x10] = uVar8; puVar2[0x11] = uVar7; FUN_1401e7fd0(param_1,local_60); local_58 = (undefined1 *)param_1[2]; local_res20 = *(uint *)(param_1 + 3); _Src = (byte *)*param_1; uVar15 = *(uint *)(param_1 + 1); uVar7 = puVar2[0x11]; puVar19 = local_58; uVar8 = puVar2[0x10]; uVar11 = local_res20; if (*puVar2 == 0xb) { puVar2[0x6f7] = 0xffffffff; } break; } puVar2[0x6f7] = 0; uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) + (ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4); uVar16 = uVar7; if (uVar7 < (uVar12 >> 8 & 0xff)) { do { uVar7 = uVar16; uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; uVar7 = uVar16 + 8; uVar15 = uVar15 - 1; uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar16 & 0x1f)); _Src = _Src + 1; uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x16) + (ulonglong)((1 << ((byte)puVar2[0x1a] & 0x1f)) - 1U & uVar8) * 4); uVar16 = uVar7; } while (uVar7 < (uVar12 >> 8 & 0xff)); } cVar4 = (char)uVar12; uVar16 = uVar12; if ((cVar4 != '\0') && ((uVar12 & 0xf0) == 0)) { bVar1 = (byte)(uVar12 >> 8); uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x16) + (ulonglong) ((((1 << (cVar4 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) + (uVar12 >> 0x10)) * 4); if (uVar7 < (uVar16 >> 8 & 0xff) + (uVar12 >> 8 & 0xff)) { do { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar7 & 0x1f)); uVar7 = uVar7 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x16) + (ulonglong) ((((1 << (cVar4 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) + (uVar12 >> 0x10)) * 4); } while (uVar7 < (uVar16 >> 8 & 0xff) + (uint)bVar1); } uVar8 = uVar8 >> (bVar1 & 0x1f); uVar7 = uVar7 - bVar1; puVar2[0x6f7] = (uint)bVar1; local_64 = uVar12; } uVar11 = uVar16 >> 8 & 0xff; puVar2[0x6f7] = puVar2[0x6f7] + uVar11; uVar8 = uVar8 >> ((byte)(uVar16 >> 8) & 0x1f); uVar7 = uVar7 - uVar11; puVar2[0x12] = uVar16 >> 0x10; puVar19 = local_58; if ((char)uVar16 == '\0') { *puVar2 = 0x19; uVar11 = local_res20; break; } if ((uVar16 & 0x20) != 0) { puVar2[0x6f7] = 0xffffffff; goto LAB_1401c4909; } if ((uVar16 & 0x40) != 0) { param_1[4] = (longlong)"invalid literal/length code"; *puVar2 = 0x1d; uVar11 = local_res20; break; } *puVar2 = 0x15; puVar2[0x14] = uVar16 & 0xf; switchD_1401c42e1_caseD_15: uVar16 = puVar2[0x14]; if (uVar16 != 0) { uVar11 = uVar7; if (uVar7 < uVar16) { do { uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar11 = uVar7 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar7 & 0x1f)); uVar7 = uVar11; } while (uVar11 < puVar2[0x14]); } uVar7 = uVar11 - uVar16; uVar11 = (1 << ((byte)uVar16 & 0x1f)) - 1U & uVar8; uVar8 = uVar8 >> ((byte)uVar16 & 0x1f); puVar2[0x12] = puVar2[0x12] + uVar11; puVar2[0x6f7] = puVar2[0x6f7] + uVar16; } *puVar2 = 0x16; puVar2[0x6f8] = puVar2[0x12]; switchD_1401c42e1_caseD_16: uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x18) + (ulonglong)((1 << ((byte)puVar2[0x1b] & 0x1f)) - 1U & uVar8) * 4); uVar16 = uVar7; if (uVar7 < (uVar12 >> 8 & 0xff)) { do { uVar7 = uVar16; uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; uVar7 = uVar16 + 8; uVar15 = uVar15 - 1; uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar16 & 0x1f)); _Src = _Src + 1; uVar12 = *(uint *)(*(longlong *)(puVar2 + 0x18) + (ulonglong)((1 << ((byte)puVar2[0x1b] & 0x1f)) - 1U & uVar8) * 4); uVar16 = uVar7; } while (uVar7 < (uVar12 >> 8 & 0xff)); } uVar16 = uVar12; if ((uVar12 & 0xf0) == 0) { bVar1 = (byte)(uVar12 >> 8); uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x18) + (ulonglong) ((((1 << ((char)uVar12 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) + (uVar12 >> 0x10)) * 4); if (uVar7 < (uVar16 >> 8 & 0xff) + (uVar12 >> 8 & 0xff)) { do { uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; uVar8 = uVar8 + ((uint)*_Src << ((byte)uVar7 & 0x1f)); uVar7 = uVar7 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar16 = *(uint *)(*(longlong *)(puVar2 + 0x18) + (ulonglong) ((((1 << ((char)uVar12 + bVar1 & 0x1f)) - 1U & uVar8) >> (bVar1 & 0x1f)) + (uVar12 >> 0x10)) * 4); } while (uVar7 < (uVar16 >> 8 & 0xff) + (uint)bVar1); } uVar8 = uVar8 >> (bVar1 & 0x1f); uVar7 = uVar7 - bVar1; puVar2[0x6f7] = puVar2[0x6f7] + (uint)bVar1; local_64 = uVar12; } uVar11 = uVar16 >> 8 & 0xff; puVar2[0x6f7] = puVar2[0x6f7] + uVar11; uVar8 = uVar8 >> ((byte)(uVar16 >> 8) & 0x1f); uVar7 = uVar7 - uVar11; puVar19 = local_58; if ((uVar16 & 0x40) != 0) { param_1[4] = (longlong)"invalid distance code"; *puVar2 = 0x1d; uVar11 = local_res20; break; } *puVar2 = 0x17; puVar2[0x13] = uVar16 >> 0x10; puVar2[0x14] = uVar16 & 0xf; uVar11 = local_res20; switchD_1401c42e1_caseD_17: uVar16 = puVar2[0x14]; if (uVar16 != 0) { uVar21 = uVar7; if (uVar7 < uVar16) { do { uVar7 = uVar21; uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; uVar7 = uVar21 + 8; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar8 = uVar8 + ((uint)bVar1 << ((byte)uVar21 & 0x1f)); uVar21 = uVar7; } while (uVar7 < puVar2[0x14]); } uVar7 = uVar7 - uVar16; uVar12 = (1 << ((byte)uVar16 & 0x1f)) - 1U & uVar8; uVar8 = uVar8 >> ((byte)uVar16 & 0x1f); puVar2[0x13] = puVar2[0x13] + uVar12; puVar2[0x6f7] = puVar2[0x6f7] + uVar16; } *puVar2 = 0x18; switchD_1401c42e1_caseD_18: uVar13 = uVar15; uVar12 = local_64; if (uVar11 != 0) { uVar16 = puVar2[0x13]; if (local_60 - uVar11 < uVar16) { uVar16 = uVar16 - (local_60 - uVar11); if ((puVar2[0xc] < uVar16) && (puVar2[0x6f6] != 0)) { param_1[4] = (longlong)"invalid distance too far back"; *puVar2 = 0x1d; break; } uVar13 = puVar2[0xd]; if (uVar13 < uVar16) { uVar16 = uVar16 - uVar13; uVar13 = puVar2[0xb] - uVar16; } else { uVar13 = uVar13 - uVar16; } uVar12 = puVar2[0x12]; lVar14 = (ulonglong)uVar13 + *(longlong *)(puVar2 + 0xe); if (uVar12 < uVar16) goto LAB_1401c5615; } else { lVar14 = (longlong)puVar19 - (ulonglong)uVar16; uVar12 = puVar2[0x12]; LAB_1401c5615: uVar16 = uVar12; uVar12 = uVar16; } if (uVar11 < uVar16) { uVar16 = uVar11; } local_res20 = uVar11 - uVar16; puVar2[0x12] = uVar12 - uVar16; puVar20 = puVar19; do { local_58 = puVar20 + 1; uVar16 = uVar16 - 1; *puVar20 = puVar20[lVar14 - (longlong)puVar19]; puVar20 = local_58; } while (uVar16 != 0); puVar19 = local_58; uVar11 = local_res20; if (puVar2[0x12] == 0) { *puVar2 = 0x14; } break; } goto LAB_1401c4abe; case 0x15: goto switchD_1401c42e1_caseD_15; case 0x16: goto switchD_1401c42e1_caseD_16; case 0x17: goto switchD_1401c42e1_caseD_17; case 0x18: goto switchD_1401c42e1_caseD_18; case 0x19: if (uVar11 == 0) goto LAB_1401c4abe; local_58 = puVar19 + 1; local_res20 = uVar11 - 1; *puVar19 = (char)puVar2[0x12]; *puVar2 = 0x14; puVar19 = local_58; uVar11 = local_res20; break; case 0x1a: uVar16 = uVar7; uVar3 = uVar8; if (puVar2[2] != 0) { for (; uVar16 < 0x20; uVar16 = uVar16 + 8) { uVar7 = uVar16; uVar8 = uVar3; uVar13 = 0; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; bVar9 = (byte)uVar16; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar3 = uVar3 + ((uint)bVar1 << (bVar9 & 0x1f)); } uVar8 = local_60 - uVar11; *(int *)((longlong)param_1 + 0x1c) = *(int *)((longlong)param_1 + 0x1c) + uVar8; puVar2[7] = puVar2[7] + uVar8; if (uVar8 != 0) { if (puVar2[4] == 0) { uVar7 = FUN_1401e5880(puVar2[6],(longlong)puVar19 - (longlong)(ulonglong)uVar8); puVar19 = local_58; uVar11 = local_res20; } else { uVar7 = uVar21; if (puVar19 != (undefined1 *)(ulonglong)uVar8) { uVar7 = FUN_1401c3ef0(puVar2[6]); puVar19 = local_58; uVar11 = local_res20; } } puVar2[6] = uVar7; *(uint *)((longlong)param_1 + 0x4c) = uVar7; } uVar12 = uVar3; if (puVar2[4] == 0) { uVar12 = ((uVar3 & 0xff00) + uVar3 * 0x10000) * 0x100 + (uVar3 >> 8 & 0xff00) + (uVar3 >> 0x18); } uVar7 = uVar21; uVar8 = uVar21; local_60 = uVar11; if (uVar12 != puVar2[6]) { param_1[4] = (longlong)"incorrect data check"; *puVar2 = 0x1d; uVar7 = uVar16; uVar8 = uVar3; break; } } *puVar2 = 0x1b; case 0x1b: if ((puVar2[2] != 0) && (uVar16 = uVar7, uVar3 = uVar8, puVar2[4] != 0)) { for (; uVar16 < 0x20; uVar16 = uVar16 + 8) { uVar7 = uVar16; uVar8 = uVar3; uVar13 = 0; uVar12 = local_64; if (uVar15 == 0) goto LAB_1401c4abe; bVar1 = *_Src; bVar9 = (byte)uVar16; uVar15 = uVar15 - 1; _Src = _Src + 1; uVar3 = uVar3 + ((uint)bVar1 << (bVar9 & 0x1f)); } uVar7 = uVar21; uVar8 = uVar21; if (uVar3 != puVar2[7]) { param_1[4] = (longlong)"incorrect length check"; *puVar2 = 0x1d; uVar7 = uVar16; uVar8 = uVar3; break; } } *puVar2 = 0x1c; switchD_1401c42e1_caseD_1c: local_res18 = 1; uVar13 = uVar15; uVar12 = local_64; goto LAB_1401c4abe; case 0x1c: goto switchD_1401c42e1_caseD_1c; case 0x1d: local_res18 = -3; goto LAB_1401c4abe; case 0x1e: goto LAB_1401c4b19; } LAB_1401c4918: uVar16 = *puVar2; } while( true ); }