/* Agent_Release_x64.exe sha256 6f2be7b8eb799ba51b359d1958720aac5baee5b7ee0d1d36684d3cbd72d45469 * Ghidra 12.1.2 decompiler output for 0x1400c5ab0 FUN_1400c5ab0 * Pseudocode, not original source. */ /* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */ /* WARNING: Type propagation algorithm not settling */ undefined8 FUN_1400c5ab0(int param_1,ushort *param_2,uint param_3,longlong *param_4,uint *param_5, undefined *param_6) { uint uVar1; byte bVar2; ushort uVar4; uint uVar5; ushort *puVar6; undefined8 uVar7; byte bVar8; longlong lVar9; ulonglong uVar10; uint uVar11; ulonglong uVar12; uint uVar13; ulonglong uVar14; int iVar15; ulonglong uVar16; uint uVar17; int iVar18; int iVar19; uint uVar20; uint uVar21; byte bVar22; bool bVar23; undefined4 local_d8; uint local_d0; uint local_cc; undefined *local_b0; undefined *local_a8; ushort local_88 [15]; ushort local_6a [17]; ulonglong local_48; char cVar3; local_48 = DAT_1401555a0 ^ (ulonglong)&local_d8; uVar16 = 0; puVar6 = local_88; for (lVar9 = 0x10; lVar9 != 0; lVar9 = lVar9 + -1) { *puVar6 = 0; puVar6 = puVar6 + 1; } if (param_3 != 0) { uVar12 = (ulonglong)param_3; puVar6 = param_2; do { uVar4 = *puVar6; puVar6 = puVar6 + 1; local_88[uVar4] = local_88[uVar4] + 1; uVar12 = uVar12 - 1; } while (uVar12 != 0); } uVar20 = 0xf; puVar6 = local_6a; uVar12 = 0xffffffff; do { if (*puVar6 != 0) break; uVar20 = uVar20 - 1; puVar6 = puVar6 + -1; } while (uVar20 != 0); uVar1 = *param_5; if (uVar20 < *param_5) { uVar1 = uVar20; } if (uVar20 == 0) { *(undefined4 *)*param_4 = 0x140; *param_4 = *param_4 + 4; *(undefined4 *)*param_4 = 0x140; *param_4 = *param_4 + 4; *param_5 = 1; uVar7 = 0; } else { uVar21 = 1; if (1 < uVar20) { puVar6 = local_88; do { puVar6 = puVar6 + 1; if (*puVar6 != 0) break; uVar21 = uVar21 + 1; } while (uVar21 < uVar20); } iVar15 = 1; if (uVar1 < uVar21) { uVar1 = uVar21; } uVar10 = 1; do { iVar15 = iVar15 * 2 - (uint)local_88[uVar10]; if (iVar15 < 0) goto LAB_1400c5f5c; uVar11 = (int)uVar10 + 1; uVar10 = (ulonglong)uVar11; } while (uVar11 < 0x10); if ((iVar15 < 1) || ((param_1 != 0 && (uVar20 == 1)))) { local_6a[2] = 0; lVar9 = 0xe; uVar10 = uVar16; do { lVar9 = lVar9 + -1; *(short *)((longlong)local_6a + uVar10 + 6) = *(short *)((longlong)local_88 + uVar10 + 2) + *(short *)((longlong)local_6a + uVar10 + 4); uVar10 = uVar10 + 2; } while (lVar9 != 0); puVar6 = param_2; uVar10 = uVar16; if (param_3 != 0) { do { if (*puVar6 != 0) { *(short *)(param_6 + (ulonglong)local_6a[(ulonglong)*puVar6 + 1] * 2) = (short)uVar10; local_6a[(ulonglong)*puVar6 + 1] = local_6a[(ulonglong)*puVar6 + 1] + 1; } uVar11 = (int)uVar10 + 1; puVar6 = puVar6 + 1; uVar10 = (ulonglong)uVar11; } while (uVar11 < param_3); } if (param_1 == 0) { local_a8 = param_6; local_b0 = param_6; iVar15 = 0x13; } else if (param_1 == 1) { iVar15 = 0x100; local_b0 = &DAT_140112096; local_a8 = &DAT_1401120d6; } else { iVar15 = -1; local_b0 = &DAT_140112320; local_a8 = &DAT_140112360; } bVar8 = (byte)uVar1; local_cc = 1 << (bVar8 & 0x1f); uVar14 = (ulonglong)local_cc; local_d0 = 0; lVar9 = *param_4; uVar5 = local_cc - 1; uVar10 = uVar16; uVar11 = 0; if (param_1 == 1) { uVar12 = 0xffffffff; if (local_cc < 0x354) { LAB_1400c5d20: do { do { cVar3 = (char)uVar21; bVar22 = (byte)uVar11; bVar2 = cVar3 - bVar22; uVar4 = *(ushort *)(param_6 + uVar10 * 2); if ((int)(uint)uVar4 < iVar15) { local_d8._0_2_ = (ushort)bVar2 << 8; } else if (iVar15 < (int)(uint)uVar4) { local_d8._0_2_ = CONCAT11(bVar2,local_a8[(ulonglong)*(ushort *)(param_6 + uVar10 * 2) * 2]); uVar4 = *(ushort *)(local_b0 + (ulonglong)*(ushort *)(param_6 + uVar10 * 2) * 2); } else { local_d8 = CONCAT31((uint3)bVar2,0x60); uVar4 = 0; } uVar13 = (uint)uVar16; local_d8 = CONCAT22(uVar4,(ushort)local_d8); iVar18 = 1 << (cVar3 - bVar22 & 0x1f); uVar10 = (ulonglong)((uVar13 >> (bVar22 & 0x1f)) + (int)uVar14); uVar16 = uVar14; do { uVar10 = (ulonglong)(uint)((int)uVar10 - iVar18); uVar17 = (int)uVar16 - iVar18; uVar16 = (ulonglong)uVar17; *(uint *)(lVar9 + uVar10 * 4) = local_d8; } while (uVar17 != 0); for (uVar17 = 1 << (cVar3 - 1U & 0x1f); (uVar13 & uVar17) != 0; uVar17 = uVar17 >> 1) { } if (uVar17 == 0) { uVar16 = 0; } else { uVar16 = (ulonglong)(uVar17 + (uVar17 - 1 & uVar13)); } local_d0 = local_d0 + 1; uVar10 = (ulonglong)local_d0; puVar6 = local_88 + uVar21; *puVar6 = *puVar6 - 1; uVar13 = (uint)uVar16; if (*puVar6 == 0) { if (uVar21 == uVar20) { local_d8._0_2_ = CONCAT11(cVar3 - bVar22,0x40); local_d8 = (uint)(ushort)local_d8; goto joined_r0x0001400c5eec; } uVar21 = (uint)param_2[*(ushort *)(param_6 + uVar10 * 2)]; } } while (uVar21 <= uVar1); uVar13 = uVar5 & uVar13; } while (uVar13 == (uint)uVar12); if (uVar11 == 0) { uVar11 = uVar1; } lVar9 = lVar9 + uVar14 * 4; iVar19 = uVar21 - uVar11; uVar17 = uVar11 + iVar19; for (iVar18 = 1 << ((byte)iVar19 & 0x1f); (uVar17 < uVar20 && (uVar12 = (ulonglong)uVar17, 0 < (int)(iVar18 - (uint)local_88[uVar12]))); iVar18 = (iVar18 - (uint)local_88[uVar12]) * 2) { uVar17 = uVar17 + 1; iVar19 = iVar19 + 1; } uVar17 = 1 << ((byte)iVar19 & 0x1f); uVar14 = (ulonglong)uVar17; local_cc = local_cc + uVar17; if (param_1 == 1) { bVar23 = local_cc < 0x354; LAB_1400c5e8e: if (!bVar23) goto LAB_1400c5cfa; } else if (param_1 == 2) { bVar23 = local_cc < 0x250; goto LAB_1400c5e8e; } uVar12 = (ulonglong)uVar13; *(byte *)(*param_4 + (ulonglong)uVar13 * 4) = (byte)iVar19; *(byte *)(*param_4 + 1 + uVar12 * 4) = bVar8; *(short *)(*param_4 + 2 + uVar12 * 4) = (short)(lVar9 - *param_4 >> 2); uVar10 = (ulonglong)local_d0; goto LAB_1400c5d20; } } else if ((param_1 != 2) || (uVar16 = 0, uVar10 = 0, uVar11 = 0, local_cc < 0x250)) goto LAB_1400c5d20; LAB_1400c5cfa: uVar7 = 1; } else { LAB_1400c5f5c: uVar7 = 0xffffffff; } } return uVar7; joined_r0x0001400c5eec: if (uVar13 == 0) { LAB_1400c5f48: *param_4 = *param_4 + (ulonglong)local_cc * 4; *param_5 = uVar1; return 0; } uVar20 = (uint)uVar16; if ((uVar11 != 0) && ((uVar5 & uVar20) != (uint)uVar12)) { lVar9 = *param_4; local_d8._0_2_ = CONCAT11(bVar8,(undefined1)local_d8); local_d8 = (uint)(ushort)local_d8; uVar21 = uVar1; uVar11 = 0; } *(uint *)(lVar9 + (uVar16 >> ((byte)uVar11 & 0x3f)) * 4) = local_d8; for (uVar13 = 1 << ((char)uVar21 - 1U & 0x1f); (uVar20 & uVar13) != 0; uVar13 = uVar13 >> 1) { } if (uVar13 == 0) goto LAB_1400c5f48; uVar13 = (uVar20 & uVar13 - 1) + uVar13; uVar16 = (ulonglong)uVar13; goto joined_r0x0001400c5eec; }