275 lines
8.1 KiB
C
275 lines
8.1 KiB
C
/* AgentManager_Release_x64.exe sha256 8fd8ca91725858651a7839d34257b10c2970ac16c97e60c523b8b0c983fcb186
|
|
* Ghidra 12.1.2 decompiler output for 0x1400be2a0 FUN_1400be2a0
|
|
* Pseudocode, not original source. */
|
|
|
|
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
|
|
/* WARNING: Type propagation algorithm not settling */
|
|
|
|
undefined8
|
|
FUN_1400be2a0(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_14016f5a0 ^ (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_1400be74c;
|
|
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_140123116;
|
|
local_a8 = &DAT_140123156;
|
|
}
|
|
else {
|
|
iVar15 = -1;
|
|
local_b0 = &DAT_1401233a0;
|
|
local_a8 = &DAT_1401233e0;
|
|
}
|
|
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_1400be510:
|
|
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_r0x0001400be6dc;
|
|
}
|
|
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_1400be67e:
|
|
if (!bVar23) goto LAB_1400be4ea;
|
|
}
|
|
else if (param_1 == 2) {
|
|
bVar23 = local_cc < 0x250;
|
|
goto LAB_1400be67e;
|
|
}
|
|
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_1400be510;
|
|
}
|
|
}
|
|
else if ((param_1 != 2) || (uVar16 = 0, uVar10 = 0, uVar11 = 0, local_cc < 0x250))
|
|
goto LAB_1400be510;
|
|
LAB_1400be4ea:
|
|
uVar7 = 1;
|
|
}
|
|
else {
|
|
LAB_1400be74c:
|
|
uVar7 = 0xffffffff;
|
|
}
|
|
}
|
|
return uVar7;
|
|
joined_r0x0001400be6dc:
|
|
if (uVar13 == 0) {
|
|
LAB_1400be738:
|
|
*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_1400be738;
|
|
uVar13 = (uVar20 & uVar13 - 1) + uVar13;
|
|
uVar16 = (ulonglong)uVar13;
|
|
goto joined_r0x0001400be6dc;
|
|
}
|
|
|