260 lines
7.4 KiB
C
260 lines
7.4 KiB
C
/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
|
|
* Ghidra 12.1.2 decompiler output for 0x140115d54 FUN_140115d54
|
|
* Pseudocode, not original source. */
|
|
|
|
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
|
|
|
|
undefined8
|
|
FUN_140115d54(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_1401ac5a0 ^ (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_140115e22:
|
|
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_140116191;
|
|
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_140155efe;
|
|
puVar24 = &UNK_140155ebe;
|
|
}
|
|
else {
|
|
iVar13 = -1;
|
|
local_b0 = &DAT_140156180;
|
|
puVar24 = &DAT_140156140;
|
|
}
|
|
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_140115f74:
|
|
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_14011603e;
|
|
if (uVar15 != uVar10) {
|
|
uVar15 = (uint)param_2[*(ushort *)(param_6 + uVar9 * 2)];
|
|
goto LAB_14011603e;
|
|
}
|
|
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_140115e22;
|
|
}
|
|
LAB_140115f65:
|
|
uVar4 = 1;
|
|
}
|
|
else {
|
|
LAB_140116191:
|
|
uVar4 = 0xffffffff;
|
|
}
|
|
}
|
|
return uVar4;
|
|
LAB_14011603e:
|
|
if (uVar16 < uVar15) {
|
|
uVar19 = uVar23 & uVar19;
|
|
uVar20 = (ulonglong)uVar19;
|
|
if (uVar19 == local_c4) goto LAB_140115f74;
|
|
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_140115f74;
|
|
}
|
|
goto LAB_140115f65;
|
|
}
|
|
goto LAB_140115f74;
|
|
}
|
|
|