397 lines
12 KiB
C
397 lines
12 KiB
C
/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c
|
|
* Ghidra 12.1.2 decompiler output for 0x1401a0e20 FUN_1401a0e20
|
|
* Pseudocode, not original source. */
|
|
|
|
undefined8 FUN_1401a0e20(longlong *param_1,int param_2,int *param_3,undefined8 param_4)
|
|
|
|
{
|
|
undefined *puVar1;
|
|
int *piVar2;
|
|
undefined *puVar3;
|
|
char cVar4;
|
|
int iVar5;
|
|
uint uVar6;
|
|
uint uVar7;
|
|
longlong lVar8;
|
|
undefined8 uVar9;
|
|
uint *puVar10;
|
|
undefined8 uVar11;
|
|
uint *puVar12;
|
|
uint uVar13;
|
|
uint uVar14;
|
|
uint uVar15;
|
|
short local_res18 [4];
|
|
undefined8 local_res20;
|
|
uint *local_b8;
|
|
undefined *local_b0;
|
|
undefined8 local_a8;
|
|
undefined1 local_a0;
|
|
short local_98 [4];
|
|
undefined **local_90;
|
|
undefined8 local_88;
|
|
undefined8 local_80;
|
|
undefined8 local_78;
|
|
undefined8 local_70;
|
|
int local_68;
|
|
int local_64;
|
|
undefined8 local_60;
|
|
undefined1 local_58;
|
|
undefined1 local_50 [8];
|
|
undefined8 local_48;
|
|
|
|
local_48 = 0xfffffffffffffffe;
|
|
iVar5 = (int)(*param_3 + (*param_3 >> 0x1f & 7U)) >> 3;
|
|
local_res20 = param_4;
|
|
local_68 = iVar5;
|
|
cVar4 = FUN_14016bba0(param_3,&local_64);
|
|
if ((cVar4 == '\0') || (cVar4 = FUN_14016ba10(param_3,local_res18), cVar4 == '\0')) {
|
|
FUN_14016b040(param_3,iVar5);
|
|
return 0;
|
|
}
|
|
FUN_14016d8c0();
|
|
local_b0 = PTR_DAT_1403440a0;
|
|
lVar8 = (**(code **)(*param_1 + 0xc0))(param_1,param_3[10],&local_b0);
|
|
if (((lVar8 == 0) || (local_64 == 0)) || (local_64 == 3)) goto LAB_1401a15a5;
|
|
if (local_64 == 1) {
|
|
cVar4 = FUN_1401b0f70(param_3,param_4,lVar8,(int)((*param_3 >> 0x1f & 7U) + *param_3) >> 3);
|
|
LAB_1401a0f1e:
|
|
if (cVar4 == '\0') {
|
|
LAB_1401a15a5:
|
|
uVar9 = (**(code **)(*param_1 + 0x58))(param_1);
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
if (DAT_14034c86f != '\0') {
|
|
(**(code **)(*param_1 + 200))(param_1,L"Proud::CNetCoreImpl::ProcessMessage_Encrypted");
|
|
}
|
|
FUN_14004ea20(&local_b0,L" decrypt failed");
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
uVar11 = FUN_140198f80(local_res18,6,param_3[10],&local_b0,&local_90);
|
|
(**(code **)(*param_1 + 0x80))(param_1,uVar11);
|
|
FUN_14019a9e0(&local_90);
|
|
FUN_14016b040(param_3,iVar5);
|
|
FUN_14016dbe0(uVar9);
|
|
puVar3 = local_b0;
|
|
if (local_b0 == (undefined *)0x0) {
|
|
return 0;
|
|
}
|
|
if (local_b0 == PTR_DAT_1403440a0) {
|
|
return 0;
|
|
}
|
|
puVar1 = local_b0 + -8;
|
|
if (puVar1 == (undefined *)0x0) {
|
|
return 0;
|
|
}
|
|
uVar9 = FUN_14016d8c0();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
piVar2 = (int *)(puVar3 + -4);
|
|
*piVar2 = *piVar2 + -1;
|
|
if (*piVar2 == 0) {
|
|
FUN_14016d970(puVar1);
|
|
}
|
|
FUN_14016dbe0(uVar9);
|
|
return 0;
|
|
}
|
|
}
|
|
else if (local_64 == 2) {
|
|
cVar4 = FUN_1401c0fc0(param_3,param_4,lVar8 + 0x3d0,
|
|
(int)((*param_3 >> 0x1f & 7U) + *param_3) >> 3);
|
|
goto LAB_1401a0f1e;
|
|
}
|
|
if (param_2 != 0x24) {
|
|
LAB_1401a1555:
|
|
puVar3 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1403440a0)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
uVar9 = FUN_14016d8c0();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
piVar2 = (int *)(puVar3 + -4);
|
|
*piVar2 = *piVar2 + -1;
|
|
if (*piVar2 == 0) {
|
|
FUN_14016d970(puVar1);
|
|
}
|
|
FUN_14016dbe0(uVar9);
|
|
}
|
|
return 1;
|
|
}
|
|
cVar4 = FUN_14016b370(param_4,local_98,2);
|
|
if (cVar4 != '\0') {
|
|
cVar4 = (**(code **)(*param_1 + 0xb0))(param_1,param_3[10],local_res18);
|
|
lVar8 = *param_1;
|
|
if (cVar4 == '\0') {
|
|
uVar9 = (**(code **)(lVar8 + 0x58))();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
if (DAT_14034c86f != '\0') {
|
|
(**(code **)(*param_1 + 200))(param_1,L"Proud::CNetCoreImpl::ProcessMessage_Encrypted");
|
|
}
|
|
FUN_14016d8c0();
|
|
local_b8 = (uint *)PTR_DAT_1403440a0;
|
|
FUN_14004c020(&local_b8,L"GetExpectedDecryptCount failed!!");
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
uVar11 = FUN_140198f80(local_50,6,param_3[10],&local_b8,&local_90);
|
|
(**(code **)(*param_1 + 0x80))(param_1,uVar11);
|
|
FUN_14019a9e0(&local_90);
|
|
FUN_14016b040(param_4,iVar5);
|
|
puVar10 = local_b8;
|
|
if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) &&
|
|
(puVar12 = local_b8 + -2, puVar12 != (uint *)0x0)) {
|
|
uVar11 = FUN_14016d8c0();
|
|
local_60 = uVar11;
|
|
FUN_14016db50(uVar11);
|
|
local_58 = 1;
|
|
puVar10 = puVar10 + -1;
|
|
*puVar10 = *puVar10 - 1;
|
|
if (*puVar10 == 0) {
|
|
FUN_14016d970(puVar12);
|
|
}
|
|
FUN_14016dbe0(uVar11);
|
|
}
|
|
local_b8 = (uint *)PTR_DAT_1403440a0;
|
|
FUN_14016dbe0(uVar9);
|
|
puVar3 = local_b0;
|
|
if (local_b0 == (undefined *)0x0) {
|
|
return 0;
|
|
}
|
|
if (local_b0 == PTR_DAT_1403440a0) {
|
|
return 0;
|
|
}
|
|
puVar1 = local_b0 + -8;
|
|
if (puVar1 == (undefined *)0x0) {
|
|
return 0;
|
|
}
|
|
uVar9 = FUN_14016d8c0();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
piVar2 = (int *)(puVar3 + -4);
|
|
*piVar2 = *piVar2 + -1;
|
|
if (*piVar2 == 0) {
|
|
FUN_14016d970(puVar1);
|
|
}
|
|
FUN_14016dbe0(uVar9);
|
|
return 0;
|
|
}
|
|
if (local_98[0] != local_res18[0]) {
|
|
uVar9 = (**(code **)(lVar8 + 0x58))();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
if (DAT_14034c86f != '\0') {
|
|
(**(code **)(*param_1 + 200))(param_1,L"Proud::CNetCoreImpl::ProcessMessage_Encrypted");
|
|
}
|
|
FUN_14016d8c0();
|
|
local_b8 = (uint *)PTR_DAT_1403440a0;
|
|
FUN_14004c020(&local_b8,L"decryptCount1(%d) != decryptCount2(%d)",local_98[0],local_res18[0]);
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
uVar11 = FUN_140198f80(local_50,6,param_3[10],&local_b8,&local_90);
|
|
(**(code **)(*param_1 + 0x80))(param_1,uVar11);
|
|
FUN_14019a9e0(&local_90);
|
|
FUN_14016b040(param_4,iVar5);
|
|
puVar10 = local_b8;
|
|
if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) &&
|
|
(puVar12 = local_b8 + -2, puVar12 != (uint *)0x0)) {
|
|
uVar11 = FUN_14016d8c0();
|
|
local_60 = uVar11;
|
|
FUN_14016db50(uVar11);
|
|
local_58 = 1;
|
|
puVar10 = puVar10 + -1;
|
|
*puVar10 = *puVar10 - 1;
|
|
if (*puVar10 == 0) {
|
|
FUN_14016d970(puVar12);
|
|
}
|
|
FUN_14016dbe0(uVar11);
|
|
}
|
|
local_b8 = (uint *)PTR_DAT_1403440a0;
|
|
FUN_14016dbe0(uVar9);
|
|
puVar3 = local_b0;
|
|
if (local_b0 == (undefined *)0x0) {
|
|
return 0;
|
|
}
|
|
if (local_b0 == PTR_DAT_1403440a0) {
|
|
return 0;
|
|
}
|
|
puVar1 = local_b0 + -8;
|
|
if (puVar1 == (undefined *)0x0) {
|
|
return 0;
|
|
}
|
|
uVar9 = FUN_14016d8c0();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
piVar2 = (int *)(puVar3 + -4);
|
|
*piVar2 = *piVar2 + -1;
|
|
if (*piVar2 == 0) {
|
|
FUN_14016d970(puVar1);
|
|
}
|
|
FUN_14016dbe0(uVar9);
|
|
return 0;
|
|
}
|
|
(**(code **)(lVar8 + 0xb8))(param_1,param_3[10]);
|
|
goto LAB_1401a1555;
|
|
}
|
|
uVar9 = (**(code **)(*param_1 + 0x58))();
|
|
local_60 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_58 = 1;
|
|
if (DAT_14034c86f != '\0') {
|
|
(**(code **)(*param_1 + 200))(param_1,L"Proud::CNetCoreImpl::ProcessMessage_Encrypted");
|
|
}
|
|
FUN_14016d8c0();
|
|
local_b8 = (uint *)PTR_DAT_1403440a0;
|
|
uVar6 = FUN_14016d740(L"decryptCount1 read failed!!");
|
|
uVar13 = 0;
|
|
uVar15 = 0;
|
|
if ((local_b8 != (uint *)0x0) && (uVar15 = 0, local_b8 != (uint *)PTR_DAT_1403440a0)) {
|
|
uVar15 = local_b8[-2];
|
|
}
|
|
uVar7 = uVar6;
|
|
if ((((int)uVar6 <= (int)uVar15) && (uVar7 = uVar13, local_b8 != (uint *)0x0)) &&
|
|
(local_b8 != (uint *)PTR_DAT_1403440a0)) {
|
|
uVar7 = local_b8[-2];
|
|
}
|
|
uVar15 = 1;
|
|
if (1 < (int)uVar7) {
|
|
uVar15 = uVar7;
|
|
}
|
|
uVar7 = uVar13;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) {
|
|
uVar7 = local_b8[-2];
|
|
}
|
|
uVar14 = 0;
|
|
if ((int)uVar7 < (int)uVar15) {
|
|
if (local_b8 == (uint *)0x0) {
|
|
local_b8 = (uint *)PTR_DAT_1403440a0;
|
|
}
|
|
if ((int)uVar15 < 0) {
|
|
/* WARNING: Subroutine does not return */
|
|
FUN_14016d6b0();
|
|
}
|
|
if (uVar15 == 0) {
|
|
FUN_14004eb70(&local_b8);
|
|
}
|
|
else {
|
|
uVar7 = uVar13;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) {
|
|
uVar7 = local_b8[-2];
|
|
}
|
|
if (uVar15 != uVar7) {
|
|
puVar10 = (uint *)FUN_14016d940((longlong)(int)uVar15 * 2 + 10);
|
|
if (puVar10 != (uint *)0x0) {
|
|
*puVar10 = 0;
|
|
puVar10[1] = 1;
|
|
}
|
|
*puVar10 = uVar15;
|
|
uVar7 = uVar14;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) {
|
|
uVar7 = local_b8[-2];
|
|
}
|
|
puVar12 = (uint *)PTR_DAT_1403440a0;
|
|
if ((int)uVar15 < (int)uVar7) {
|
|
LAB_1401a1085:
|
|
if (local_b8 != (uint *)0x0) {
|
|
puVar12 = local_b8;
|
|
}
|
|
}
|
|
else {
|
|
uVar15 = uVar13;
|
|
if (local_b8 != (uint *)0x0) {
|
|
if (local_b8 != (uint *)PTR_DAT_1403440a0) {
|
|
uVar15 = local_b8[-2];
|
|
}
|
|
goto LAB_1401a1085;
|
|
}
|
|
}
|
|
FUN_14016d770(puVar10 + 2,puVar12,uVar15);
|
|
FUN_14004eb70(&local_b8);
|
|
local_b8 = puVar10 + 2;
|
|
}
|
|
}
|
|
}
|
|
FUN_14004e850(&local_b8);
|
|
puVar10 = local_b8;
|
|
if (local_b8 == (uint *)0x0) {
|
|
puVar10 = (uint *)PTR_DAT_1403440a0;
|
|
}
|
|
FUN_14016d770(puVar10,L"decryptCount1 read failed!!",uVar6);
|
|
puVar10 = local_b8;
|
|
if (local_b8 == (uint *)0x0) {
|
|
puVar10 = (uint *)PTR_DAT_1403440a0;
|
|
}
|
|
uVar6 = FUN_14016d740(puVar10);
|
|
uVar15 = 0;
|
|
if (0 < (int)uVar6) {
|
|
uVar15 = uVar6;
|
|
}
|
|
uVar6 = uVar14;
|
|
if ((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) {
|
|
uVar6 = local_b8[-2];
|
|
}
|
|
if (((int)uVar6 <= (int)uVar15) && (uVar15 = uVar14, local_b8 != (uint *)0x0)) {
|
|
if (local_b8 == (uint *)PTR_DAT_1403440a0) goto LAB_1401a1135;
|
|
uVar15 = local_b8[-2];
|
|
}
|
|
if (((local_b8 != (uint *)PTR_DAT_1403440a0) && (local_b8 != (uint *)0x0)) &&
|
|
(local_b8 + -2 != (uint *)0x0)) {
|
|
local_b8[-2] = uVar15;
|
|
*(undefined2 *)((longlong)local_b8 + (longlong)(int)uVar15 * 2) = 0;
|
|
}
|
|
LAB_1401a1135:
|
|
local_88 = 0;
|
|
local_80 = 0;
|
|
local_78 = 0;
|
|
local_70 = 0;
|
|
local_90 = Proud::ByteArray::vftable;
|
|
uVar11 = FUN_140198f80(local_50,6,param_3[10],&local_b8,&local_90);
|
|
(**(code **)(*param_1 + 0x80))(param_1,uVar11);
|
|
FUN_14019a9e0(&local_90);
|
|
puVar10 = local_b8;
|
|
if (((local_b8 != (uint *)0x0) && (local_b8 != (uint *)PTR_DAT_1403440a0)) &&
|
|
(puVar12 = local_b8 + -2, puVar12 != (uint *)0x0)) {
|
|
uVar11 = FUN_14016d8c0();
|
|
local_a8 = uVar11;
|
|
FUN_14016db50(uVar11);
|
|
local_a0 = 1;
|
|
puVar10 = puVar10 + -1;
|
|
*puVar10 = *puVar10 - 1;
|
|
if (*puVar10 == 0) {
|
|
FUN_14016d970(puVar12);
|
|
}
|
|
FUN_14016dbe0(uVar11);
|
|
}
|
|
FUN_14016b040(local_res20,local_68);
|
|
FUN_14016dbe0(uVar9);
|
|
puVar3 = local_b0;
|
|
if (((local_b0 != (undefined *)0x0) && (local_b0 != PTR_DAT_1403440a0)) &&
|
|
(puVar1 = local_b0 + -8, puVar1 != (undefined *)0x0)) {
|
|
uVar9 = FUN_14016d8c0();
|
|
local_a8 = uVar9;
|
|
FUN_14016db50(uVar9);
|
|
local_a0 = 1;
|
|
piVar2 = (int *)(puVar3 + -4);
|
|
*piVar2 = *piVar2 + -1;
|
|
if (*piVar2 == 0) {
|
|
FUN_14016d970(puVar1);
|
|
}
|
|
FUN_14016dbe0(uVar9);
|
|
}
|
|
return 0;
|
|
}
|
|
|