453 lines
14 KiB
C
453 lines
14 KiB
C
/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
|
|
* Ghidra 12.1.2 decompiler output for 0x14008dda0 FUN_14008dda0
|
|
* Pseudocode, not original source. */
|
|
|
|
void FUN_14008dda0(longlong *param_1,longlong *param_2,undefined8 param_3,double param_4)
|
|
|
|
{
|
|
int *piVar1;
|
|
uint uVar2;
|
|
int iVar3;
|
|
void *pvVar4;
|
|
undefined8 uVar5;
|
|
longlong *plVar6;
|
|
uint uVar7;
|
|
undefined8 *puVar8;
|
|
uint uVar9;
|
|
uint uVar10;
|
|
longlong lVar11;
|
|
uint *puVar12;
|
|
longlong *plVar13;
|
|
ulonglong uVar14;
|
|
longlong lVar15;
|
|
longlong *plVar16;
|
|
longlong lVar17;
|
|
uint *puVar18;
|
|
int iVar19;
|
|
longlong lVar20;
|
|
ulonglong uVar21;
|
|
ulonglong uVar22;
|
|
ulonglong in_R9;
|
|
int iVar23;
|
|
int iVar24;
|
|
longlong lVar25;
|
|
bool bVar26;
|
|
bool bVar27;
|
|
undefined8 *local_e0;
|
|
longlong local_d8;
|
|
longlong local_d0;
|
|
undefined8 local_c8;
|
|
undefined8 local_c0;
|
|
undefined8 local_b8;
|
|
undefined8 local_b0;
|
|
undefined8 local_a8;
|
|
undefined8 local_a0;
|
|
void *local_98;
|
|
exception local_90 [88];
|
|
|
|
if ((int)param_3 == 0) {
|
|
return;
|
|
}
|
|
local_a0 = 0xfffffffffffffffe;
|
|
bVar26 = false;
|
|
plVar6 = param_1 + 0x2f4;
|
|
FUN_14007b490((longlong)plVar6,0,param_3,in_R9);
|
|
lVar25 = param_2[1];
|
|
iVar24 = 0;
|
|
lVar11 = lVar25;
|
|
local_d8 = lVar25;
|
|
if (0 < (int)lVar25) {
|
|
do {
|
|
if ((iVar24 < 0) || (param_2[1] <= (longlong)iVar24)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
iVar19 = iVar24;
|
|
if (iVar24 < (int)lVar25) {
|
|
do {
|
|
lVar15 = (longlong)iVar24;
|
|
if (iVar24 == iVar19) {
|
|
LAB_14008ded8:
|
|
bVar27 = false;
|
|
}
|
|
else {
|
|
lVar11 = (longlong)iVar19;
|
|
if ((iVar19 < 0) || (param_2[1] <= lVar11)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if ((ulonglong)param_2[2] < 0x65) {
|
|
puVar12 = (uint *)(param_2 + (lVar11 + 1) * 4);
|
|
}
|
|
else {
|
|
puVar12 = (uint *)(lVar11 * 0x20 + *param_2);
|
|
}
|
|
if (param_2[1] <= lVar15) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if ((ulonglong)param_2[2] < 0x65) {
|
|
puVar18 = (uint *)(param_2 + (lVar15 + 1) * 4);
|
|
}
|
|
else {
|
|
puVar18 = (uint *)(lVar15 * 0x20 + *param_2);
|
|
}
|
|
in_R9 = (ulonglong)*puVar12;
|
|
plVar13 = FUN_14008c450((longlong)(param_1 + 0x5b),(longlong *)&local_e0,*puVar18,
|
|
*puVar12);
|
|
bVar26 = true;
|
|
if ((longlong *)*plVar13 == (longlong *)0x0) {
|
|
lVar11 = 0;
|
|
goto LAB_14008ded8;
|
|
}
|
|
lVar11 = *(longlong *)*plVar13;
|
|
if (lVar11 == 0) goto LAB_14008ded8;
|
|
bVar27 = true;
|
|
}
|
|
puVar8 = local_e0;
|
|
if (((bVar26) && (bVar26 = false, local_e0 != (undefined8 *)0x0)) &&
|
|
(local_e0[1] = local_e0[1] + -1, local_e0[1] == 0)) {
|
|
pvVar4 = (void *)*local_e0;
|
|
local_98 = pvVar4;
|
|
if (pvVar4 != (void *)0x0) {
|
|
FUN_140078360((undefined8 *)((longlong)pvVar4 + 0x148));
|
|
FUN_140078360((undefined8 *)((longlong)pvVar4 + 0x120));
|
|
operator_delete(pvVar4);
|
|
}
|
|
FUN_14006cc60(puVar8);
|
|
bVar26 = false;
|
|
lVar25 = local_d8;
|
|
}
|
|
if (((bVar27) && (*(char *)(lVar11 + 8) == '\0')) &&
|
|
(*(double *)(lVar11 + 0x188) <= param_4 && param_4 != *(double *)(lVar11 + 0x188))) {
|
|
local_c8 = CONCAT44(iVar19,iVar24);
|
|
plVar13 = plVar6;
|
|
local_d0 = lVar11;
|
|
FUN_14007ba70((longlong)plVar6,(int)param_1[0x2f7],(longlong)&local_d0,1);
|
|
uVar14 = 0;
|
|
in_R9 = (ulonglong)(int)param_1[0x2f7];
|
|
uVar22 = uVar14;
|
|
uVar21 = uVar14;
|
|
if (0 < (longlong)in_R9) {
|
|
do {
|
|
if (((longlong)uVar21 < 0) || (iVar23 = (int)uVar22, (int)param_1[0x2f7] <= iVar23))
|
|
{
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30(plVar13,uVar22,uVar21,in_R9);
|
|
}
|
|
lVar15 = param_1[0x2f6];
|
|
if (*(int *)(uVar14 + 8 + lVar15) == iVar24) {
|
|
piVar1 = (int *)(uVar14 + 0x10 + lVar15);
|
|
*piVar1 = *piVar1 + 1;
|
|
}
|
|
else if (*(int *)(uVar14 + 0xc + lVar15) == iVar24) {
|
|
piVar1 = (int *)(uVar14 + 0x14 + lVar15);
|
|
*piVar1 = *piVar1 + 1;
|
|
}
|
|
if ((int)param_1[0x2f7] <= iVar23) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30(lVar15,uVar22,uVar21,in_R9);
|
|
}
|
|
plVar13 = (longlong *)param_1[0x2f6];
|
|
if (*(int *)(uVar14 + 8 + (longlong)plVar13) == iVar19) {
|
|
piVar1 = (int *)(uVar14 + 0x10 + (longlong)plVar13);
|
|
*piVar1 = *piVar1 + 1;
|
|
}
|
|
else if (*(int *)(uVar14 + 0xc + (longlong)plVar13) == iVar19) {
|
|
piVar1 = (int *)(uVar14 + 0x14 + (longlong)plVar13);
|
|
*piVar1 = *piVar1 + 1;
|
|
}
|
|
uVar21 = uVar21 + 1;
|
|
uVar14 = uVar14 + 0x18;
|
|
uVar22 = (ulonglong)(iVar23 + 1);
|
|
} while ((longlong)uVar21 < (longlong)in_R9);
|
|
}
|
|
local_d0 = 0;
|
|
local_c8 = 0;
|
|
local_c0 = 0;
|
|
}
|
|
iVar19 = iVar19 + 1;
|
|
} while (iVar19 < (int)lVar25);
|
|
}
|
|
iVar24 = iVar24 + 1;
|
|
} while (iVar24 < (int)lVar25);
|
|
}
|
|
lVar25 = 0;
|
|
uVar2 = *(uint *)(param_1 + 0x2f7);
|
|
if ((int)param_1[0x2f7] != 0) {
|
|
lVar25 = param_1[0x2f6];
|
|
}
|
|
uVar22 = 0;
|
|
if ((int)uVar2 < 0x65) {
|
|
FUN_14007c890(lVar25,uVar2,0);
|
|
}
|
|
else {
|
|
FUN_14008bbf0(lVar25,uVar2,0);
|
|
}
|
|
plVar16 = param_1 + 0x2f9;
|
|
plVar13 = (longlong *)0x0;
|
|
FUN_14007b600((longlong)plVar16,0,uVar22);
|
|
iVar24 = 0;
|
|
lVar25 = 0;
|
|
if (0 < (int)param_1[0x2f7]) {
|
|
lVar11 = 0;
|
|
do {
|
|
if ((lVar25 < 0) || ((int)param_1[0x2f7] <= iVar24)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30(param_1,plVar13,uVar22,in_R9);
|
|
}
|
|
lVar15 = param_1[0x2f6];
|
|
local_b8 = *(undefined8 *)(lVar11 + lVar15);
|
|
in_R9 = *(ulonglong *)(lVar11 + 8 + lVar15);
|
|
uVar5 = *(undefined8 *)(lVar11 + 0x10 + lVar15);
|
|
iVar19 = (int)param_1[0x2fc];
|
|
lVar20 = (longlong)iVar19;
|
|
local_b0._4_4_ = (uint)(in_R9 >> 0x20);
|
|
uVar2 = local_b0._4_4_;
|
|
plVar13 = (longlong *)0x0;
|
|
while (iVar23 = (int)plVar13, local_b0 = in_R9, local_a8 = uVar5, iVar23 != iVar19) {
|
|
if ((iVar23 < 0) || ((int)param_1[0x2fc] <= iVar23)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30(lVar15,plVar13,uVar22,in_R9);
|
|
}
|
|
lVar15 = (longlong)iVar23;
|
|
uVar9 = *(uint *)(param_1[0x2fb] + lVar15 * 4);
|
|
uVar22 = (ulonglong)uVar9;
|
|
uVar21 = in_R9;
|
|
if ((uVar9 == (uint)in_R9) || (uVar21 = in_R9, uVar9 == local_b0._4_4_)) goto LAB_14008e1ff;
|
|
plVar13 = (longlong *)(ulonglong)(iVar23 + 1);
|
|
}
|
|
local_a8._4_4_ = (int)((ulonglong)uVar5 >> 0x20);
|
|
if ((int)uVar5 < local_a8._4_4_) {
|
|
if (iVar19 < 0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
lVar15 = param_1[0x2fc];
|
|
uVar9 = (int)lVar15 + 1;
|
|
plVar13 = (longlong *)(ulonglong)uVar9;
|
|
FUN_14007b600((longlong)plVar16,uVar9,uVar22);
|
|
iVar19 = (int)lVar15 - iVar19;
|
|
if (0 < iVar19) {
|
|
if ((int)param_1[0x2fc] == 0) {
|
|
lVar15 = 0;
|
|
lVar17 = 0;
|
|
}
|
|
else {
|
|
lVar15 = param_1[0x2fb];
|
|
lVar17 = param_1[0x2fb];
|
|
}
|
|
uVar22 = (longlong)iVar19 << 2;
|
|
plVar13 = (longlong *)(lVar15 + lVar20 * 4);
|
|
memmove((void *)(lVar17 + 4 + lVar20 * 4),plVar13,uVar22);
|
|
}
|
|
if ((int)param_1[0x2fc] == 0) {
|
|
lVar15 = 0;
|
|
}
|
|
else {
|
|
lVar15 = param_1[0x2fb];
|
|
}
|
|
*(uint *)(lVar15 + lVar20 * 4) = uVar2;
|
|
uVar21 = local_b0;
|
|
}
|
|
else {
|
|
if (iVar19 < 0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
lVar15 = param_1[0x2fc];
|
|
FUN_14007b600((longlong)plVar16,(int)lVar15 + 1,uVar22);
|
|
iVar19 = (int)lVar15 - iVar19;
|
|
if (0 < iVar19) {
|
|
if ((int)param_1[0x2fc] == 0) {
|
|
lVar15 = 0;
|
|
lVar17 = 0;
|
|
}
|
|
else {
|
|
lVar15 = param_1[0x2fb];
|
|
lVar17 = param_1[0x2fb];
|
|
}
|
|
uVar22 = (longlong)iVar19 << 2;
|
|
memmove((void *)(lVar17 + 4 + lVar20 * 4),(void *)(lVar15 + lVar20 * 4),uVar22);
|
|
}
|
|
if ((int)param_1[0x2fc] == 0) {
|
|
plVar13 = (longlong *)0x0;
|
|
}
|
|
else {
|
|
plVar13 = (longlong *)param_1[0x2fb];
|
|
}
|
|
*(undefined4 *)((longlong)plVar13 + lVar20 * 4) = (undefined4)local_b0;
|
|
uVar21 = local_b0;
|
|
}
|
|
LAB_14008e1ff:
|
|
local_b0 = uVar21;
|
|
iVar24 = iVar24 + 1;
|
|
lVar25 = lVar25 + 1;
|
|
lVar11 = lVar11 + 0x18;
|
|
} while (iVar24 < (int)param_1[0x2f7]);
|
|
}
|
|
iVar24 = 0;
|
|
lVar11 = 0;
|
|
lVar25 = param_1[0x2fc];
|
|
if (0 < (longlong)(int)lVar25) {
|
|
do {
|
|
if ((lVar11 < 0) || ((int)param_1[0x2fc] <= iVar24)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30(param_1,plVar13,uVar22,in_R9);
|
|
}
|
|
iVar19 = *(int *)(param_1[0x2fb] + lVar11 * 4);
|
|
lVar15 = (longlong)iVar19;
|
|
if ((iVar19 < 0) || (param_2[1] <= lVar15)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if ((ulonglong)param_2[2] < 0x65) {
|
|
plVar13 = param_2 + (lVar15 + 1) * 4;
|
|
}
|
|
else {
|
|
plVar13 = (longlong *)(lVar15 * 0x20 + *param_2);
|
|
}
|
|
if ((plVar13[2] == 0) && (plVar13[3] == 0)) {
|
|
lVar20 = 0;
|
|
iVar23 = 0;
|
|
in_R9 = 0;
|
|
lVar15 = param_1[0x2f7];
|
|
if (0 < (longlong)(int)lVar15) {
|
|
uVar22 = 0;
|
|
plVar16 = param_1;
|
|
do {
|
|
if ((int)param_3 <= lVar20) break;
|
|
if (((longlong)in_R9 < 0) || ((int)param_1[0x2f7] <= iVar23)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be30(plVar16,plVar13,uVar22,in_R9);
|
|
}
|
|
lVar17 = param_1[0x2f6];
|
|
iVar3 = *(int *)(lVar17 + 8 + uVar22);
|
|
plVar16 = (longlong *)(longlong)iVar3;
|
|
if (iVar19 == iVar3) {
|
|
lVar17 = (longlong)*(int *)(lVar17 + 0xc + uVar22);
|
|
if ((lVar17 < 0) || (param_2[1] <= lVar17)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if ((ulonglong)param_2[2] < 0x65) {
|
|
plVar16 = param_2 + (lVar17 + 1) * 4;
|
|
}
|
|
else {
|
|
plVar16 = (longlong *)(lVar17 * 0x20 + *param_2);
|
|
}
|
|
if ((plVar16[2] == 0) && (plVar16[3] == 0)) {
|
|
LAB_14008e39d:
|
|
plVar13[3] = (longlong)plVar16;
|
|
plVar16[2] = (longlong)plVar13;
|
|
lVar20 = lVar20 + 1;
|
|
plVar13 = (longlong *)plVar13[3];
|
|
}
|
|
}
|
|
else if (iVar19 == *(int *)(lVar17 + 0xc + uVar22)) {
|
|
if (((longlong)plVar16 < 0) || (param_2[1] <= (longlong)plVar16)) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
if ((ulonglong)param_2[2] < 0x65) {
|
|
plVar16 = param_2 + ((longlong)plVar16 + 1) * 4;
|
|
}
|
|
else {
|
|
plVar16 = (longlong *)((longlong)plVar16 * 0x20 + *param_2);
|
|
}
|
|
if ((plVar16[2] == 0) && (plVar16[3] == 0)) {
|
|
plVar13[2] = 0;
|
|
goto LAB_14008e39d;
|
|
}
|
|
}
|
|
iVar23 = iVar23 + 1;
|
|
in_R9 = in_R9 + 1;
|
|
uVar22 = uVar22 + 0x18;
|
|
} while ((longlong)in_R9 < (longlong)(int)lVar15);
|
|
}
|
|
}
|
|
iVar24 = iVar24 + 1;
|
|
lVar11 = lVar11 + 1;
|
|
} while (lVar11 < (int)lVar25);
|
|
}
|
|
FUN_14007b490((longlong)plVar6,0,uVar22,in_R9);
|
|
iVar24 = (int)param_1[0x2fc];
|
|
if (iVar24 == 0) {
|
|
return;
|
|
}
|
|
uVar2 = *(uint *)((longlong)param_1 + 0x17e4);
|
|
uVar22 = (ulonglong)uVar2;
|
|
if (-1 < (int)uVar2) goto LAB_14008e501;
|
|
iVar19 = *(int *)((longlong)param_1 + 0x17ec);
|
|
if (iVar19 == 0) {
|
|
uVar10 = (int)(iVar24 + (iVar24 >> 0x1f & 7U)) >> 3;
|
|
uVar9 = 0x400;
|
|
if ((int)uVar10 < 0x400) {
|
|
uVar9 = uVar10;
|
|
}
|
|
uVar10 = 4;
|
|
if (4 < (int)uVar9) {
|
|
uVar10 = uVar9;
|
|
}
|
|
LAB_14008e475:
|
|
uVar9 = *(uint *)(param_1 + 0x2fd);
|
|
bVar27 = SBORROW4(uVar9,uVar10);
|
|
uVar7 = uVar9 - uVar10;
|
|
bVar26 = uVar9 == uVar10;
|
|
}
|
|
else {
|
|
if (iVar19 == 1) {
|
|
uVar9 = (int)(iVar24 + (iVar24 >> 0x1f & 7U)) >> 3;
|
|
uVar10 = 0x10;
|
|
if (0x10 < (int)uVar9) {
|
|
uVar10 = uVar9;
|
|
}
|
|
if (uVar10 < 0x11) {
|
|
uVar10 = 0x10;
|
|
}
|
|
goto LAB_14008e475;
|
|
}
|
|
if (iVar19 != 2) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14006be00();
|
|
}
|
|
uVar9 = *(uint *)(param_1 + 0x2fd);
|
|
uVar10 = 0;
|
|
bVar27 = false;
|
|
bVar26 = uVar9 == 0;
|
|
uVar7 = uVar9;
|
|
}
|
|
if (!bVar26 && bVar27 == (int)uVar7 < 0) {
|
|
uVar10 = uVar9;
|
|
}
|
|
plVar6 = (longlong *)param_1[0x2fa];
|
|
if (uVar2 == 0) {
|
|
if (plVar6 == (longlong *)0x0) {
|
|
lVar11 = FUN_14006cbf0((longlong)(int)uVar10 << 2);
|
|
}
|
|
else {
|
|
lVar11 = (**(code **)(*plVar6 + 8))(plVar6,(longlong)(int)uVar10 << 2);
|
|
}
|
|
}
|
|
else {
|
|
lVar25 = param_1[0x2fb];
|
|
if (plVar6 == (longlong *)0x0) {
|
|
lVar11 = FUN_14006cc20(lVar25,(longlong)(int)uVar10 << 2);
|
|
}
|
|
else {
|
|
uVar22 = (longlong)(int)uVar10 << 2;
|
|
lVar11 = (**(code **)(*plVar6 + 0x10))(plVar6,lVar25);
|
|
}
|
|
if (lVar11 == 0) {
|
|
FUN_14006ba50(local_90,L"Memory allocation failure!",uVar22,lVar25);
|
|
/* WARNING: Subroutine does not return */
|
|
_CxxThrowException(local_90,(ThrowInfo *)&DAT_1401a93e8);
|
|
}
|
|
}
|
|
param_1[0x2fb] = lVar11;
|
|
*(uint *)((longlong)param_1 + 0x17e4) = uVar10;
|
|
LAB_14008e501:
|
|
*(undefined4 *)(param_1 + 0x2fc) = 0;
|
|
return;
|
|
}
|
|
|