aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs')
-rw-r--r--src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs b/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs
new file mode 100644
index 00000000..3c4ce085
--- /dev/null
+++ b/src/Ryujinx.HLE/Utilities/PartitionFileSystemUtils.cs
@@ -0,0 +1,45 @@
+using LibHac;
+using LibHac.Fs.Fsa;
+using LibHac.FsSystem;
+using LibHac.Tools.Fs;
+using LibHac.Tools.FsSystem;
+using Ryujinx.HLE.FileSystem;
+using System.IO;
+
+namespace Ryujinx.HLE.Utilities
+{
+ public static class PartitionFileSystemUtils
+ {
+ public static IFileSystem OpenApplicationFileSystem(string path, VirtualFileSystem fileSystem, bool throwOnFailure = true)
+ {
+ FileStream file = File.OpenRead(path);
+
+ IFileSystem partitionFileSystem;
+
+ if (Path.GetExtension(path).ToLower() == ".xci")
+ {
+ partitionFileSystem = new Xci(fileSystem.KeySet, file.AsStorage()).OpenPartition(XciPartitionType.Secure);
+ }
+ else
+ {
+ var pfsTemp = new PartitionFileSystem();
+ Result initResult = pfsTemp.Initialize(file.AsStorage());
+
+ if (throwOnFailure)
+ {
+ initResult.ThrowIfFailure();
+ }
+ else if (initResult.IsFailure())
+ {
+ return null;
+ }
+
+ partitionFileSystem = pfsTemp;
+ }
+
+ fileSystem.ImportTickets(partitionFileSystem);
+
+ return partitionFileSystem;
+ }
+ }
+}