diff options
Diffstat (limited to 'Ryujinx.HLE/HOS/Horizon.cs')
| -rw-r--r-- | Ryujinx.HLE/HOS/Horizon.cs | 70 |
1 files changed, 66 insertions, 4 deletions
diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs index 302ee100..30c8098e 100644 --- a/Ryujinx.HLE/HOS/Horizon.cs +++ b/Ryujinx.HLE/HOS/Horizon.cs @@ -7,6 +7,7 @@ using LibHac.FsSystem.NcaUtils; using LibHac.Ncm; using LibHac.Ns; using LibHac.Spl; +using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.HLE.FileSystem.Content; using Ryujinx.HLE.HOS.Font; @@ -30,6 +31,8 @@ using System.IO; using System.Linq; using System.Reflection; using System.Threading; +using Utf8Json; +using Utf8Json.Resolvers; using TimeServiceManager = Ryujinx.HLE.HOS.Services.Time.TimeManager; using NsoExecutable = Ryujinx.HLE.Loaders.Executables.NsoExecutable; @@ -117,6 +120,10 @@ namespace Ryujinx.HLE.HOS public ulong TitleId { get; private set; } public string TitleIdText => TitleId.ToString("x16"); + public string TitleVersionString { get; private set; } + + public bool TitleIs64Bit { get; private set; } + public IntegrityCheckLevel FsIntegrityCheckLevel { get; set; } public int GlobalAccessLogMode { get; set; } @@ -368,6 +375,8 @@ namespace Ryujinx.HLE.HOS TitleName = ControlData.Value.Titles.ToArray() .FirstOrDefault(x => x.Name[0] != 0).Name.ToString(); } + + TitleVersionString = ControlData.Value.DisplayVersion.ToString(); } } else @@ -455,6 +464,54 @@ namespace Ryujinx.HLE.HOS IStorage dataStorage = null; IFileSystem codeFs = null; + if (File.Exists(Path.Combine(Device.FileSystem.GetBasePath(), "games", mainNca.Header.TitleId.ToString("x16"), "updates.json"))) + { + using (Stream stream = File.OpenRead(Path.Combine(Device.FileSystem.GetBasePath(), "games", mainNca.Header.TitleId.ToString("x16"), "updates.json"))) + { + IJsonFormatterResolver resolver = CompositeResolver.Create(StandardResolver.AllowPrivateSnakeCase); + string updatePath = JsonSerializer.Deserialize<TitleUpdateMetadata>(stream, resolver).Selected; + + if (File.Exists(updatePath)) + { + FileStream file = new FileStream(updatePath, FileMode.Open, FileAccess.Read); + PartitionFileSystem nsp = new PartitionFileSystem(file.AsStorage()); + + foreach (DirectoryEntryEx ticketEntry in nsp.EnumerateEntries("/", "*.tik")) + { + Result result = nsp.OpenFile(out IFile ticketFile, ticketEntry.FullPath.ToU8Span(), OpenMode.Read); + + if (result.IsSuccess()) + { + Ticket ticket = new Ticket(ticketFile.AsStream()); + + KeySet.ExternalKeySet.Add(new RightsId(ticket.RightsId), new AccessKey(ticket.GetTitleKey(KeySet))); + } + } + + foreach (DirectoryEntryEx fileEntry in nsp.EnumerateEntries("/", "*.nca")) + { + nsp.OpenFile(out IFile ncaFile, fileEntry.FullPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); + + Nca nca = new Nca(KeySet, ncaFile.AsStorage()); + + if ($"{nca.Header.TitleId.ToString("x16")[..^3]}000" != mainNca.Header.TitleId.ToString("x16")) + { + break; + } + + if (nca.Header.ContentType == NcaContentType.Program) + { + patchNca = nca; + } + else if (nca.Header.ContentType == NcaContentType.Control) + { + controlNca = nca; + } + } + } + } + } + if (patchNca == null) { if (mainNca.CanOpenSection(NcaSectionType.Data)) @@ -498,7 +555,8 @@ namespace Ryujinx.HLE.HOS LoadExeFs(codeFs, out Npdm metaData); - TitleId = metaData.Aci0.TitleId; + TitleId = metaData.Aci0.TitleId; + TitleIs64Bit = metaData.Is64Bit; if (controlNca != null) { @@ -513,6 +571,8 @@ namespace Ryujinx.HLE.HOS { EnsureSaveData(new TitleId(TitleId)); } + + Logger.PrintInfo(LogClass.Loader, $"Application Loaded: {TitleName} v{TitleVersionString} [{TitleIdText}] [{(TitleIs64Bit ? "64-bit" : "32-bit")}]"); } private void LoadExeFs(IFileSystem codeFs, out Npdm metaData) @@ -551,7 +611,8 @@ namespace Ryujinx.HLE.HOS } } - TitleId = metaData.Aci0.TitleId; + TitleId = metaData.Aci0.TitleId; + TitleIs64Bit = metaData.Is64Bit; LoadNso("rtld"); LoadNso("main"); @@ -653,8 +714,9 @@ namespace Ryujinx.HLE.HOS ContentManager.LoadEntries(Device); - TitleName = metaData.TitleName; - TitleId = metaData.Aci0.TitleId; + TitleName = metaData.TitleName; + TitleId = metaData.Aci0.TitleId; + TitleIs64Bit = metaData.Is64Bit; ProgramLoader.LoadStaticObjects(this, metaData, new IExecutable[] { staticObject }); } |
