Jelajahi Sumber

Misc content loading improvements (#432)

* Misc content loading improvements
Alex Barney 7 tahun lalu
induk
melakukan
5821ff675d
4 mengubah file dengan 26 tambahan dan 13 penghapusan
  1. 20 12
      Ryujinx.HLE/HOS/Horizon.cs
  2. 1 1
      Ryujinx.HLE/Ryujinx.HLE.csproj
  3. 2 0
      Ryujinx/Config.cs
  4. 3 0
      Ryujinx/Ryujinx.conf

+ 20 - 12
Ryujinx.HLE/HOS/Horizon.cs

@@ -51,6 +51,8 @@ namespace Ryujinx.HLE.HOS
 
         public string CurrentTitle { get; private set; }
 
+        public bool EnableFsIntegrityChecks { get; set; }
+
         public Horizon(Switch Device)
         {
             this.Device = Device;
@@ -220,12 +222,19 @@ namespace Ryujinx.HLE.HOS
                 ReadControlData(ControlNca);
             }
 
+            if (PatchNca != null)
+            {
+                PatchNca.SetBaseNca(MainNca);
+
+                return (PatchNca, ControlNca);
+            }
+
             return (MainNca, ControlNca);
         }
 
         public void ReadControlData(Nca ControlNca)
         {
-            Romfs ControlRomfs = new Romfs(ControlNca.OpenSection(0, false));
+            Romfs ControlRomfs = new Romfs(ControlNca.OpenSection(0, false, EnableFsIntegrityChecks));
 
             byte[] ControlFile = ControlRomfs.GetFile("/control.nacp");
 
@@ -254,8 +263,7 @@ namespace Ryujinx.HLE.HOS
             // Load title key from the NSP's ticket in case the user doesn't have a title key file
             if (TicketFile != null)
             {
-                // todo Change when Ticket(Stream) overload is added
-                Ticket Ticket = new Ticket(new BinaryReader(Nsp.OpenFile(TicketFile)));
+                Ticket Ticket = new Ticket(Nsp.OpenFile(TicketFile));
 
                 KeySet.TitleKeys[Ticket.RightsId] = Ticket.GetTitleKey(KeySet);
             }
@@ -289,7 +297,7 @@ namespace Ryujinx.HLE.HOS
 
         public void LoadNca(Nca MainNca, Nca ControlNca)
         {
-            NcaSection RomfsSection = MainNca.Sections.FirstOrDefault(x => x?.Type == SectionType.Romfs);
+            NcaSection RomfsSection = MainNca.Sections.FirstOrDefault(x => x?.Type == SectionType.Romfs || x?.Type == SectionType.Bktr);
             NcaSection ExefsSection = MainNca.Sections.FirstOrDefault(x => x?.IsExefs == true);
 
             if (ExefsSection == null)
@@ -301,16 +309,16 @@ namespace Ryujinx.HLE.HOS
 
             if (RomfsSection == null)
             {
-                Device.Log.PrintError(LogClass.Loader, "No RomFS found in NCA");
-
-                return;
+                Device.Log.PrintWarning(LogClass.Loader, "No RomFS found in NCA");
             }
+            else
+            {
+                Stream RomfsStream = MainNca.OpenSection(RomfsSection.SectionNum, false, EnableFsIntegrityChecks);
 
-            Stream RomfsStream = MainNca.OpenSection(RomfsSection.SectionNum, false);
-
-            Device.FileSystem.SetRomFs(RomfsStream);
+                Device.FileSystem.SetRomFs(RomfsStream);
+            }
 
-            Stream ExefsStream = MainNca.OpenSection(ExefsSection.SectionNum, false);
+            Stream ExefsStream = MainNca.OpenSection(ExefsSection.SectionNum, false, EnableFsIntegrityChecks);
 
             Pfs Exefs = new Pfs(ExefsStream);
 
@@ -350,7 +358,7 @@ namespace Ryujinx.HLE.HOS
 
             Nacp ReadControlData()
             {
-                Romfs ControlRomfs = new Romfs(ControlNca.OpenSection(0, false));
+                Romfs ControlRomfs = new Romfs(ControlNca.OpenSection(0, false, EnableFsIntegrityChecks));
 
                 byte[] ControlFile = ControlRomfs.GetFile("/control.nacp");
 

+ 1 - 1
Ryujinx.HLE/Ryujinx.HLE.csproj

@@ -25,7 +25,7 @@
     <ProjectReference Include="..\ChocolArm64\ChocolArm64.csproj" />
     <ProjectReference Include="..\Ryujinx.Audio\Ryujinx.Audio.csproj" />
     <ProjectReference Include="..\Ryujinx.Graphics\Ryujinx.Graphics.csproj" />
-    <PackageReference Include="LibHac" Version="0.1.1" />
+    <PackageReference Include="LibHac" Version="0.1.2" />
   </ItemGroup>
 
 </Project>

+ 2 - 0
Ryujinx/Config.cs

@@ -68,6 +68,8 @@ namespace Ryujinx
                 Device.System.EnableMultiCoreScheduling();
             }
 
+            Device.System.EnableFsIntegrityChecks = Convert.ToBoolean(Parser.Value("Enable_FS_Integrity_Checks"));
+
             JoyConKeyboard = new JoyConKeyboard(
 
                 new JoyConKeyboardLeft

+ 3 - 0
Ryujinx/Ryujinx.conf

@@ -31,6 +31,9 @@ Enable_Vsync = true
 #Enable or Disable Multi-core scheduling of threads
 Enable_MultiCore_Scheduling = false
 
+#Enable integrity checks on Switch content files
+Enable_FS_Integrity_Checks = true
+
 #Controller Device Index
 GamePad_Index = 0