From 9f555db5cdc13cedce08879fea28406849f46642 Mon Sep 17 00:00:00 2001 From: Ac_K Date: Wed, 7 Dec 2022 15:00:28 +0100 Subject: [PATCH] hle: Do not add disabled AoC item to the list (#4044) * hle: Do not add disabled AoC item to the list We currently add all AoC items to a list in `ContentManager` and the enable check is only done when FS service ask for the data. Which is wrong. It causes an issue in MK8D which doesn't boot even if you have disabled a not updated DLC. I've fixed it by not adding the disabled AoC item to the list, I've removed some duplicate code too. There is still an edge case because we currently don't check the AoC Item version, but that should be fixed later since now MK8D throw an error if the DLC isn't updated. * remove useless "enabled" --- Ryujinx.HLE/FileSystem/ContentManager.cs | 36 ++++++++++-------------- Ryujinx.HLE/HOS/ApplicationLoader.cs | 4 +-- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/Ryujinx.HLE/FileSystem/ContentManager.cs b/Ryujinx.HLE/FileSystem/ContentManager.cs index 652c24695..9ae619adb 100644 --- a/Ryujinx.HLE/FileSystem/ContentManager.cs +++ b/Ryujinx.HLE/FileSystem/ContentManager.cs @@ -39,13 +39,11 @@ namespace Ryujinx.HLE.FileSystem { public readonly string ContainerPath; public readonly string NcaPath; - public bool Enabled; - public AocItem(string containerPath, string ncaPath, bool enabled) + public AocItem(string containerPath, string ncaPath) { ContainerPath = containerPath; NcaPath = ncaPath; - Enabled = enabled; } } @@ -53,7 +51,7 @@ namespace Ryujinx.HLE.FileSystem private VirtualFileSystem _virtualFileSystem; - private readonly object _lock = new object(); + private readonly object _lock = new(); public ContentManager(VirtualFileSystem virtualFileSystem) { @@ -226,27 +224,21 @@ namespace Ryujinx.HLE.FileSystem pfs0.OpenFile(ref cnmtFile.Ref(), pfs0.EnumerateEntries().Single().FullPath.ToU8Span(), OpenMode.Read); var cnmt = new Cnmt(cnmtFile.Get.AsStream()); - if (cnmt.Type != ContentMetaType.AddOnContent || (cnmt.TitleId & 0xFFFFFFFFFFFFE000) != aocBaseId) { continue; } string ncaId = BitConverter.ToString(cnmt.ContentEntries[0].NcaId).Replace("-", "").ToLower(); - if (!_aocData.TryAdd(cnmt.TitleId, new AocItem(containerPath, $"{ncaId}.nca", true))) - { - Logger.Warning?.Print(LogClass.Application, $"Duplicate AddOnContent detected. TitleId {cnmt.TitleId:X16}"); - } - else - { - Logger.Info?.Print(LogClass.Application, $"Found AddOnContent with TitleId {cnmt.TitleId:X16}"); - } + + AddAocItem(cnmt.TitleId, containerPath, $"{ncaId}.nca", true); } } - public void AddAocItem(ulong titleId, string containerPath, string ncaPath, bool enabled) + public void AddAocItem(ulong titleId, string containerPath, string ncaPath, bool mergedToContainer = false) { - if (!_aocData.TryAdd(titleId, new AocItem(containerPath, ncaPath, enabled))) + // TODO: Check Aoc version. + if (!_aocData.TryAdd(titleId, new AocItem(containerPath, ncaPath))) { Logger.Warning?.Print(LogClass.Application, $"Duplicate AddOnContent detected. TitleId {titleId:X16}"); } @@ -254,25 +246,27 @@ namespace Ryujinx.HLE.FileSystem { Logger.Info?.Print(LogClass.Application, $"Found AddOnContent with TitleId {titleId:X16}"); - using (FileStream fileStream = File.OpenRead(containerPath)) - using (PartitionFileSystem pfs = new PartitionFileSystem(fileStream.AsStorage())) + if (!mergedToContainer) { - _virtualFileSystem.ImportTickets(pfs); + using FileStream fileStream = File.OpenRead(containerPath); + using PartitionFileSystem partitionFileSystem = new(fileStream.AsStorage()); + + _virtualFileSystem.ImportTickets(partitionFileSystem); } } } public void ClearAocData() => _aocData.Clear(); - public int GetAocCount() => _aocData.Where(e => e.Value.Enabled).Count(); + public int GetAocCount() => _aocData.Count; - public IList GetAocTitleIds() => _aocData.Where(e => e.Value.Enabled).Select(e => e.Key).ToList(); + public IList GetAocTitleIds() => _aocData.Select(e => e.Key).ToList(); public bool GetAocDataStorage(ulong aocTitleId, out IStorage aocStorage, IntegrityCheckLevel integrityCheckLevel) { aocStorage = null; - if (_aocData.TryGetValue(aocTitleId, out AocItem aoc) && aoc.Enabled) + if (_aocData.TryGetValue(aocTitleId, out AocItem aoc)) { var file = new FileStream(aoc.ContainerPath, FileMode.Open, FileAccess.Read); using var ncaFile = new UniqueRef(); diff --git a/Ryujinx.HLE/HOS/ApplicationLoader.cs b/Ryujinx.HLE/HOS/ApplicationLoader.cs index 199da37a3..61fcd0c35 100644 --- a/Ryujinx.HLE/HOS/ApplicationLoader.cs +++ b/Ryujinx.HLE/HOS/ApplicationLoader.cs @@ -426,9 +426,9 @@ namespace Ryujinx.HLE.HOS { foreach (DownloadableContentNca downloadableContentNca in downloadableContentContainer.DownloadableContentNcaList) { - if (File.Exists(downloadableContentContainer.ContainerPath)) + if (File.Exists(downloadableContentContainer.ContainerPath) && downloadableContentNca.Enabled) { - _device.Configuration.ContentManager.AddAocItem(downloadableContentNca.TitleId, downloadableContentContainer.ContainerPath, downloadableContentNca.FullPath, downloadableContentNca.Enabled); + _device.Configuration.ContentManager.AddAocItem(downloadableContentNca.TitleId, downloadableContentContainer.ContainerPath, downloadableContentNca.FullPath); } else {