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

232 lines
6.7 KiB
C

/* MessageServer_Release_x64.exe sha256 7911b15c4379625eaa12ff227708aa3a033bc6ac2cf6b34283136e3a62df25f1
* Ghidra 12.1.2 decompiler output for 0x1400ea010 FUN_1400ea010
* Pseudocode, not original source. */
/* WARNING: Function: __security_check_cookie replaced with injection: security_check_cookie */
undefined8 FUN_1400ea010(wchar_t *param_1,wchar_t *param_2)
{
bool bVar1;
bool bVar2;
wchar_t *pwVar3;
wchar_t wVar4;
int iVar5;
longlong lVar6;
undefined8 uVar7;
ulonglong uVar8;
wchar_t *pwVar9;
ulonglong uVar10;
ulonglong uVar11;
undefined1 auStack_188 [32];
int local_168;
int local_164;
wchar_t *local_160;
undefined8 local_158;
wchar_t local_148 [136];
ulonglong local_38;
local_158 = 0xfffffffffffffffe;
local_38 = DAT_1401ac5a0 ^ (ulonglong)auStack_188;
if (param_2 == (wchar_t *)0x0) {
/* WARNING: Subroutine does not return */
FUN_1400064e0(0x80004005);
}
bVar2 = false;
bVar1 = false;
local_164 = 0;
local_168 = 0;
lVar6 = (**(code **)(PTR_PTR_1401ac508 + 0x18))(&PTR_PTR_1401ac508);
local_160 = (wchar_t *)(lVar6 + 0x18);
if ((int)(*(int *)(lVar6 + 0xc) - 0x82aU | 1U - *(int *)(lVar6 + 0x10)) < 0) {
FUN_14006c670((longlong *)&local_160,0x82a);
}
pwVar3 = local_160;
uVar8 = 0;
wVar4 = *param_2;
pwVar9 = local_160;
uVar11 = uVar8;
if (wVar4 != L'\0') {
LAB_1400ea0d2:
uVar10 = 0;
if (0x828 < uVar8) goto LAB_1400ea46c;
if (wVar4 == L':') {
if ((int)uVar11 == 0) {
*pwVar9 = L'\0';
if (bVar2) {
if ((!bVar1) || (local_168 == 0)) {
*pwVar9 = L'\0';
pwVar9 = local_148;
param_2 = param_2 + 1;
wVar4 = *param_2;
uVar8 = uVar10;
while (((wVar4 != L'/' && (wVar4 != L'@')) && (wVar4 != L'\0'))) {
if (0x7f < (int)uVar8) goto LAB_1400ea46c;
*pwVar9 = wVar4;
pwVar9 = pwVar9 + 1;
uVar8 = (ulonglong)((int)uVar8 + 1);
param_2 = param_2 + 1;
wVar4 = *param_2;
}
*pwVar9 = L'\0';
uVar8 = uVar10;
if ((local_168 == 0) && ((wVar4 == L'/' || (wVar4 == L'\0')))) {
uVar7 = FUN_1400e91d0((longlong)param_1,pwVar3);
if ((int)uVar7 == 0) goto LAB_1400ea46c;
iVar5 = _wtoi(local_148);
param_1[0x1226] = (wchar_t)iVar5;
local_164 = 1;
local_168 = 1;
pwVar9 = pwVar3;
}
else {
if ((bVar1) ||
(((wVar4 != L'@' ||
(uVar7 = FUN_1400e9280((longlong)param_1,pwVar3), (int)uVar7 == 0)) ||
(uVar7 = FUN_1400e9330((longlong)param_1,local_148), (int)uVar7 == 0))))
goto LAB_1400ea46c;
bVar1 = true;
param_2 = param_2 + 1;
pwVar9 = pwVar3;
}
}
}
else {
uVar7 = FUN_1400e9690(param_1,pwVar3);
if ((int)uVar7 == 0) goto LAB_1400ea46c;
bVar2 = true;
pwVar9 = param_2;
if (param_2[1] == L'/') {
pwVar9 = param_2 + 2;
if (*pwVar9 != L'/') {
param_2 = param_2 + 1;
uVar8 = 0;
pwVar9 = pwVar3;
goto LAB_1400ea350;
}
if (*(int *)(param_1 + 0x1228) == 6) goto LAB_1400ea46c;
}
uVar8 = 0;
param_2 = pwVar9 + 1;
pwVar9 = pwVar3;
if (*(int *)(param_1 + 0x1228) == 4) goto LAB_1400ea350;
}
}
else {
LAB_1400ea2a2:
if (param_2[1] == L'\0') {
LAB_1400ea2fc:
if ((wVar4 != L'/') && (wVar4 != L'?')) {
if (uVar8 < 0x828) {
*pwVar9 = wVar4;
pwVar9 = pwVar9 + 1;
param_2 = param_2 + 1;
goto LAB_1400ea320;
}
goto LAB_1400ea46c;
}
goto LAB_1400ea320;
}
if (wVar4 == L'[') {
if ((bVar2) && (local_164 == 0)) {
uVar11 = 1;
}
}
else if (wVar4 == L']') {
uVar11 = uVar10;
}
*pwVar9 = wVar4;
param_2 = param_2 + 1;
uVar8 = uVar8 + 1;
pwVar9 = pwVar9 + 1;
}
}
else {
if (wVar4 != L'@') {
if ((wVar4 != L'/') && (wVar4 != L'?')) goto LAB_1400ea2a2;
if (param_2[1] == L'\0') goto LAB_1400ea2fc;
LAB_1400ea320:
*pwVar9 = L'\0';
if ((local_164 == 0) && (uVar7 = FUN_1400e91d0((longlong)param_1,pwVar3), (int)uVar7 == 0))
goto LAB_1400ea46c;
uVar8 = 0;
pwVar9 = pwVar3;
goto LAB_1400ea347;
}
if (bVar1) goto LAB_1400ea46c;
*pwVar9 = L'\0';
uVar7 = FUN_1400e9280((longlong)param_1,pwVar3);
if ((int)uVar7 == 0) goto LAB_1400ea46c;
uVar11 = 0;
bVar1 = true;
param_2 = param_2 + 1;
uVar8 = 0;
pwVar9 = pwVar3;
}
wVar4 = *param_2;
if (wVar4 == L'\0') goto LAB_1400ea347;
goto LAB_1400ea0d2;
}
goto LAB_1400ea46c;
LAB_1400ea347:
if (bVar2) {
LAB_1400ea350:
wVar4 = *param_2;
while (wVar4 != L'\0') {
if (0x828 < uVar8) goto LAB_1400ea46c;
if ((*(int *)(param_1 + 0x1228) != 4) && ((wVar4 == L'#' || (wVar4 == L'?')))) break;
*pwVar9 = wVar4;
pwVar9 = pwVar9 + 1;
uVar8 = uVar8 + 1;
param_2 = param_2 + 1;
wVar4 = *param_2;
}
*pwVar9 = L'\0';
if ((*pwVar3 == L'\0') || (uVar7 = FUN_14006dd40((longlong)param_1,pwVar3), (int)uVar7 != 0)) {
uVar8 = 0;
wVar4 = *param_2;
pwVar9 = pwVar3;
while (wVar4 != L'\0') {
param_2 = param_2 + 1;
if (0x828 < uVar8) goto LAB_1400ea46c;
*pwVar9 = wVar4;
pwVar9 = pwVar9 + 1;
uVar8 = uVar8 + 1;
wVar4 = *param_2;
}
*pwVar9 = L'\0';
if ((*pwVar3 == L'\0') || (uVar7 = FUN_1400e9410((longlong)param_1,pwVar3), (int)uVar7 != 0))
{
iVar5 = *(int *)(param_1 + 0x1228);
if ((iVar5 == 4) || ((iVar5 == 5 || (iVar5 == 6)))) {
param_1[0x1226] = L'\0';
}
else if (local_168 == 0) {
uVar7 = FUN_1400e9020(iVar5);
param_1[0x1226] = (wchar_t)uVar7;
}
LOCK();
pwVar9 = pwVar3 + -4;
iVar5 = *(int *)pwVar9;
*(int *)pwVar9 = *(int *)pwVar9 + -1;
UNLOCK();
if (iVar5 + -1 < 1) {
(**(code **)(**(longlong **)(pwVar3 + -0xc) + 8))();
}
return 1;
}
}
}
LAB_1400ea46c:
FUN_14006ddf0(param_1);
LOCK();
pwVar9 = pwVar3 + -4;
iVar5 = *(int *)pwVar9;
*(int *)pwVar9 = *(int *)pwVar9 + -1;
UNLOCK();
if (iVar5 + -1 < 1) {
(**(code **)(**(longlong **)(pwVar3 + -0xc) + 8))();
}
return 0;
}