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
This commit is contained in:
GreemDev 2025-11-06 23:40:16 -06:00
parent 234f7ca298
commit 13b69aedfe

View File

@ -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)
{