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

523 lines
17 KiB
C

/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
* Ghidra 12.1.2 decompiler output for 0x1400b2080 FUN_1400b2080
* Pseudocode, not original source. */
void FUN_1400b2080(longlong *param_1,int *param_2,byte *param_3,byte *param_4,int *param_5,
int *param_6)
{
byte bVar1;
int iVar2;
uint uVar3;
longlong lVar4;
ulonglong uVar5;
undefined8 *puVar6;
undefined8 uVar7;
undefined8 *puVar8;
undefined8 *puVar9;
uint *puVar10;
int *piVar11;
longlong *plVar12;
uint uVar13;
uint uVar14;
undefined4 *puVar15;
undefined4 *puVar16;
uint *puVar17;
uint uVar18;
ulonglong *puVar20;
IMAGE_DOS_HEADER *pIVar21;
uint *puVar22;
uint uVar23;
size_t sVar24;
byte *pbVar25;
byte *pbVar26;
uint **ppuVar27;
undefined8 *local_res10;
byte *local_res18;
byte *local_res20;
undefined8 in_stack_fffffffffffffdd8;
undefined4 uVar28;
uint *local_218;
uint *local_210;
int local_208;
undefined8 local_200;
uint local_1f8;
undefined8 local_1e8;
undefined8 local_1e0;
undefined8 *local_1d8;
undefined8 local_1d0;
undefined8 local_1c8;
longlong local_1b0;
byte *local_188;
undefined1 local_180;
uint *local_178;
ulonglong local_170;
longlong local_168;
longlong local_160;
longlong local_158;
undefined **local_150;
undefined8 local_148;
undefined8 local_140;
undefined8 local_138;
undefined8 local_130;
undefined **local_128;
undefined8 local_120;
undefined8 local_118;
undefined8 local_110;
undefined8 local_108;
undefined **local_100;
undefined8 local_f8;
undefined8 local_f0;
undefined8 local_e8;
undefined8 local_e0;
undefined8 local_c8;
undefined8 **ppuVar19;
uVar28 = (undefined4)((ulonglong)in_stack_fffffffffffffdd8 >> 0x20);
local_c8 = 0xfffffffffffffffe;
iVar2 = *param_2;
local_res18 = param_3;
local_res20 = param_4;
if (iVar2 != 0) {
if (iVar2 == 1) {
puVar22 = (uint *)(param_2 + 2);
local_1f8 = (int)(*puVar22 + ((int)*puVar22 >> 0x1f & 7U)) >> 3;
local_res10 = (undefined8 *)((ulonglong)local_res10 & 0xffffffffffffff00);
pbVar25 = param_3;
pbVar26 = param_4;
local_218 = puVar22;
local_188 = (byte *)FUN_1400adf90(param_1,param_2[0xc],param_3,param_4);
(**(code **)(param_1[0xf] + 0x18))();
iVar2 = 0;
local_200 = (int *)((ulonglong)local_200._4_4_ << 0x20);
puVar10 = (uint *)&local_200;
puVar17 = puVar22;
local_178 = puVar22;
uVar7 = FUN_1400bd2e0(puVar22,puVar10,pbVar25,pbVar26);
if ((char)uVar7 != '\0') {
for (; local_208 = iVar2, iVar2 < (int)param_1[9]; iVar2 = iVar2 + 1) {
if ((iVar2 < 0) || ((int)param_1[9] <= iVar2)) {
/* WARNING: Subroutine does not return */
FUN_14006be30(puVar17,puVar10,pbVar25,pbVar26);
}
plVar12 = *(longlong **)(param_1[8] + (longlong)iVar2 * 8);
FUN_1400bc600((int *)local_178,(ulonglong)local_1f8,pbVar25,pbVar26);
*(undefined2 *)(plVar12 + 1) = 0;
puVar10 = puVar22;
pbVar25 = local_188;
bVar1 = (**(code **)(*plVar12 + 0x10))(plVar12);
local_res10 = (undefined8 *)CONCAT71(local_res10._1_7_,(byte)local_res10 | bVar1);
*param_3 = *param_3 | *(byte *)(plVar12 + 1);
puVar17 = (uint *)(ulonglong)*(byte *)((longlong)plVar12 + 9);
*param_4 = *param_4 | *(byte *)((longlong)plVar12 + 9);
if (((bVar1 != 0) && (plVar12 != param_1 + 0x307)) && (plVar12 != param_1 + 0x2fe)) {
*param_5 = *param_5 + 1;
}
}
if ((byte)local_res10 != '\0') {
return;
}
}
FUN_1400bc600((int *)local_178,(ulonglong)local_1f8,pbVar25,pbVar26);
if (param_1[0x2b0] == 0) {
return;
}
*param_6 = *param_6 + 1;
(**(code **)(*(longlong *)param_1[0x2b0] + 0x28))
((longlong *)param_1[0x2b0],(ulonglong)local_200 & 0xffffffff);
return;
}
if (iVar2 != 2) {
return;
}
puVar22 = (uint *)(param_2 + 2);
pbVar25 = param_3;
pbVar26 = param_4;
local_218 = puVar22;
lVar4 = FUN_1400adf90(param_1,param_2[0xc],param_3,param_4);
(**(code **)(param_1[0xf] + 0x18))();
if (param_1[0x2b0] == 0) {
return;
}
ppuVar19 = &local_res10;
uVar5 = FUN_1400bcfd0(puVar22,ppuVar19,pbVar25,pbVar26);
if ((char)uVar5 != '\0') {
uVar3 = *puVar22;
uVar18 = (int)uVar3 >> 0x1f & 7;
ppuVar19 = (undefined8 **)(ulonglong)uVar18;
iVar2 = FUN_14007c120((longlong)puVar22,ppuVar19,pbVar25,pbVar26);
if ((int)local_res10 == iVar2 - ((int)(uVar18 + uVar3) >> 3)) {
*(undefined1 *)(param_1[0x2b0] + 8) = 0;
*(undefined1 *)(param_1[0x2b0] + 9) = 0;
FUN_140078060((undefined1 *)&local_1e8);
local_1e8 = (undefined **)CONCAT44(param_2[0xc],(undefined4)local_1e8);
local_1e8 = (undefined **)CONCAT71(local_1e8._1_7_,(char)param_2[0x12]);
uVar3 = *puVar22;
uVar18 = (int)uVar3 >> 0x1f & 7;
local_1b0 = lVar4;
lVar4 = FUN_1400a1cc0((longlong)puVar22,(ulonglong)uVar18,pbVar25,pbVar26);
(**(code **)(*(longlong *)param_1[0x2b0] + 0x30))
((longlong *)param_1[0x2b0],param_2[0xc],&local_1e8,
lVar4 + ((int)(uVar3 + uVar18) >> 3),CONCAT44(uVar28,(int)local_res10));
*param_3 = *param_3 | *(byte *)(param_1[0x2b0] + 8);
*param_4 = *param_4 | *(byte *)(param_1[0x2b0] + 9);
*param_5 = *param_5 + 1;
return;
}
}
local_188 = (byte *)FUN_14006cbf0(0x60);
if (local_188 == (byte *)0x0) {
puVar6 = (undefined8 *)0x0;
}
else {
puVar6 = FUN_1400789e0((undefined8 *)local_188,ppuVar19,pbVar25,pbVar26);
}
puVar16 = (undefined4 *)0x0;
FUN_1400641d0((longlong *)&local_res10,(longlong)puVar6,pbVar25,pbVar26);
puVar15 = puVar16;
if (local_res10 != (undefined8 *)0x0) {
puVar15 = (undefined4 *)local_res10[7];
}
*puVar15 = 0x1f;
if (local_res10 != (undefined8 *)0x0) {
puVar16 = (undefined4 *)local_res10[7];
}
FUN_140008030((longlong *)(puVar16 + 4),L"Invalid payload size in User Message!",pbVar25,pbVar26
);
local_170 = 0;
FUN_140078ae0(&local_170,(ulonglong *)&local_res10,pbVar25,pbVar26);
puVar20 = &local_170;
(**(code **)(*param_1 + 0x80))(param_1);
FUN_140064150((longlong *)&local_res10,puVar20,pbVar25,pbVar26);
return;
}
pbVar25 = param_3;
pbVar26 = param_4;
(**(code **)(param_1[0xf] + 0x18))();
if (param_1[0x2b0] == 0) {
return;
}
local_200 = param_2 + 0x14;
*(undefined1 *)(param_1[0x2b0] + 8) = 0;
*(undefined1 *)(param_1[0x2b0] + 9) = 0;
uVar3 = *local_200 - 1;
if (0x14 < uVar3) {
return;
}
pIVar21 = &IMAGE_DOS_HEADER_140000000;
switch(*local_200) {
case 1:
iVar2 = FUN_14007c0b0((longlong *)(param_2 + 0x28),&IMAGE_DOS_HEADER_140000000,pbVar25,pbVar26);
sVar24 = (size_t)iVar2;
puVar8 = (undefined8 *)FUN_14007c0e0((longlong *)(param_2 + 0x28),pIVar21,pbVar25,pbVar26);
local_1e8 = Proud::CFastArray<unsigned_char,1>::vftable;
puVar6 = (undefined8 *)0x0;
local_1e0 = 0;
local_1d8 = (undefined8 *)0x0;
local_1d0 = 0;
local_1c8 = 0;
if (iVar2 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
FUN_1400146f0((longlong)&local_1e8,iVar2,(SIZE_T)pbVar25);
puVar9 = local_1d8;
if ((int)local_1d0 == 0) {
puVar9 = puVar6;
}
FUN_140006500(puVar9,puVar8,sVar24);
local_1e8 = Proud::ByteArray::vftable;
local_res10 = (undefined8 *)FUN_14006cbf0(0x60);
puVar9 = puVar6;
if (local_res10 != (undefined8 *)0x0) {
puVar9 = FUN_1400789e0(local_res10,puVar8,sVar24,pbVar26);
}
plVar12 = FUN_1400641d0(&local_158,(longlong)puVar9,sVar24,pbVar26);
if (*plVar12 != 0) {
puVar6 = *(undefined8 **)(*plVar12 + 0x38);
}
puVar8 = &local_1e8;
(**(code **)(*(longlong *)param_1[0x2b0] + 0x38))();
FUN_140064150(&local_158,puVar6,puVar8,pbVar26);
FUN_140078360(&local_1e8);
break;
case 2:
FUN_14006cb70(IMAGE_DOS_HEADER_140000000.e_magic +
(&switchD_1400b246b::switchdataD_1400b2b8c)[(int)uVar3],
&IMAGE_DOS_HEADER_140000000,pbVar25,pbVar26);
local_210 = (uint *)PTR_DAT_1401ac010;
uVar18 = FUN_14006c9f0(&DAT_14015cd00);
local_res10 = (undefined8 *)CONCAT44(local_res10._4_4_,uVar18);
puVar22 = (uint *)0x0;
uVar23 = 0;
uVar3 = uVar23;
if ((local_210 != (uint *)0x0) && (local_210 != (uint *)PTR_DAT_1401ac010)) {
uVar3 = local_210[-2];
}
uVar13 = uVar18;
if ((((int)uVar18 <= (int)uVar3) && (uVar13 = uVar23, local_210 != (uint *)0x0)) &&
(local_210 != (uint *)PTR_DAT_1401ac010)) {
uVar13 = local_210[-2];
}
uVar3 = 1;
if (1 < (int)uVar13) {
uVar3 = uVar13;
}
uVar13 = uVar23;
if ((local_210 != (uint *)0x0) && (local_210 != (uint *)PTR_DAT_1401ac010)) {
uVar13 = local_210[-2];
}
uVar14 = 0;
if ((int)uVar13 < (int)uVar3) {
if (local_210 == (uint *)0x0) {
local_210 = (uint *)PTR_DAT_1401ac010;
}
if ((int)uVar3 < 0) {
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if (uVar3 == 0) {
FUN_1400031e0((longlong *)&local_210,PTR_DAT_1401ac010,pbVar25,pbVar26);
}
else {
uVar13 = uVar14;
if ((local_210 != (uint *)0x0) && (local_210 != (uint *)PTR_DAT_1401ac010)) {
uVar13 = local_210[-2];
}
if (uVar3 != uVar13) {
puVar10 = (uint *)FUN_14006cbf0((longlong)(int)uVar3 * 2 + 10);
if (puVar10 != (uint *)0x0) {
*puVar10 = 0;
puVar10[1] = 1;
}
*puVar10 = uVar3;
uVar18 = uVar14;
if ((local_210 != (uint *)0x0) && (local_210 != (uint *)PTR_DAT_1401ac010)) {
uVar18 = local_210[-2];
}
puVar17 = (uint *)PTR_DAT_1401ac010;
if ((int)uVar3 < (int)uVar18) {
LAB_1400b2674:
if (local_210 != (uint *)0x0) {
puVar17 = local_210;
}
}
else {
uVar3 = uVar23;
if (local_210 != (uint *)0x0) {
if (local_210 != (uint *)PTR_DAT_1401ac010) {
uVar3 = local_210[-2];
}
goto LAB_1400b2674;
}
}
uVar5 = (ulonglong)uVar3;
FUN_14006ca20(puVar10 + 2,puVar17,uVar3);
FUN_1400031e0((longlong *)&local_210,puVar17,uVar5,pbVar26);
uVar18 = (uint)local_res10;
local_210 = puVar10 + 2;
}
}
}
FUN_140002e40((longlong *)&local_210);
puVar10 = local_210;
if (local_210 == (uint *)0x0) {
puVar10 = (uint *)PTR_DAT_1401ac010;
}
FUN_14006ca20(puVar10,&DAT_14015cd00,uVar18);
puVar10 = local_210;
if (local_210 == (uint *)0x0) {
puVar10 = (uint *)PTR_DAT_1401ac010;
}
uVar18 = FUN_14006c9f0((short *)puVar10);
uVar3 = 0;
if (0 < (int)uVar18) {
uVar3 = uVar18;
}
uVar18 = uVar14;
if ((local_210 != (uint *)0x0) && (local_210 != (uint *)PTR_DAT_1401ac010)) {
uVar18 = local_210[-2];
}
if (((int)uVar3 < (int)uVar18) || (uVar3 = uVar14, local_210 == (uint *)0x0)) {
LAB_1400b2718:
if (((local_210 != (uint *)PTR_DAT_1401ac010) && (local_210 != (uint *)0x0)) &&
(local_210 + -2 != (uint *)0x0)) {
local_210[-2] = uVar3;
*(undefined2 *)((longlong)local_210 + (longlong)(int)uVar3 * 2) = 0;
}
}
else if (local_210 != (uint *)PTR_DAT_1401ac010) {
uVar3 = local_210[-2];
goto LAB_1400b2718;
}
local_120 = 0;
local_118 = 0;
local_110 = 0;
local_108 = 0;
local_128 = Proud::ByteArray::vftable;
puVar10 = puVar22;
if (*(longlong *)(param_2 + 0x16) != 0) {
puVar10 = *(uint **)(*(longlong *)(param_2 + 0x16) + 0x38);
}
ppuVar27 = &local_210;
uVar7 = 1;
uVar5 = (ulonglong)*puVar10;
FUN_140078c10((longlong *)&local_218,uVar5,1,(longlong *)ppuVar27,(longlong)&local_128);
FUN_140078360(&local_128);
puVar10 = local_210;
if (((local_210 != (uint *)0x0) && (local_210 != (uint *)PTR_DAT_1401ac010)) &&
(puVar17 = local_210 + -2, puVar17 != (uint *)0x0)) {
piVar11 = (int *)FUN_14006cb70(PTR_DAT_1401ac010,uVar5,uVar7,ppuVar27);
local_180 = 0;
local_188 = (byte *)piVar11;
FUN_14006b350(piVar11);
local_180 = 1;
puVar10 = puVar10 + -1;
*puVar10 = *puVar10 - 1;
if (*puVar10 == 0) {
FUN_14006cc60(puVar17);
}
FUN_14006b3e0((longlong)piVar11);
param_3 = local_res18;
}
local_210 = (uint *)PTR_DAT_1401ac010;
puVar10 = puVar22;
if (local_218 != (uint *)0x0) {
puVar10 = *(uint **)(local_218 + 0xe);
}
puVar10[8] = param_2[0x40];
*(short *)(puVar10 + 9) = (short)param_2[0x41];
puVar10 = puVar22;
if (local_218 != (uint *)0x0) {
puVar10 = *(uint **)(local_218 + 0xe);
}
puVar10[2] = param_2[0x42];
local_1e0 = 0;
local_1d8 = (undefined8 *)0x0;
local_1d0 = 0;
local_1c8 = 0;
local_1e8 = Proud::ByteArray::vftable;
if (*(longlong *)(param_2 + 0x28) != 0) {
uVar3 = *(uint *)(*(longlong *)(param_2 + 0x28) + 0x18);
LAB_1400b28eb:
if (0 < (int)uVar3) {
/* WARNING: Subroutine does not return */
FUN_14006be30((ulonglong)uVar3,uVar5,uVar7,ppuVar27);
}
/* WARNING: Subroutine does not return */
FUN_14006be00();
}
if (*(longlong *)(param_2 + 0x2a) != 0) {
if (*(longlong *)(param_2 + 0x2a) == 0) {
/* WARNING: Subroutine does not return */
FUN_1400d1900(puVar10,uVar5,uVar7,ppuVar27);
}
uVar3 = param_2[0x2c];
goto LAB_1400b28eb;
}
if (local_218 != (uint *)0x0) {
puVar22 = *(uint **)(local_218 + 0xe);
}
puVar6 = &local_1e8;
(**(code **)(*(longlong *)param_1[0x2b0] + 0x38))();
FUN_140078360(&local_1e8);
FUN_140064150((longlong *)&local_218,puVar22,puVar6,ppuVar27);
break;
case 3:
uVar7 = 0;
if (*(longlong *)(param_2 + 0x16) != 0) {
uVar7 = *(undefined8 *)(*(longlong *)(param_2 + 0x16) + 0x38);
}
(**(code **)(*(longlong *)param_1[0x2b0] + 0x40))((longlong *)param_1[0x2b0],uVar7);
break;
default:
goto switchD_1400b246b_caseD_4;
case 8:
(**(code **)(*(longlong *)param_1[0x2b0] + 0x48))
((longlong *)param_1[0x2b0],param_2[0x2f],param_2[0x2e],param_2[0x3c],param_2 + 0x32);
break;
case 9:
(**(code **)(*(longlong *)param_1[0x2b0] + 0x50))
((longlong *)param_1[0x2b0],param_2[0x2f],param_2[0x2e],param_2[0x3c]);
FUN_1400add80(param_1,param_2[0x2f]);
break;
case 10:
(**(code **)(*(longlong *)param_1[0x2b0] + 0x58))((longlong *)param_1[0x2b0],param_2[0x30],0);
break;
case 0xb:
puVar16 = (undefined4 *)0x0;
if (*(longlong *)(param_2 + 0x16) != 0) {
puVar16 = *(undefined4 **)(*(longlong *)(param_2 + 0x16) + 0x38);
}
(**(code **)(*(longlong *)param_1[0x2b0] + 0x58))
((longlong *)param_1[0x2b0],param_2[0x30],*puVar16);
break;
case 0xd:
if (param_1[0x2b0] != 0) {
puVar16 = (undefined4 *)0x0;
if (*(longlong *)(param_2 + 0x16) != 0) {
puVar16 = *(undefined4 **)(*(longlong *)(param_2 + 0x16) + 0x38);
}
(**(code **)(*(longlong *)param_1[0x2b0] + 0x60))((longlong *)param_1[0x2b0],*puVar16);
}
break;
case 0xe:
(**(code **)(*(longlong *)param_1[0x2b0] + 0x68))();
break;
case 0x14:
puVar22 = (uint *)0x0;
local_f8 = 0;
local_f0 = 0;
local_e8 = 0;
local_e0 = 0;
local_100 = Proud::ByteArray::vftable;
lVar4 = *(longlong *)(param_2 + 0x16);
puVar17 = puVar22;
puVar10 = puVar22;
if (lVar4 != 0) {
puVar17 = *(uint **)(lVar4 + 0x38);
puVar10 = *(uint **)(lVar4 + 0x38);
}
puVar10 = puVar10 + 4;
uVar5 = (ulonglong)(uint)param_2[0x30];
plVar12 = FUN_140078c10(&local_160,(ulonglong)*puVar17,uVar5,(longlong *)puVar10,
(longlong)&local_100);
if (*plVar12 != 0) {
puVar22 = *(uint **)(*plVar12 + 0x38);
}
(**(code **)(*(longlong *)param_1[0x2b0] + 8))();
FUN_140064150(&local_160,puVar22,uVar5,puVar10);
FUN_140078360(&local_100);
break;
case 0x15:
puVar22 = (uint *)0x0;
local_148 = 0;
local_140 = 0;
local_138 = 0;
local_130 = 0;
local_150 = Proud::ByteArray::vftable;
lVar4 = *(longlong *)(param_2 + 0x16);
puVar17 = puVar22;
puVar10 = puVar22;
if (lVar4 != 0) {
puVar17 = *(uint **)(lVar4 + 0x38);
puVar10 = *(uint **)(lVar4 + 0x38);
}
puVar10 = puVar10 + 4;
uVar5 = (ulonglong)(uint)param_2[0x30];
plVar12 = FUN_140078c10(&local_168,(ulonglong)*puVar17,uVar5,(longlong *)puVar10,
(longlong)&local_150);
if (*plVar12 != 0) {
puVar22 = *(uint **)(*plVar12 + 0x38);
}
(**(code **)(*(longlong *)param_1[0x2b0] + 0x10))();
FUN_140064150(&local_168,puVar22,uVar5,puVar10);
FUN_140078360(&local_150);
}
*param_3 = *(byte *)(param_1[0x2b0] + 8);
*param_4 = *(byte *)(param_1[0x2b0] + 9);
*param_6 = *param_6 + 1;
switchD_1400b246b_caseD_4:
return;
}