aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/ApplicationLoader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE/HOS/ApplicationLoader.cs')
-rw-r--r--Ryujinx.HLE/HOS/ApplicationLoader.cs67
1 files changed, 47 insertions, 20 deletions
diff --git a/Ryujinx.HLE/HOS/ApplicationLoader.cs b/Ryujinx.HLE/HOS/ApplicationLoader.cs
index 9bf9a7bf..2c4708d7 100644
--- a/Ryujinx.HLE/HOS/ApplicationLoader.cs
+++ b/Ryujinx.HLE/HOS/ApplicationLoader.cs
@@ -21,6 +21,7 @@ using System.Linq;
using System.Reflection;
using static LibHac.Fs.ApplicationSaveDataManagement;
+using static Ryujinx.HLE.HOS.ModLoader;
using ApplicationId = LibHac.Ncm.ApplicationId;
namespace Ryujinx.HLE.HOS
@@ -30,7 +31,22 @@ namespace Ryujinx.HLE.HOS
public class ApplicationLoader
{
// Binaries from exefs are loaded into mem in this order. Do not change.
- private static readonly string[] ExeFsPrefixes = { "rtld", "main", "subsdk*", "sdk" };
+ internal static readonly string[] ExeFsPrefixes =
+ {
+ "rtld",
+ "main",
+ "subsdk0",
+ "subsdk1",
+ "subsdk2",
+ "subsdk3",
+ "subsdk4",
+ "subsdk5",
+ "subsdk6",
+ "subsdk7",
+ "subsdk8",
+ "subsdk9",
+ "sdk"
+ };
private readonly Switch _device;
private readonly ContentManager _contentManager;
@@ -463,37 +479,48 @@ namespace Ryujinx.HLE.HOS
metaData ??= ReadNpdm(codeFs);
- List<NsoExecutable> nsos = new List<NsoExecutable>();
+ NsoExecutable[] nsos = new NsoExecutable[ExeFsPrefixes.Length];
- foreach (string exePrefix in ExeFsPrefixes) // Load binaries with standard prefixes
+ for(int i = 0; i < nsos.Length; i++)
{
- foreach (DirectoryEntryEx file in codeFs.EnumerateEntries("/", exePrefix))
- {
- if (Path.GetExtension(file.Name) != string.Empty)
- {
- continue;
- }
+ string name = ExeFsPrefixes[i];
- Logger.Info?.Print(LogClass.Loader, $"Loading {file.Name}...");
+ if (!codeFs.FileExists(name))
+ {
+ continue; // file doesn't exist, skip
+ }
- codeFs.OpenFile(out IFile nsoFile, file.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure();
+ Logger.Info?.Print(LogClass.Loader, $"Loading {name}...");
- NsoExecutable nso = new NsoExecutable(nsoFile.AsStorage(), file.Name);
+ codeFs.OpenFile(out IFile nsoFile, $"/{name}".ToU8Span(), OpenMode.Read).ThrowIfFailure();
- nsos.Add(nso);
- }
+ nsos[i] = new NsoExecutable(nsoFile.AsStorage(), name);
}
// ExeFs file replacements
- bool modified = _fileSystem.ModLoader.ApplyExefsMods(TitleId, nsos);
+ ModLoadResult modLoadResult = _fileSystem.ModLoader.ApplyExefsMods(TitleId, nsos);
+
+ // collect the nsos, ignoring ones that aren't used
+ NsoExecutable[] programs = nsos.Where(x => x != null).ToArray();
- NsoExecutable[] programs = nsos.ToArray();
+ // take the npdm from mods if present
+ if (modLoadResult.Npdm != null)
+ {
+ metaData = modLoadResult.Npdm;
+ }
- modified |= _fileSystem.ModLoader.ApplyNsoPatches(TitleId, programs);
+ bool hasPatches = _fileSystem.ModLoader.ApplyNsoPatches(TitleId, programs);
_contentManager.LoadEntries(_device);
- if (_device.System.EnablePtc && modified)
+ bool usePtc = _device.System.EnablePtc;
+
+ // don't use PTC if exefs files have been replaced
+ usePtc &= !modLoadResult.Modified;
+ // don't use PTC if exefs files have been patched
+ usePtc &= !hasPatches;
+
+ if (_device.System.EnablePtc && !usePtc)
{
Logger.Warning?.Print(LogClass.Ptc, $"Detected exefs modifications. PPTC disabled.");
}
@@ -501,7 +528,7 @@ namespace Ryujinx.HLE.HOS
Graphics.Gpu.GraphicsConfig.TitleId = TitleIdText;
_device.Gpu.HostInitalized.Set();
- Ptc.Initialize(TitleIdText, DisplayVersion, _device.System.EnablePtc && !modified);
+ Ptc.Initialize(TitleIdText, DisplayVersion, usePtc);
ProgramLoader.LoadNsos(_device.System.KernelContext, metaData, executables: programs);
}
@@ -657,4 +684,4 @@ namespace Ryujinx.HLE.HOS
return resultCode;
}
}
-} \ No newline at end of file
+}