/* Agent_Release_x64.exe sha256 6f2be7b8eb799ba51b359d1958720aac5baee5b7ee0d1d36684d3cbd72d45469 * Ghidra 12.1.2 decompiler output for 0x14000a630 FUN_14000a630 * Pseudocode, not original source. */ wchar_t FUN_14000a630(basic_streambuf_> *param_1,wchar_t param_2) { void *pvVar1; basic_streambuf_> bVar2; int iVar3; void *_Src; longlong lVar4; longlong lVar5; wchar_t *pwVar6; ulonglong uVar7; void *pvVar8; undefined4 uVar9; ulonglong uVar10; if (((byte)param_1[0x78] & 8) != 0) { uVar7 = **(ulonglong **)(param_1 + 0x48); if ((uVar7 != 0) && (uVar10 = *(ulonglong *)(param_1 + 0x70), uVar7 < uVar10)) { iVar3 = **(int **)(param_1 + 0x60); **(ulonglong **)(param_1 + 0x48) = uVar10; **(undefined4 **)(param_1 + 0x60) = (int)((longlong)((uVar7 + (longlong)iVar3 * 2) - uVar10) >> 1); } } if (param_2 == L'\xffff') { return L'\0'; } uVar7 = **(ulonglong **)(param_1 + 0x48); if ((uVar7 != 0) && (uVar7 < uVar7 + (longlong)**(int **)(param_1 + 0x60) * 2)) { pwVar6 = std::basic_streambuf_>::_Pninc(param_1); *pwVar6 = param_2; return param_2; } if (((byte)param_1[0x78] & 2) != 0) { return L'\xffff'; } uVar10 = 0; if (uVar7 != 0) { uVar10 = (longlong) (((longlong)**(int **)(param_1 + 0x60) * 2 - **(longlong **)(param_1 + 0x20)) + uVar7) >> 1; } uVar7 = uVar10 >> 1; if (uVar7 < 0x20) { uVar7 = 0x20; } else if (uVar7 == 0) { return L'\xffff'; } do { if (uVar10 <= 0x7fffffff - uVar7) break; uVar7 = uVar7 >> 1; } while (uVar7 != 0); if (uVar7 == 0) { return L'\xffff'; } uVar7 = uVar7 + uVar10; pvVar8 = FUN_140001a50(uVar7); _Src = (void *)**(undefined8 **)(param_1 + 0x20); uVar9 = (undefined4)((longlong)pvVar8 >> 1); if ((uVar10 == 0) || (memcpy(pvVar8,_Src,uVar10 * 2), uVar10 == 0)) { *(void **)(param_1 + 0x70) = pvVar8; **(undefined8 **)(param_1 + 0x28) = pvVar8; **(undefined8 **)(param_1 + 0x48) = pvVar8; **(undefined4 **)(param_1 + 0x60) = (int)((longlong)(uVar7 * 2) >> 1); bVar2 = param_1[0x78]; **(undefined8 **)(param_1 + 0x20) = pvVar8; if (((byte)bVar2 & 4) == 0) { **(undefined8 **)(param_1 + 0x40) = pvVar8; **(undefined4 **)(param_1 + 0x58) = 1; } else { **(undefined8 **)(param_1 + 0x40) = 0; **(undefined4 **)(param_1 + 0x58) = uVar9; } } else { *(void **)(param_1 + 0x70) = (void *)((longlong)pvVar8 + (*(longlong *)(param_1 + 0x70) - (longlong)_Src >> 1) * 2); pvVar1 = (void *)((longlong)pvVar8 + (**(longlong **)(param_1 + 0x48) - (longlong)_Src >> 1) * 2 ); **(longlong **)(param_1 + 0x28) = (longlong)((longlong)pvVar8 + (**(longlong **)(param_1 + 0x28) - (longlong)_Src >> 1) * 2); **(longlong **)(param_1 + 0x48) = (longlong)pvVar1; **(undefined4 **)(param_1 + 0x60) = (int)((longlong)((uVar7 * 2 - (longlong)pvVar1) + (longlong)pvVar8) >> 1); if (((byte)param_1[0x78] & 4) == 0) { lVar4 = **(longlong **)(param_1 + 0x48); lVar5 = **(longlong **)(param_1 + 0x40); **(undefined8 **)(param_1 + 0x20) = pvVar8; pvVar8 = (void *)((longlong)pvVar8 + (lVar5 - (longlong)_Src >> 1) * 2); **(longlong **)(param_1 + 0x40) = (longlong)pvVar8; **(undefined4 **)(param_1 + 0x58) = (int)((lVar4 - (longlong)pvVar8) + 2 >> 1); } else { **(undefined8 **)(param_1 + 0x20) = pvVar8; **(undefined8 **)(param_1 + 0x40) = 0; **(undefined4 **)(param_1 + 0x58) = uVar9; } } if (((byte)param_1[0x78] & 1) != 0) { operator_delete(_Src); } *(uint *)(param_1 + 0x78) = *(uint *)(param_1 + 0x78) | 1; pwVar6 = std::basic_streambuf_>::_Pninc(param_1); *pwVar6 = param_2; return param_2; }