/* Agent_Release_x64.exe sha256 6f2be7b8eb799ba51b359d1958720aac5baee5b7ee0d1d36684d3cbd72d45469 * Ghidra 12.1.2 decompiler output for 0x1400d9324 FUN_1400d9324 * Pseudocode, not original source. */ /* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */ undefined8 FUN_1400d9324(int param_1,ushort *param_2,uint param_3,longlong *param_4,uint *param_5, undefined *param_6) { byte bVar1; ushort uVar2; ushort *puVar3; undefined8 uVar4; byte bVar5; longlong lVar6; ulonglong uVar7; ulonglong uVar8; ulonglong uVar9; uint uVar10; uint uVar11; uint uVar12; int iVar13; char cVar14; uint uVar15; uint uVar16; int iVar17; int iVar18; uint uVar19; byte bVar21; ulonglong uVar22; uint uVar23; undefined *puVar24; undefined4 local_d8; longlong local_d0; uint local_c8; uint local_c4; uint local_c0; uint local_bc; undefined *local_b0; ushort local_80 [32]; ulonglong local_40; ulonglong uVar20; local_40 = DAT_1401555a0 ^ (ulonglong)&local_d8; uVar22 = 0; uVar23 = 1; puVar3 = local_80; for (lVar6 = 0x10; lVar6 != 0; lVar6 = lVar6 + -1) { *puVar3 = 0; puVar3 = puVar3 + 1; } if (param_3 != 0) { uVar8 = (ulonglong)param_3; puVar3 = param_2; do { uVar2 = *puVar3; puVar3 = puVar3 + 1; local_80[uVar2] = local_80[uVar2] + 1; uVar8 = uVar8 - 1; } while (uVar8 != 0); } uVar10 = 0xf; local_c4 = 0xffffffff; puVar3 = local_80 + 0xf; do { if (*puVar3 != 0) break; uVar10 = uVar10 - 1; puVar3 = puVar3 + -1; } while (uVar10 != 0); uVar16 = *param_5; if (uVar10 < *param_5) { uVar16 = uVar10; } if (uVar10 == 0) { *(undefined4 *)*param_4 = 0x140; *param_4 = *param_4 + 4; *(undefined4 *)*param_4 = 0x140; *param_4 = *param_4 + 4; *param_5 = 1; LAB_1400d93f2: uVar4 = 0; } else { puVar3 = local_80; uVar15 = uVar23; do { puVar3 = puVar3 + 1; if (*puVar3 != 0) break; uVar15 = uVar15 + 1; } while (uVar15 < 0x10); uVar8 = (ulonglong)uVar16; uVar11 = uVar23; if (uVar16 < uVar15) { uVar8 = (ulonglong)uVar15; } do { uVar23 = uVar23 * 2 - (uint)local_80[uVar11]; if ((int)uVar23 < 0) goto LAB_1400d9761; uVar11 = uVar11 + 1; } while (uVar11 < 0x10); if (((int)uVar23 < 1) || ((param_1 != 0 && (uVar10 == 1)))) { local_80[0x11] = 0; lVar6 = 0xe; uVar7 = uVar22; do { lVar6 = lVar6 + -1; *(short *)((longlong)local_80 + uVar7 + 0x24) = *(short *)((longlong)local_80 + uVar7 + 2) + *(short *)((longlong)local_80 + uVar7 + 0x22); uVar7 = uVar7 + 2; } while (lVar6 != 0); puVar3 = param_2; uVar7 = uVar22; if (param_3 != 0) { do { if (*puVar3 != 0) { *(short *)(param_6 + (ulonglong)local_80[(ulonglong)*puVar3 + 0x10] * 2) = (short)uVar7; local_80[(ulonglong)*puVar3 + 0x10] = local_80[(ulonglong)*puVar3 + 0x10] + 1; } uVar23 = (int)uVar7 + 1; puVar3 = puVar3 + 1; uVar7 = (ulonglong)uVar23; } while (uVar23 < param_3); } if (param_1 == 0) { local_b0 = param_6; iVar13 = 0x13; puVar24 = param_6; } else if (param_1 == 1) { iVar13 = 0x100; local_b0 = &DAT_14011811e; puVar24 = &UNK_1401180de; } else { iVar13 = -1; local_b0 = &DAT_1401183a0; puVar24 = &DAT_140118360; } local_d0 = *param_4; uVar16 = (uint)uVar8; bVar5 = (byte)uVar8; local_bc = 1 << (bVar5 & 0x1f); uVar23 = local_bc - 1; local_c0 = 0; uVar7 = uVar22; uVar9 = uVar22; local_c8 = local_bc; if ((param_1 != 1) || (uVar7 = 0, uVar9 = 0, local_bc < 0x5b0)) { LAB_1400d9544: cVar14 = (char)uVar15; bVar21 = (byte)uVar22; bVar1 = cVar14 - bVar21; uVar2 = *(ushort *)(param_6 + uVar9 * 2); if ((int)(uint)uVar2 < iVar13) { local_d8._0_2_ = (ushort)bVar1 << 8; } else if (iVar13 < (int)(uint)uVar2) { local_d8._0_2_ = CONCAT11(bVar1,local_b0[(ulonglong)*(ushort *)(param_6 + uVar9 * 2) * 2]) ; uVar2 = *(ushort *)(puVar24 + (ulonglong)*(ushort *)(param_6 + uVar9 * 2) * 2); } else { local_d8 = CONCAT31((uint3)bVar1,0x60); uVar2 = 0; } uVar12 = (uint)uVar7; local_d8 = CONCAT22(uVar2,(ushort)local_d8); iVar17 = 1 << (cVar14 - bVar21 & 0x1f); uVar7 = (ulonglong)((uVar12 >> (bVar21 & 0x1f)) + local_bc); uVar11 = local_bc; do { uVar7 = (ulonglong)(uint)((int)uVar7 - iVar17); uVar11 = uVar11 - iVar17; *(uint *)(local_d0 + uVar7 * 4) = local_d8; } while (uVar11 != 0); for (uVar11 = 1 << (cVar14 - 1U & 0x1f); (uVar12 & uVar11) != 0; uVar11 = uVar11 >> 1) { } uVar19 = 0; if (uVar11 != 0) { uVar19 = uVar11 + (uVar11 - 1 & uVar12); } uVar7 = (ulonglong)uVar19; local_c0 = local_c0 + 1; uVar9 = (ulonglong)local_c0; puVar3 = local_80 + uVar15; *puVar3 = *puVar3 - 1; if (*puVar3 != 0) goto LAB_1400d960e; if (uVar15 != uVar10) { uVar15 = (uint)param_2[*(ushort *)(param_6 + uVar9 * 2)]; goto LAB_1400d960e; } local_d8._0_2_ = CONCAT11(cVar14 - bVar21,0x40); local_d8 = (uint)(ushort)local_d8; while (uVar19 != 0) { uVar10 = (uint)uVar7; if (((int)uVar22 != 0) && ((uVar23 & uVar10) != local_c4)) { local_d0 = *param_4; uVar22 = 0; local_d8._0_2_ = CONCAT11(bVar5,(undefined1)local_d8); local_d8 = (uint)(ushort)local_d8; uVar15 = uVar16; } *(uint *)(local_d0 + (uVar7 >> ((byte)uVar22 & 0x3f)) * 4) = local_d8; for (uVar11 = 1 << ((char)uVar15 - 1U & 0x1f); (uVar10 & uVar11) != 0; uVar11 = uVar11 >> 1) { } uVar19 = 0; if (uVar11 != 0) { uVar19 = uVar11 + (uVar11 - 1 & uVar10); } uVar7 = (ulonglong)uVar19; } *param_4 = *param_4 + (ulonglong)local_c8 * 4; *param_5 = uVar16; goto LAB_1400d93f2; } LAB_1400d9535: uVar4 = 1; } else { LAB_1400d9761: uVar4 = 0xffffffff; } } return uVar4; LAB_1400d960e: if (uVar16 < uVar15) { uVar19 = uVar23 & uVar19; uVar20 = (ulonglong)uVar19; if (uVar19 == local_c4) goto LAB_1400d9544; if ((int)uVar22 == 0) { uVar22 = uVar8; } local_d0 = local_d0 + (ulonglong)local_bc * 4; iVar18 = uVar15 - (int)uVar22; uVar11 = (int)uVar22 + iVar18; for (iVar17 = 1 << ((byte)iVar18 & 0x1f); (uVar11 < uVar10 && (uVar9 = (ulonglong)uVar11, 0 < (int)(iVar17 - (uint)local_80[uVar9]))); iVar17 = (iVar17 - (uint)local_80[uVar9]) * 2) { uVar11 = uVar11 + 1; iVar18 = iVar18 + 1; } local_bc = 1 << ((byte)iVar18 & 0x1f); local_c8 = local_c8 + local_bc; if ((param_1 != 1) || (local_c8 < 0x5b0)) { *(byte *)(*param_4 + uVar20 * 4) = (byte)iVar18; uVar9 = (ulonglong)local_c0; *(byte *)(*param_4 + 1 + uVar20 * 4) = bVar5; *(short *)(*param_4 + 2 + uVar20 * 4) = (short)(local_d0 - *param_4 >> 2); local_c4 = uVar19; goto LAB_1400d9544; } goto LAB_1400d9535; } goto LAB_1400d9544; }