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

293 lines
9.1 KiB
C

/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
* Ghidra 12.1.2 decompiler output for 0x1400e40f0 FUN_1400e40f0
* Pseudocode, not original source. */
void FUN_1400e40f0(undefined ***param_1,uint *param_2,uint *param_3,undefined8 param_4)
{
undefined **ppuVar1;
uint uVar2;
uint uVar3;
longlong *plVar4;
uint *puVar5;
IMAGE_DOS_HEADER *pIVar6;
undefined ***pppuVar7;
ulonglong *puVar8;
undefined **ppuVar9;
ulonglong **ppuVar10;
uint uVar11;
uint uVar12;
int iVar13;
ulonglong uVar14;
undefined ***pppuVar15;
IMAGE_DOS_HEADER *pIVar16;
ulonglong uVar17;
ulonglong uVar18;
uint local_res8 [2];
IMAGE_DOS_HEADER *local_res10;
undefined **local_res18;
ulonglong *local_res20;
undefined1 local_c8 [40];
undefined **local_a0;
uint local_98;
word local_94;
undefined **local_90;
byte local_88 [32];
undefined ***local_68;
byte local_60;
longlong local_58;
byte local_50 [16];
local_50[0] = 0xfe;
local_50[1] = 0xff;
local_50[2] = 0xff;
local_50[3] = 0xff;
local_50[4] = 0xff;
local_50[5] = 0xff;
local_50[6] = 0xff;
local_50[7] = 0xff;
local_res10 = (IMAGE_DOS_HEADER *)param_2;
(**(code **)(param_1[0x21][0xf] + 0x10))();
local_a0 = Proud::AddrPort::vftable;
local_98 = param_3[0xe];
local_94 = (word)param_3[0xf];
pppuVar15 = &local_a0;
ppuVar10 = &local_res20;
plVar4 = FUN_1400ab340((longlong)param_1[0x21],ppuVar10,(longlong)pppuVar15);
puVar8 = (ulonglong *)*plVar4;
uVar14 = 0;
uVar18 = uVar14;
if (puVar8 != (ulonglong *)0x0) {
uVar18 = *puVar8;
}
if (local_res20 != (ulonglong *)0x0) {
local_res20[1] = local_res20[1] - 1;
puVar8 = (ulonglong *)local_res20[1];
if ((ulonglong *)local_res20[1] == (ulonglong *)0x0) {
if ((undefined8 *)*local_res20 != (undefined8 *)0x0) {
ppuVar10 = (ulonglong **)0x1;
(*(code *)**(undefined8 **)*local_res20)();
}
FUN_14006cc60(local_res20);
puVar8 = local_res20;
}
}
if ((uVar18 == 0) || (*(char *)(uVar18 + 0x650) != '\0')) {
if (*(longlong *)(param_3 + 2) == 0) {
if (*(longlong *)(param_3 + 4) == 0) {
/* WARNING: Subroutine does not return */
FUN_1400d1900(puVar8,ppuVar10,pppuVar15,param_4);
}
uVar2 = param_3[6];
}
else {
uVar2 = *(uint *)(*(longlong *)(param_3 + 2) + 0x18);
}
FUN_1400bcbc0(param_3,(ulonglong)(uVar2 - ((int)(*param_3 + ((int)*param_3 >> 0x1f & 7U)) >> 3))
,pppuVar15,param_4);
return;
}
local_c8._8_2_ = 0;
local_c8._10_2_ = 0;
local_c8._12_2_ = 0;
local_c8._14_2_ = 0;
local_c8._16_8_ = 0;
local_c8._24_2_ = 0;
local_c8._26_2_ = 0;
local_c8._28_2_ = 0;
local_c8._30_2_ = 0;
local_c8._0_8_ = Proud::CReceivedMessageList::vftable;
local_c8._32_2_ = 1000;
local_c8._34_2_ = 0;
local_c8._36_2_ = 1;
local_c8._38_2_ = 0;
pppuVar7 = (undefined ***)(uVar18 + 0x638);
pppuVar15 = (undefined ***)local_res8;
pIVar16 = (IMAGE_DOS_HEADER *)local_c8;
pIVar6 = (IMAGE_DOS_HEADER *)param_3;
FUN_1400f50a0((longlong *)pppuVar7,param_3,(ulonglong)pIVar16,(undefined4 *)pppuVar15);
if (local_res8[0] == 0) goto LAB_1400e4452;
FUN_14006cb70(pppuVar7,pIVar6,pIVar16,pppuVar15);
local_res18 = (undefined **)PTR_DAT_1401ac010;
uVar2 = FUN_14006c9f0(L"Stream Extract Error at Reliable UDP");
uVar12 = 0;
uVar17 = uVar14;
if ((local_res18 != (undefined **)0x0) &&
(uVar17 = 0, local_res18 != (undefined **)PTR_DAT_1401ac010)) {
uVar17 = (ulonglong)*(uint *)(local_res18 + -1);
}
uVar3 = uVar2;
if ((((int)uVar2 <= (int)uVar17) && (uVar3 = uVar12, local_res18 != (undefined **)0x0)) &&
(local_res18 != (undefined **)PTR_DAT_1401ac010)) {
uVar3 = *(uint *)(local_res18 + -1);
}
uVar11 = 1;
if (1 < (int)uVar3) {
uVar11 = uVar3;
}
uVar3 = uVar12;
if ((local_res18 != (undefined **)0x0) && (local_res18 != (undefined **)PTR_DAT_1401ac010)) {
uVar3 = *(uint *)(local_res18 + -1);
}
if ((int)uVar3 < (int)uVar11) {
if (local_res18 == (undefined **)0x0) {
local_res18 = (undefined **)PTR_DAT_1401ac010;
}
if ((int)uVar11 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if (uVar11 == 0) {
FUN_1400031e0((longlong *)&local_res18,PTR_DAT_1401ac010,uVar17,pppuVar15);
}
else {
uVar3 = uVar12;
if ((local_res18 != (undefined **)0x0) && (local_res18 != (undefined **)PTR_DAT_1401ac010)) {
uVar3 = *(uint *)(local_res18 + -1);
}
if (uVar11 != uVar3) {
puVar5 = (uint *)FUN_14006cbf0((longlong)(int)uVar11 * 2 + 10);
if (puVar5 != (uint *)0x0) {
*puVar5 = 0;
puVar5[1] = 1;
}
*puVar5 = uVar11;
uVar3 = uVar12;
if ((local_res18 != (undefined **)0x0) && (local_res18 != (undefined **)PTR_DAT_1401ac010))
{
uVar3 = *(uint *)(local_res18 + -1);
}
ppuVar9 = (undefined **)PTR_DAT_1401ac010;
if ((int)uVar11 < (int)uVar3) {
LAB_1400e42fb:
if (local_res18 != (undefined **)0x0) {
ppuVar9 = local_res18;
}
}
else {
uVar11 = uVar12;
if (local_res18 != (undefined **)0x0) {
if (local_res18 != (undefined **)PTR_DAT_1401ac010) {
uVar11 = *(uint *)(local_res18 + -1);
}
goto LAB_1400e42fb;
}
}
uVar17 = (ulonglong)uVar11;
FUN_14006ca20(puVar5 + 2,ppuVar9,uVar11);
FUN_1400031e0((longlong *)&local_res18,ppuVar9,uVar17,pppuVar15);
local_res18 = (undefined **)(puVar5 + 2);
}
}
}
FUN_140002e40((longlong *)&local_res18);
ppuVar9 = local_res18;
if (local_res18 == (undefined **)0x0) {
ppuVar9 = (undefined **)PTR_DAT_1401ac010;
}
FUN_14006ca20(ppuVar9,L"Stream Extract Error at Reliable UDP",uVar2);
ppuVar9 = local_res18;
if (local_res18 == (undefined **)0x0) {
ppuVar9 = (undefined **)PTR_DAT_1401ac010;
}
uVar3 = FUN_14006c9f0((short *)ppuVar9);
uVar2 = 0;
if (0 < (int)uVar3) {
uVar2 = uVar3;
}
uVar3 = uVar12;
if ((local_res18 != (undefined **)0x0) && (local_res18 != (undefined **)PTR_DAT_1401ac010)) {
uVar3 = *(uint *)(local_res18 + -1);
}
if (((int)uVar2 < (int)uVar3) || (uVar2 = uVar12, local_res18 == (undefined **)0x0)) {
LAB_1400e438e:
if (((local_res18 != (undefined **)PTR_DAT_1401ac010) && (local_res18 != (undefined **)0x0)) &&
(local_res18 + -1 != (undefined **)0x0)) {
*(uint *)(local_res18 + -1) = uVar2;
*(undefined2 *)((longlong)local_res18 + (longlong)(int)uVar2 * 2) = 0;
}
}
else if (local_res18 != (undefined **)PTR_DAT_1401ac010) {
uVar2 = *(uint *)(local_res18 + -1);
goto LAB_1400e438e;
}
local_88[0] = 0;
local_88[1] = 0;
local_88[2] = 0;
local_88[3] = 0;
local_88[4] = 0;
local_88[5] = 0;
local_88[6] = 0;
local_88[7] = 0;
local_88[8] = 0;
local_88[9] = 0;
local_88[10] = 0;
local_88[0xb] = 0;
local_88[0xc] = 0;
local_88[0xd] = 0;
local_88[0xe] = 0;
local_88[0xf] = 0;
local_88[0x10] = 0;
local_88[0x11] = 0;
local_88[0x12] = 0;
local_88[0x13] = 0;
local_88[0x14] = 0;
local_88[0x15] = 0;
local_88[0x16] = 0;
local_88[0x17] = 0;
local_88[0x18] = 0;
local_88[0x19] = 0;
local_88[0x1a] = 0;
local_88[0x1b] = 0;
local_88[0x1c] = 0;
local_88[0x1d] = 0;
local_88[0x1e] = 0;
local_88[0x1f] = 0;
local_90 = Proud::ByteArray::vftable;
pppuVar15 = &local_res18;
pIVar6 = (IMAGE_DOS_HEADER *)
FUN_140078c10(&local_58,(ulonglong)local_res8[0],(ulonglong)*(uint *)(uVar18 + 0x56c),
(longlong *)pppuVar15,(longlong)&local_90);
pIVar16 = (IMAGE_DOS_HEADER *)*param_1[0x21];
(**(code **)(pIVar16 + 1))();
pppuVar7 = &local_90;
FUN_140078360(pppuVar7);
ppuVar9 = local_res18;
param_2 = (uint *)local_res10;
if (((local_res18 != (undefined **)0x0) && (local_res18 != (undefined **)PTR_DAT_1401ac010)) &&
(ppuVar1 = local_res18 + -1, ppuVar1 != (undefined **)0x0)) {
pppuVar7 = (undefined ***)FUN_14006cb70(pppuVar7,pIVar6,pIVar16,pppuVar15);
local_68 = pppuVar7;
FUN_14006b350((int *)pppuVar7);
local_60 = 1;
puVar5 = (uint *)((longlong)ppuVar9 + -4);
*puVar5 = *puVar5 - 1;
if (*puVar5 == 0) {
FUN_14006cc60(ppuVar1);
}
FUN_14006b3e0((longlong)pppuVar7);
param_2 = (uint *)local_res10;
}
LAB_1400e4452:
while( true ) {
iVar13 = (int)uVar14;
if (iVar13 == local_c8._24_4_) {
FUN_1400c5af0((undefined8 *)local_c8);
return;
}
if ((iVar13 < 0) || ((int)local_c8._24_4_ <= iVar13)) break;
pIVar16 = (IMAGE_DOS_HEADER *)(local_c8._16_8_ + (longlong)iVar13 * 0x48);
pIVar16->e_program[0] = (byte)param_3[0x10];
pppuVar7 = param_1;
pIVar6 = (IMAGE_DOS_HEADER *)param_2;
FUN_1400e6e40((IMAGE_DOS_HEADER *)param_1,(IMAGE_DOS_HEADER *)param_2,pIVar16,pppuVar15);
if ((int)local_c8._24_4_ <= iVar13) {
/* WARNING: Subroutine does not return */
FUN_14006be30(pppuVar7,pIVar6,pIVar16,pppuVar15);
}
uVar14 = (ulonglong)(iVar13 + 1);
}
/* WARNING: Subroutine does not return */
FUN_14006be30(pppuVar7,pIVar6,pIVar16,pppuVar15);
}