/* DBCServer_Release_x64.exe sha256 d9e4fccdf3482e50247686d4452c0b13c75a53efc4bd7320668eece8d1ce828c * Ghidra 12.1.2 decompiler output for 0x1401e5f40 FUN_1401e5f40 * Pseudocode, not original source. */ void FUN_1401e5f40(longlong *param_1) { ushort *puVar1; uint uVar2; short sVar3; short *psVar4; ulonglong _Size; int iVar5; uint uVar6; uint uVar7; ulonglong uVar8; uVar2 = *(uint *)((longlong)param_1 + 0x44); _Size = (ulonglong)uVar2; while( true ) { iVar5 = ((int)param_1[0xb] - *(int *)((longlong)param_1 + 0x9c)) - *(uint *)((longlong)param_1 + 0x94); if ((uVar2 - 0x106) + *(int *)((longlong)param_1 + 0x44) <= *(uint *)((longlong)param_1 + 0x94)) { memcpy((void *)param_1[10],(void *)(param_1[10] + _Size),_Size); uVar8 = (ulonglong)*(uint *)((longlong)param_1 + 0x74); *(uint *)(param_1 + 0x13) = (int)param_1[0x13] - uVar2; *(int *)((longlong)param_1 + 0x94) = *(int *)((longlong)param_1 + 0x94) - uVar2; *(int *)((longlong)param_1 + 0x84) = *(int *)((longlong)param_1 + 0x84) - uVar2; psVar4 = (short *)(param_1[0xd] + uVar8 * 2); do { puVar1 = (ushort *)(psVar4 + -1); psVar4 = psVar4 + -1; if (*puVar1 < uVar2) { sVar3 = 0; } else { sVar3 = *puVar1 - (short)uVar2; } uVar6 = (int)uVar8 - 1; uVar8 = (ulonglong)uVar6; *psVar4 = sVar3; } while (uVar6 != 0); psVar4 = (short *)(param_1[0xc] + _Size * 2); uVar6 = uVar2; do { puVar1 = (ushort *)(psVar4 + -1); psVar4 = psVar4 + -1; if (*puVar1 < uVar2) { sVar3 = 0; } else { sVar3 = *puVar1 - (short)uVar2; } uVar6 = uVar6 - 1; *psVar4 = sVar3; } while (uVar6 != 0); iVar5 = iVar5 + uVar2; } if (*(int *)(*param_1 + 8) == 0) break; iVar5 = FUN_1401e5cf0(*param_1,(ulonglong)*(uint *)((longlong)param_1 + 0x9c) + (ulonglong)*(uint *)((longlong)param_1 + 0x94) + param_1[10], iVar5); *(int *)((longlong)param_1 + 0x9c) = *(int *)((longlong)param_1 + 0x9c) + iVar5; uVar6 = *(uint *)((longlong)param_1 + 0x9c); if (2 < uVar6) { uVar7 = (uint)*(byte *)((ulonglong)*(uint *)((longlong)param_1 + 0x94) + param_1[10]); *(uint *)(param_1 + 0xe) = uVar7; *(uint *)(param_1 + 0xe) = (uVar7 << ((byte)(int)param_1[0x10] & 0x1f) ^ (uint)*(byte *)((ulonglong)(*(uint *)((longlong)param_1 + 0x94) + 1) + param_1[10])) & *(uint *)((longlong)param_1 + 0x7c); } if ((0x105 < uVar6) || (*(int *)(*param_1 + 8) == 0)) { uVar2 = *(uint *)(param_1 + 0x2e3); uVar7 = *(uint *)(param_1 + 0xb); if (uVar2 < uVar7) { uVar6 = uVar6 + *(int *)((longlong)param_1 + 0x94); if (uVar2 < uVar6) { uVar2 = uVar7 - uVar6; if (0x102 < uVar7 - uVar6) { uVar2 = 0x102; } memset((void *)((ulonglong)uVar6 + param_1[10]),0,(ulonglong)uVar2); *(uint *)(param_1 + 0x2e3) = uVar2 + uVar6; } else if (uVar2 < uVar6 + 0x102) { uVar6 = (uVar6 - uVar2) + 0x102; if (uVar7 - uVar2 < uVar6) { uVar6 = uVar7 - uVar2; } memset((void *)((ulonglong)uVar2 + param_1[10]),0,(ulonglong)uVar6); *(uint *)(param_1 + 0x2e3) = (int)param_1[0x2e3] + uVar6; } } return; } } return; }