server-re/decomp/Agent_Release_x64/full/functions/0x14001b020.c
2026-10-14 16:45:19 -04:00

108 lines
3.3 KiB
C

/* Agent_Release_x64.exe sha256 6f2be7b8eb799ba51b359d1958720aac5baee5b7ee0d1d36684d3cbd72d45469
* Ghidra 12.1.2 decompiler output for 0x14001b020 FUN_14001b020
* Pseudocode, not original source. */
uint * FUN_14001b020(uint *param_1,ulonglong *param_2,undefined8 param_3,undefined8 param_4)
{
void *_Src;
void *_Dst;
uint *puVar1;
code *pcVar2;
uint uVar3;
uint *puVar4;
ulonglong uVar5;
ulonglong uVar6;
int iVar7;
undefined8 uVar8;
uint uVar9;
uint local_res10 [2];
uint local_res18 [4];
puVar4 = local_res10;
uVar8 = 4;
FUN_140080600(param_1,(undefined8 *)puVar4,4);
uVar3 = local_res10[0];
if (((int)local_res10[0] < 0) || (DAT_140155140 <= (int)local_res10[0])) {
FUN_14009d5d0(local_res10[0],puVar4,uVar8,param_4);
}
FUN_14000b0f0((longlong *)param_2,(longlong)(int)uVar3);
_Src = (void *)param_2[1];
_Dst = (void *)*param_2;
if (((longlong)_Src - (longlong)_Dst >> 2 != 0) && (_Dst != _Src)) {
memmove(_Dst,_Src,0);
param_2[1] = (ulonglong)_Dst;
}
iVar7 = 0;
uVar9 = local_res10[0];
if (0 < (int)uVar3) {
do {
uVar8 = FUN_140080600(param_1,(undefined8 *)local_res18,4);
puVar4 = (uint *)param_2[1];
if ((char)uVar8 != '\0') {
uVar9 = local_res18[0];
}
if ((local_res10 < puVar4) && (puVar1 = (uint *)*param_2, puVar1 <= local_res10)) {
if (puVar4 == (uint *)param_2[2]) {
uVar5 = (longlong)puVar4 - (longlong)puVar1 >> 2;
if (0x3ffffffffffffffe < uVar5) {
std::_Xlength_error("vector<T> too long");
pcVar2 = (code *)swi(3);
puVar4 = (uint *)(*pcVar2)();
return puVar4;
}
uVar5 = uVar5 + 1;
uVar6 = (longlong)param_2[2] - (longlong)puVar1 >> 2;
if (uVar6 < uVar5) {
if (0x3fffffffffffffff - (uVar6 >> 1) < uVar6) {
uVar6 = 0;
}
else {
uVar6 = uVar6 + (uVar6 >> 1);
}
if (uVar6 < uVar5) {
uVar6 = uVar5;
}
FUN_14000b0f0((longlong *)param_2,uVar6);
}
}
if ((undefined4 *)param_2[1] != (undefined4 *)0x0) {
*(undefined4 *)param_2[1] =
*(undefined4 *)(*param_2 + ((longlong)local_res10 - (longlong)puVar1 >> 2) * 4);
}
}
else {
if (puVar4 == (uint *)param_2[2]) {
uVar5 = (longlong)((longlong)puVar4 - *param_2) >> 2;
if (0x3ffffffffffffffe < uVar5) {
std::_Xlength_error("vector<T> too long");
pcVar2 = (code *)swi(3);
puVar4 = (uint *)(*pcVar2)();
return puVar4;
}
uVar5 = uVar5 + 1;
uVar6 = (longlong)((longlong)param_2[2] - *param_2) >> 2;
if (uVar6 < uVar5) {
if (0x3fffffffffffffff - (uVar6 >> 1) < uVar6) {
uVar6 = 0;
}
else {
uVar6 = uVar6 + (uVar6 >> 1);
}
if (uVar6 < uVar5) {
uVar6 = uVar5;
}
FUN_14000b0f0((longlong *)param_2,uVar6);
}
}
if ((uint *)param_2[1] != (uint *)0x0) {
*(uint *)param_2[1] = uVar9;
}
}
param_2[1] = param_2[1] + 4;
iVar7 = iVar7 + 1;
} while (iVar7 < (int)uVar3);
}
return param_1;
}