From 13b69aedfe8deeda25a84632b5c8c60e5ac43879 Mon Sep 17 00:00:00 2001 From: GreemDev Date: Thu, 6 Nov 2025 23:40:16 -0600 Subject: [PATCH] idea: Catch HorizonResultExceptions of result type ResultFsNonRealDataVerificationFailed - log a more clear error message as to what 2002-4604 means for the user - and return the result from the FileSystemProxy IStorage to pass the invalid data handling to the game instead of stopping emulation there and then. - this may be changed. i'm pretty sure this error is only thrown when you actually have integrity checking enabled in settings, so maybe it crashing with a friendler message is more desired than potentially continuing execution. we will see --- .../HOS/Services/Fs/FileSystemProxy/IStorage.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs index a485ebe63..480899ae1 100644 --- a/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs +++ b/src/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs @@ -1,8 +1,10 @@ using LibHac; using LibHac.Common; +using LibHac.Fs; using LibHac.Sf; using Ryujinx.Common; using Ryujinx.Common.Configuration; +using Ryujinx.Common.Logging; using Ryujinx.Memory; using System.Threading; @@ -40,7 +42,19 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy } using WritableRegion region = context.Memory.GetWritableRegion(bufferAddress, (int)bufferLen, true); - Result result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size); + Result result; + + try + { + result = _baseStorage.Get.Read((long)offset, new OutBuffer(region.Memory.Span), (long)size); + } + catch (HorizonResultException hre) when (hre.IsOfResultType(ResultFs.NonRealDataVerificationFailed)) + { + Logger.Error?.Print(LogClass.ServiceFs, + $"Encountered corrupted data in filesystem storage @ offset 0x{offset:X8}, size 0x{size:X8}. " + + "Please redump the current game and/or update from your console."); + result = ResultFs.NonRealDataVerificationFailed; + } if (context.Device.DirtyHacks.IsEnabled(DirtyHack.Xc2MenuSoftlockFix) && IsXc2) {