server-re/decomp/DBCServer_Release_x64/full/functions/0x1401e73c0.c

393 lines
17 KiB
C

/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
* Ghidra 12.1.2 decompiler output for 0x1401e73c0 FUN_1401e73c0
* Pseudocode, not original source. */
uint FUN_1401e73c0(longlong *param_1,uint param_2)
{
char cVar1;
undefined2 uVar2;
int iVar3;
undefined8 *puVar4;
int *piVar5;
bool bVar6;
undefined4 uVar7;
int iVar8;
uint uVar9;
undefined1 uVar10;
ulonglong uVar11;
uint uVar12;
int iVar13;
ulonglong uVar14;
if (((param_1 == (longlong *)0x0) ||
(puVar4 = (undefined8 *)param_1[5], puVar4 == (undefined8 *)0x0)) || (5 < param_2)) {
return 0xfffffffe;
}
if (((param_1[2] == 0) || ((*param_1 == 0 && ((int)param_1[1] != 0)))) ||
((*(int *)(puVar4 + 1) == 0x29a && (param_2 != 4)))) {
param_1[4] = (longlong)"stream error";
return 0xfffffffe;
}
if ((int)param_1[3] == 0) {
param_1[4] = (longlong)"buffer error";
return 0xfffffffb;
}
iVar8 = *(int *)(puVar4 + 8);
*(uint *)(puVar4 + 8) = param_2;
*puVar4 = param_1;
iVar13 = 0;
if (*(int *)(puVar4 + 1) == 0x2a) {
if (*(int *)((longlong)puVar4 + 0x2c) == 2) {
uVar7 = FUN_1401c4210(0,0,0);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0x1f;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0x8b;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 8;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
piVar5 = (int *)puVar4[6];
uVar10 = 0;
if (piVar5 == (int *)0x0) {
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
if (*(int *)((longlong)puVar4 + 0xac) == 9) {
uVar10 = 2;
}
else if ((1 < *(int *)(puVar4 + 0x16)) || (*(int *)((longlong)puVar4 + 0xac) < 2)) {
uVar10 = 4;
}
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = uVar10;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = 0xb;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined4 *)(puVar4 + 1) = 0x71;
}
else {
*(byte *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
(-(*(longlong *)(piVar5 + 0xc) != 0) & 0x10U) + (-(piVar5[0xf] != 0) & 2U) +
(-(*(longlong *)(piVar5 + 8) != 0) & 8U) + (-(*(longlong *)(piVar5 + 4) != 0) & 4U) +
(*piVar5 != 0);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)(puVar4[6] + 4);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)(puVar4[6] + 5);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)(puVar4[6] + 6);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)(puVar4[6] + 7);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
if (*(int *)((longlong)puVar4 + 0xac) == 9) {
uVar10 = 2;
}
else if ((1 < *(int *)(puVar4 + 0x16)) || (*(int *)((longlong)puVar4 + 0xac) < 2)) {
uVar10 = 4;
}
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = uVar10;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)(puVar4[6] + 0xc);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
uVar11 = (ulonglong)*(uint *)(puVar4 + 5);
if (*(longlong *)(puVar4[6] + 0x10) != 0) {
*(undefined1 *)(uVar11 + puVar4[2]) = *(undefined1 *)(puVar4[6] + 0x18);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)(puVar4[6] + 0x19);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
uVar11 = (ulonglong)*(uint *)(puVar4 + 5);
}
if (*(int *)(puVar4[6] + 0x3c) != 0) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),puVar4[2],uVar11);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
*(undefined4 *)(puVar4 + 7) = 0;
*(undefined4 *)(puVar4 + 1) = 0x45;
}
}
else {
if ((*(int *)(puVar4 + 0x16) < 2) && (iVar3 = *(int *)((longlong)puVar4 + 0xac), 1 < iVar3)) {
if (iVar3 < 6) {
iVar13 = 1;
}
else {
iVar13 = (iVar3 != 6) + 2;
}
}
uVar12 = (*(int *)(puVar4 + 9) + -8) * 0x1000 + 0x800U | iVar13 << 6;
if (*(int *)((longlong)puVar4 + 0x94) != 0) {
uVar12 = uVar12 | 0x20;
}
*(undefined4 *)(puVar4 + 1) = 0x71;
iVar13 = (uVar12 / 0x1f + 1) * 0x1f;
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)((uint)iVar13 >> 8);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)iVar13;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
if (*(int *)((longlong)puVar4 + 0x94) != 0) {
uVar2 = *(undefined2 *)((longlong)param_1 + 0x4e);
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)((ushort)uVar2 >> 8);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)uVar2;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
uVar2 = *(undefined2 *)((longlong)param_1 + 0x4c);
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)((ushort)uVar2 >> 8);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)uVar2;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
}
*(undefined4 *)((longlong)param_1 + 0x4c) = 1;
}
}
if (*(int *)(puVar4 + 1) == 0x45) {
if (*(longlong *)(puVar4[6] + 0x10) != 0) {
uVar12 = *(uint *)(puVar4 + 5);
if (*(uint *)(puVar4 + 7) < (uint)*(ushort *)(puVar4[6] + 0x18)) {
do {
uVar9 = *(uint *)(puVar4 + 5);
if (uVar9 == *(uint *)(puVar4 + 3)) {
if ((*(int *)(puVar4[6] + 0x3c) != 0) && (uVar12 < uVar9)) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),
(ulonglong)uVar12 + puVar4[2],uVar9 - uVar12);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
FUN_1401e5b90(param_1);
uVar12 = *(uint *)(puVar4 + 5);
uVar9 = uVar12;
if (uVar12 == *(uint *)(puVar4 + 3)) break;
}
*(undefined1 *)((ulonglong)uVar9 + puVar4[2]) =
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 7) + *(longlong *)(puVar4[6] + 0x10));
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(int *)(puVar4 + 7) = *(int *)(puVar4 + 7) + 1;
} while (*(uint *)(puVar4 + 7) < (uint)*(ushort *)(puVar4[6] + 0x18));
}
if ((*(int *)(puVar4[6] + 0x3c) != 0) && (uVar12 < *(uint *)(puVar4 + 5))) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),
(ulonglong)uVar12 + puVar4[2],*(uint *)(puVar4 + 5) - uVar12);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
if (*(int *)(puVar4 + 7) != *(int *)(puVar4[6] + 0x18)) goto LAB_1401e7850;
*(undefined4 *)(puVar4 + 7) = 0;
}
*(undefined4 *)(puVar4 + 1) = 0x49;
}
LAB_1401e7850:
if (*(int *)(puVar4 + 1) == 0x49) {
if (*(longlong *)(puVar4[6] + 0x20) != 0) {
uVar11 = (ulonglong)*(uint *)(puVar4 + 5);
do {
uVar12 = *(uint *)(puVar4 + 5);
uVar14 = (ulonglong)uVar12;
if (uVar12 == *(uint *)(puVar4 + 3)) {
if ((*(int *)(puVar4[6] + 0x3c) != 0) && ((uint)uVar11 < uVar12)) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),uVar11 + puVar4[2],
uVar12 - (uint)uVar11);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
FUN_1401e5b90(param_1);
uVar11 = (ulonglong)*(uint *)(puVar4 + 5);
uVar14 = uVar11;
if (*(uint *)(puVar4 + 5) == *(uint *)(puVar4 + 3)) {
bVar6 = true;
goto LAB_1401e78e0;
}
}
cVar1 = *(char *)(*(longlong *)(puVar4[6] + 0x20) + (ulonglong)*(uint *)(puVar4 + 7));
*(uint *)(puVar4 + 7) = *(uint *)(puVar4 + 7) + 1;
*(char *)(uVar14 + puVar4[2]) = cVar1;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
} while (cVar1 != '\0');
bVar6 = false;
LAB_1401e78e0:
if (*(int *)(puVar4[6] + 0x3c) != 0) {
if ((uint)uVar11 < *(uint *)(puVar4 + 5)) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),uVar11 + puVar4[2],
*(uint *)(puVar4 + 5) - (uint)uVar11);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
}
if (bVar6) goto LAB_1401e7914;
*(undefined4 *)(puVar4 + 7) = 0;
}
*(undefined4 *)(puVar4 + 1) = 0x5b;
}
LAB_1401e7914:
if (*(int *)(puVar4 + 1) == 0x5b) {
if (*(longlong *)(puVar4[6] + 0x30) != 0) {
uVar11 = (ulonglong)*(uint *)(puVar4 + 5);
do {
uVar12 = *(uint *)(puVar4 + 5);
uVar14 = (ulonglong)uVar12;
if (uVar12 == *(uint *)(puVar4 + 3)) {
if ((*(int *)(puVar4[6] + 0x3c) != 0) && ((uint)uVar11 < uVar12)) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),uVar11 + puVar4[2],
uVar12 - (uint)uVar11);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
FUN_1401e5b90(param_1);
uVar11 = (ulonglong)*(uint *)(puVar4 + 5);
uVar14 = uVar11;
if (*(uint *)(puVar4 + 5) == *(uint *)(puVar4 + 3)) {
bVar6 = true;
goto LAB_1401e79a0;
}
}
cVar1 = *(char *)(*(longlong *)(puVar4[6] + 0x30) + (ulonglong)*(uint *)(puVar4 + 7));
*(uint *)(puVar4 + 7) = *(uint *)(puVar4 + 7) + 1;
*(char *)(uVar14 + puVar4[2]) = cVar1;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
} while (cVar1 != '\0');
bVar6 = false;
LAB_1401e79a0:
if (*(int *)(puVar4[6] + 0x3c) != 0) {
if ((uint)uVar11 < *(uint *)(puVar4 + 5)) {
uVar7 = FUN_1401c4210(*(undefined4 *)((longlong)param_1 + 0x4c),uVar11 + puVar4[2],
*(uint *)(puVar4 + 5) - (uint)uVar11);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
}
if (bVar6) goto LAB_1401e79d0;
}
*(undefined4 *)(puVar4 + 1) = 0x67;
}
LAB_1401e79d0:
if (*(int *)(puVar4 + 1) == 0x67) {
if (*(int *)(puVar4[6] + 0x3c) != 0) {
if (*(uint *)(puVar4 + 3) < *(int *)(puVar4 + 5) + 2U) {
FUN_1401e5b90(param_1);
}
if (*(uint *)(puVar4 + 3) < *(uint *)(puVar4 + 5) + 2) goto LAB_1401e7a3a;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0x4c);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0x4d);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
uVar7 = FUN_1401c4210(0,0,0);
*(undefined4 *)((longlong)param_1 + 0x4c) = uVar7;
}
*(undefined4 *)(puVar4 + 1) = 0x71;
}
LAB_1401e7a3a:
if (*(int *)(puVar4 + 5) == 0) {
if ((((int)param_1[1] == 0) && ((int)param_2 <= iVar8)) && (param_2 != 4)) goto LAB_1401e7a89;
LAB_1401e7a79:
if (*(int *)(puVar4 + 1) == 0x29a) {
if ((int)param_1[1] != 0) {
LAB_1401e7a89:
param_1[4] = (longlong)"buffer error";
return 0xfffffffb;
}
LAB_1401e7aa1:
if ((*(int *)((longlong)puVar4 + 0x9c) != 0) ||
((param_2 != 0 && (*(int *)(puVar4 + 1) != 0x29a)))) goto LAB_1401e7abd;
}
else {
if ((int)param_1[1] == 0) goto LAB_1401e7aa1;
LAB_1401e7abd:
if (*(int *)(puVar4 + 0x16) == 2) {
iVar8 = FUN_1401e7070();
}
else if (*(int *)(puVar4 + 0x16) == 3) {
iVar8 = FUN_1401e6cf0();
}
else {
iVar8 = (*(code *)(&PTR_FUN_140291928)[(longlong)*(int *)((longlong)puVar4 + 0xac) * 2])
(puVar4);
}
if ((iVar8 == 2) || (iVar8 == 3)) {
*(undefined4 *)(puVar4 + 1) = 0x29a;
}
if ((iVar8 == 0) || (iVar8 == 2)) {
if ((int)param_1[3] != 0) {
return 0;
}
goto LAB_1401e7a4e;
}
if (iVar8 == 1) {
if (param_2 == 1) {
FUN_1401ea130(puVar4);
}
else if ((param_2 != 5) && (FUN_1401ea090(puVar4,0,0,0), param_2 == 3)) {
*(undefined2 *)(puVar4[0xd] + (ulonglong)(*(int *)((longlong)puVar4 + 0x74) - 1) * 2) = 0;
memset((void *)puVar4[0xd],0,(ulonglong)(*(int *)((longlong)puVar4 + 0x74) - 1) * 2);
if (*(int *)((longlong)puVar4 + 0x9c) == 0) {
*(undefined4 *)((longlong)puVar4 + 0x94) = 0;
*(undefined4 *)((longlong)puVar4 + 0x84) = 0;
}
}
FUN_1401e5b90(param_1);
if ((int)param_1[3] == 0) goto LAB_1401e7a4e;
}
}
if (param_2 == 4) {
if (0 < *(int *)((longlong)puVar4 + 0x2c)) {
if (*(int *)((longlong)puVar4 + 0x2c) == 2) {
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0x4c);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0x4d);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0x4e);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0x4f);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0xc);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0xd);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0xe);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(undefined1 *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) =
*(undefined1 *)((longlong)param_1 + 0xf);
}
else {
uVar2 = *(undefined2 *)((longlong)param_1 + 0x4e);
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)((ushort)uVar2 >> 8);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)uVar2;
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
uVar2 = *(undefined2 *)((longlong)param_1 + 0x4c);
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)((ushort)uVar2 >> 8);
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
*(char *)((ulonglong)*(uint *)(puVar4 + 5) + puVar4[2]) = (char)uVar2;
}
*(int *)(puVar4 + 5) = *(int *)(puVar4 + 5) + 1;
FUN_1401e5b90(param_1);
if (0 < *(int *)((longlong)puVar4 + 0x2c)) {
*(int *)((longlong)puVar4 + 0x2c) = -*(int *)((longlong)puVar4 + 0x2c);
}
return (uint)(*(int *)(puVar4 + 5) == 0);
}
return 1;
}
}
else {
FUN_1401e5b90(param_1);
if ((int)param_1[3] != 0) goto LAB_1401e7a79;
LAB_1401e7a4e:
*(undefined4 *)(puVar4 + 8) = 0xffffffff;
}
return 0;
}