server-re/decomp/MessageServer_Release_x64/full/functions/0x1400d4950.c

383 lines
13 KiB
C

/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
* Ghidra 12.1.2 decompiler output for 0x1400d4950 FUN_1400d4950
* Pseudocode, not original source. */
/* WARNING: Removing unreachable block (ram,0x0001400d4eb9) */
/* WARNING: Removing unreachable block (ram,0x0001400d4ec0) */
/* WARNING: Removing unreachable block (ram,0x0001400d4ecf) */
void FUN_1400d4950(short *param_1,undefined8 param_2,longlong *param_3,undefined8 param_4)
{
longlong lVar1;
longlong lVar2;
undefined8 uVar3;
undefined8 *puVar4;
undefined8 *puVar5;
int iVar6;
uint uVar7;
short *psVar8;
undefined8 *puVar9;
longlong *in_RDX;
longlong lVar10;
longlong *plVar11;
uint uVar12;
int iVar13;
longlong *plVar14;
size_t sVar15;
ulonglong uVar16;
int iVar17;
int iVar18;
longlong local_res20;
undefined8 local_a8;
exception local_98 [96];
puVar5 = (undefined8 *)0x0;
uVar12 = 0;
psVar8 = param_1 + 0x18;
puVar4 = puVar5;
do {
if (((longlong)puVar4 < 0) || (5 < (longlong)puVar4)) {
/* WARNING: Subroutine does not return */
FUN_14006be30(psVar8,in_RDX,param_3,param_4);
}
plVar14 = *(longlong **)psVar8;
if (plVar14 != (longlong *)0x0) {
FUN_1400d4340(param_3,in_RDX,(longlong)param_3);
*(undefined4 *)(param_3 + 0xd5) = *(undefined4 *)(param_1 + 0xbc);
local_a8 = (int *)CONCAT44(local_a8._4_4_,0x10);
*(short *)((longlong)param_3 + 0x6ac) = param_1[0xbe];
param_3[0xce] = *(longlong *)(param_1 + 200);
*(undefined2 *)(param_3 + 0xcc) = 0xabce;
*(short *)((longlong)param_3 + 0x662) = param_1[0xc0];
lVar1 = plVar14[6];
param_3[0xcd] = 0;
*(int *)((longlong)param_3 + 0x664) = (int)lVar1;
lVar1 = param_3[1];
if (lVar1 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
FUN_1400d3a20(param_3,lVar1 + 1,-1);
if (param_3[1] <= lVar1) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if ((ulonglong)param_3[2] < 0x65) {
plVar11 = param_3 + (lVar1 + 2) * 2;
}
else {
plVar11 = (longlong *)(lVar1 * 0x10 + *param_3);
}
*plVar11 = (longlong)local_a8;
plVar11[1] = (longlong)(param_3 + 0xcc);
puVar4 = puVar5;
if ((int)plVar14[6] != 0) {
puVar4 = (undefined8 *)plVar14[5];
}
lVar1 = param_3[1];
local_a8 = (int *)CONCAT44(local_a8._4_4_,(int)plVar14[6]);
if (lVar1 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
sVar15 = 0xffffffffffffffff;
FUN_1400d3a20(param_3,lVar1 + 1,-1);
if (param_3[1] <= lVar1) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if ((ulonglong)param_3[2] < 0x65) {
plVar11 = param_3 + (lVar1 + 2) * 2;
}
else {
plVar11 = (longlong *)(lVar1 * 0x10 + *param_3);
}
*plVar11 = (longlong)local_a8;
plVar11[1] = (longlong)puVar4;
*(int *)(param_3 + 0xd6) = (int)plVar14[9];
iVar18 = (int)param_3[0xd2];
if (-1 < iVar18) {
lVar1 = param_3[0xd2];
FUN_1400d3c80((longlong)(param_3 + 0xcf),(int)lVar1 + 1,sVar15);
iVar17 = (int)lVar1 - iVar18;
if (0 < iVar17) {
puVar4 = puVar5;
if ((int)param_3[0xd2] != 0) {
puVar4 = (undefined8 *)param_3[0xd1];
}
sVar15 = (longlong)iVar17 << 3;
memmove(puVar4 + (longlong)iVar18 + 1,puVar4 + iVar18,sVar15);
}
if ((int)param_3[0xd2] != 0) {
puVar5 = (undefined8 *)param_3[0xd1];
}
puVar5[iVar18] = plVar14;
if ((longlong *)plVar14[2] == (longlong *)0x0) {
return;
}
FUN_1400d3410((longlong *)plVar14[2],plVar14,sVar15,param_4);
return;
}
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
puVar4 = (undefined8 *)((longlong)puVar4 + 1);
psVar8 = psVar8 + 0x1c;
} while ((longlong)puVar4 < 6);
iVar18 = -1;
plVar14 = param_3;
if (*(int *)(param_1 + 0xd8) == 0) {
*(int *)(param_1 + 0xea) = *(int *)(param_1 + 0xea) + 1;
local_a8 = (int *)(param_1 + 0x14);
param_1[0xe0] = 0;
param_1[0xe1] = 0;
param_1[0xe2] = 0;
param_1[0xe3] = 0;
param_1[0xe4] = 0;
param_1[0xe5] = 0;
param_1[0xe6] = 0;
param_1[0xe7] = 0;
param_1[0xe8] = 0;
param_1[0xe9] = 0;
local_res20 = 0;
puVar4 = puVar5;
do {
if ((local_res20 < 0) || (5 < local_res20)) {
/* WARNING: Subroutine does not return */
FUN_14006be30(local_res20,in_RDX,plVar14,param_4);
}
iVar17 = *local_a8;
while (0 < iVar17) {
plVar11 = *(longlong **)(local_a8 + -4);
if ((int)puVar4 == 0) {
iVar18 = *(int *)(param_1 + 0xd8);
if (iVar18 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
iVar17 = *(int *)(param_1 + 0xd8);
uVar7 = iVar17 + 1;
in_RDX = (longlong *)(ulonglong)uVar7;
FUN_1400d3c80((longlong)(param_1 + 0xcc),uVar7,(longlong)plVar14);
iVar17 = iVar17 - iVar18;
if (0 < iVar17) {
puVar9 = puVar5;
if (*(int *)(param_1 + 0xd8) != 0) {
puVar9 = *(undefined8 **)(param_1 + 0xd4);
}
in_RDX = puVar9 + iVar18;
plVar14 = (longlong *)((longlong)iVar17 << 3);
memmove(puVar9 + (longlong)iVar18 + 1,in_RDX,(size_t)plVar14);
}
puVar9 = puVar5;
if (*(int *)(param_1 + 0xd8) != 0) {
puVar9 = *(undefined8 **)(param_1 + 0xd4);
}
puVar9[iVar18] = plVar11;
*(int *)(param_1 + 0xe0) = *(int *)(param_1 + 0xe0) + (int)plVar11[6];
iVar18 = (int)plVar11[9];
}
else {
if ((DAT_1401ac118 <= (int)plVar11[6] + *(int *)(param_1 + 0xe0)) ||
(iVar18 != (int)plVar11[9])) goto LAB_1400d4b9d;
iVar17 = *(int *)(param_1 + 0xd8);
if (iVar17 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
iVar13 = *(int *)(param_1 + 0xd8);
uVar7 = iVar13 + 1;
in_RDX = (longlong *)(ulonglong)uVar7;
FUN_1400d3c80((longlong)(param_1 + 0xcc),uVar7,(longlong)plVar14);
iVar13 = iVar13 - iVar17;
if (0 < iVar13) {
puVar9 = puVar5;
if (*(int *)(param_1 + 0xd8) != 0) {
puVar9 = *(undefined8 **)(param_1 + 0xd4);
}
in_RDX = puVar9 + iVar17;
plVar14 = (longlong *)((longlong)iVar13 << 3);
memmove(puVar9 + (longlong)iVar17 + 1,in_RDX,(size_t)plVar14);
}
puVar9 = puVar5;
if (*(int *)(param_1 + 0xd8) != 0) {
puVar9 = *(undefined8 **)(param_1 + 0xd4);
}
puVar9[iVar17] = plVar11;
*(int *)(param_1 + 0xe0) = *(int *)(param_1 + 0xe0) + (int)plVar11[6];
}
if ((longlong *)plVar11[2] != (longlong *)0x0) {
FUN_1400d3410((longlong *)plVar11[2],plVar11,plVar14,param_4);
in_RDX = plVar11;
}
puVar4 = (undefined8 *)(ulonglong)((int)puVar4 + 1);
iVar17 = *local_a8;
}
local_res20 = local_res20 + 1;
local_a8 = local_a8 + 0xe;
} while (local_res20 < 6);
LAB_1400d4b9d:
}
if (*(int *)(param_1 + 0xe0) < 1) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
FUN_1400d4340(param_3,in_RDX,(longlong)plVar14);
*(undefined4 *)(param_3 + 0xd5) = *(undefined4 *)(param_1 + 0xbc);
local_a8 = (int *)CONCAT44(local_a8._4_4_,0x10);
*(short *)((longlong)param_3 + 0x6ac) = param_1[0xbe];
iVar17 = *(int *)(param_1 + 0xe0) - *(int *)(param_1 + 0xe4);
if (DAT_1401ac118 < *(int *)(param_1 + 0xe0) - *(int *)(param_1 + 0xe4)) {
iVar17 = DAT_1401ac118;
}
param_3[0xce] = *(longlong *)(param_1 + 200);
*(undefined2 *)(param_3 + 0xcc) = 0xabcd;
*(short *)((longlong)param_3 + 0x662) = param_1[0xc0];
*(undefined4 *)((longlong)param_3 + 0x664) = *(undefined4 *)(param_1 + 0xe0);
*(undefined4 *)(param_3 + 0xcd) = *(undefined4 *)(param_1 + 0xea);
*(undefined4 *)((longlong)param_3 + 0x66c) = *(undefined4 *)(param_1 + 0xe2);
lVar1 = param_3[1];
if (-1 < lVar1) {
lVar10 = lVar1 + 1;
sVar15 = 0xffffffffffffffff;
plVar14 = param_3;
FUN_1400d3a20(param_3,lVar10,-1);
if (param_3[1] <= lVar1) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if ((ulonglong)param_3[2] < 0x65) {
plVar11 = param_3 + (lVar1 + 2) * 2;
}
else {
plVar11 = (longlong *)(lVar1 * 0x10 + *param_3);
}
*plVar11 = (longlong)local_a8;
plVar11[1] = (longlong)(param_3 + 0xcc);
*(int *)(param_3 + 0xd6) = iVar18;
iVar18 = *(int *)(param_1 + 0xe4);
iVar13 = iVar18;
while( true ) {
if (iVar18 + iVar17 <= iVar13) {
*(int *)(param_1 + 0xe2) = *(int *)(param_1 + 0xe2) + 1;
if (*(int *)(param_1 + 0xe4) == *(int *)(param_1 + 0xe0)) {
iVar18 = *(int *)(param_1 + 0xd8);
puVar4 = puVar5;
if (*(int *)(param_1 + 0xd8) != 0) {
puVar4 = *(undefined8 **)(param_1 + 0xd4);
}
if (iVar18 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if (iVar18 != 0) {
lVar1 = param_3[0xd2];
FUN_1400d3c80((longlong)(param_3 + 0xcf),(int)lVar1 + iVar18,sVar15);
puVar9 = puVar5;
if ((int)param_3[0xd2] != 0) {
puVar9 = (undefined8 *)param_3[0xd1];
}
sVar15 = (longlong)iVar18 << 3;
if (sVar15 < 0x21) {
puVar9 = puVar9 + (int)lVar1;
for (uVar16 = (longlong)iVar18 & 0x1fffffffffffffff; uVar16 != 0; uVar16 = uVar16 - 1)
{
uVar3 = *puVar4;
puVar4 = puVar4 + 1;
*puVar9 = uVar3;
puVar9 = puVar9 + 1;
}
sVar15 = 0;
}
else {
memcpy(puVar9 + (int)lVar1,puVar4,sVar15);
}
}
FUN_1400d3c80((longlong)(param_1 + 0xcc),0,sVar15);
}
lVar1 = param_3[1];
puVar4 = puVar5;
puVar9 = puVar5;
if (0 < lVar1) {
do {
if (((longlong)puVar5 < 0) || (lVar1 <= (longlong)puVar5)) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if ((ulonglong)param_3[2] < 0x65) {
plVar14 = param_3 + ((longlong)puVar5 + 2) * 2;
}
else {
plVar14 = (longlong *)((longlong)puVar5 * 0x10 + *param_3);
}
uVar12 = (int)puVar9 + (int)*plVar14;
uVar7 = (int)puVar4 + 1;
puVar5 = (undefined8 *)(longlong)(int)uVar7;
puVar4 = (undefined8 *)(ulonglong)uVar7;
puVar9 = (undefined8 *)(ulonglong)uVar12;
} while ((longlong)puVar5 < lVar1);
}
FUN_1400f94b0((longlong)(param_1 + 0xec),uVar12);
*(undefined8 *)(param_1 + 0x100) = param_2;
*(double *)(param_1 + 0xf8) = (double)(int)uVar12 + *(double *)(param_1 + 0xf8);
return;
}
iVar13 = *(int *)(param_1 + 0xe8);
if ((iVar13 < 0) || (*(int *)(param_1 + 0xd8) <= iVar13)) {
/* WARNING: Subroutine does not return */
FUN_14006be30(plVar14,lVar10,sVar15,param_3);
}
lVar1 = *(longlong *)(*(longlong *)(param_1 + 0xd4) + (longlong)iVar13 * 8);
iVar13 = *(int *)(lVar1 + 0x30) - *(int *)(param_1 + 0xe6);
iVar6 = (iVar18 - *(int *)(param_1 + 0xe4)) + iVar17;
if (iVar6 < iVar13) {
iVar13 = iVar6;
}
if (iVar13 < 1) break;
puVar4 = puVar5;
if (*(int *)(lVar1 + 0x30) != 0) {
puVar4 = *(undefined8 **)(lVar1 + 0x28);
}
iVar6 = *(int *)(param_1 + 0xe6);
lVar2 = param_3[1];
local_a8._4_4_ = (undefined4)((ulonglong)local_a8 >> 0x20);
local_a8 = (int *)CONCAT44(local_a8._4_4_,iVar13);
if (lVar2 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
lVar10 = lVar2 + 1;
sVar15 = 0xffffffffffffffff;
plVar14 = param_3;
FUN_1400d3a20(param_3,lVar10,-1);
if (param_3[1] <= lVar2) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if ((ulonglong)param_3[2] < 0x65) {
plVar11 = param_3 + (lVar2 + 2) * 2;
}
else {
plVar11 = (longlong *)(lVar2 * 0x10 + *param_3);
}
*plVar11 = (longlong)local_a8;
plVar11[1] = (longlong)iVar6 + (longlong)puVar4;
*(int *)(param_1 + 0xe6) = *(int *)(param_1 + 0xe6) + iVar13;
*(int *)(param_1 + 0xe4) = *(int *)(param_1 + 0xe4) + iVar13;
if (*(int *)(param_1 + 0xe6) == *(int *)(lVar1 + 0x30)) {
*(int *)(param_1 + 0xe8) = *(int *)(param_1 + 0xe8) + 1;
param_1[0xe6] = 0;
param_1[0xe7] = 0;
}
iVar13 = *(int *)(param_1 + 0xe4);
}
FUN_1400d41c0(param_1);
FUN_14006ba50(local_98,L"Unexpected at PacketQueue Pop!",sVar15,param_3);
/* WARNING: Subroutine does not return */
_CxxThrowException(local_98,(ThrowInfo *)&DAT_1401a93e8);
}
/* WARNING: Subroutine does not return */
FUN_14006be00();
}