From a62deb8cfda1779ed52a2ee3ff6ce534a220c19a Mon Sep 17 00:00:00 2001 From: KeatonTheBot Date: Wed, 27 Aug 2025 15:01:30 -0500 Subject: [PATCH] Fix some DLCs crashing due to stream loader change --- src/Ryujinx.HLE/FileSystem/ContentManager.cs | 12 +++++++----- .../Extensions/PartitionFileSystemExtensions.cs | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Ryujinx.HLE/FileSystem/ContentManager.cs b/src/Ryujinx.HLE/FileSystem/ContentManager.cs index 7126b173e..054dc96a7 100644 --- a/src/Ryujinx.HLE/FileSystem/ContentManager.cs +++ b/src/Ryujinx.HLE/FileSystem/ContentManager.cs @@ -42,12 +42,14 @@ namespace Ryujinx.HLE.FileSystem private readonly struct AocItem { + public readonly string ContainerPath; public readonly Stream ContainerStream; public readonly string NcaPath; public readonly string Extension; - public AocItem(Stream containerStream, string ncaPath, string extension) + public AocItem(string containerPath, Stream containerStream, string ncaPath, string extension) { + ContainerPath = containerPath; ContainerStream = containerStream; Extension = extension; NcaPath = ncaPath; @@ -189,10 +191,10 @@ namespace Ryujinx.HLE.FileSystem } } - public void AddAocItem(ulong titleId, Stream containerStream, string ncaPath, string extension, bool mergedToContainer = false) + public void AddAocItem(ulong titleId, string containerPath, Stream containerStream, string ncaPath, string extension, bool mergedToContainer = false) { // TODO: Check Aoc version. - if (!AocData.TryAdd(titleId, new AocItem(containerStream, ncaPath, extension))) + if (!AocData.TryAdd(titleId, new AocItem(containerPath, containerStream, ncaPath, extension))) { Logger.Warning?.Print(LogClass.Application, $"Duplicate AddOnContent detected. TitleId {titleId:X16}"); } @@ -227,6 +229,7 @@ namespace Ryujinx.HLE.FileSystem if (AocData.TryGetValue(aocTitleId, out AocItem aoc)) { + var file = new FileStream(aoc.ContainerPath, FileMode.Open, FileAccess.Read); using var ncaFile = new UniqueRef(); switch (aoc.Extension) @@ -237,7 +240,7 @@ namespace Ryujinx.HLE.FileSystem break; case ".nsp": var pfs = new PartitionFileSystem(); - pfs.Initialize(aoc.ContainerStream.AsStorage()); + pfs.Initialize(file.AsStorage()); pfs.OpenFile(ref ncaFile.Ref, aoc.NcaPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); break; default: @@ -709,7 +712,6 @@ namespace Ryujinx.HLE.FileSystem FileInfo info = new(firmwarePackage); - if (info.Extension == ".zip" || info.Extension == ".xci") { using FileStream file = File.OpenRead(firmwarePackage); diff --git a/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs b/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs index e8feb719e..aec36d159 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs +++ b/src/Ryujinx.HLE/Loaders/Processes/Extensions/PartitionFileSystemExtensions.cs @@ -131,7 +131,7 @@ namespace Ryujinx.HLE.Loaders.Processes.Extensions { if (downloadableContentNca.Enabled) { - device.Configuration.ContentManager.AddAocItem(downloadableContentNca.TitleId, stream, downloadableContentNca.FullPath, System.IO.Path.GetExtension(downloadableContentContainer.ContainerPath)); + device.Configuration.ContentManager.AddAocItem(downloadableContentNca.TitleId, downloadableContentContainer.ContainerPath, stream, downloadableContentNca.FullPath, System.IO.Path.GetExtension(downloadableContentContainer.ContainerPath)); } } else