Add support of PFS0 as ExeFS (#564)

Also add .pfs0 support
This commit is contained in:
Thomas Guillemard 2019-01-25 02:51:28 +01:00 committed by gdkchan
parent 1af6c31dc0
commit 72157e03eb
2 changed files with 57 additions and 1 deletions

View File

@ -394,7 +394,62 @@ namespace Ryujinx.HLE.HOS
return; return;
} }
Logger.PrintError(LogClass.Loader, "Could not find an Application NCA in the provided NSP file"); // This is not a normal NSP, it's actually a ExeFS as a NSP
Npdm metaData = null;
PfsFileEntry npdmFile = nsp.Files.FirstOrDefault(x => x.Name.Equals("main.npdm"));
if (npdmFile != null)
{
Logger.PrintInfo(LogClass.Loader, $"Loading main.npdm...");
metaData = new Npdm(nsp.OpenFile(npdmFile).AsStream());
}
else
{
Logger.PrintWarning(LogClass.Loader, $"NPDM file not found, using default values!");
metaData = GetDefaultNpdm();
}
List<IExecutable> staticObjects = new List<IExecutable>();
void LoadNso(string searchPattern)
{
PfsFileEntry entry = nsp.Files.FirstOrDefault(x => x.Name.Equals(searchPattern));
if (entry != null)
{
Logger.PrintInfo(LogClass.Loader, $"Loading {entry.Name}...");
NxStaticObject staticObject = new NxStaticObject(nsp.OpenFile(entry).AsStream());
staticObjects.Add(staticObject);
}
}
if (!metaData.Is64Bits)
{
throw new NotImplementedException("32-bit titles are unsupported!");
}
CurrentTitle = metaData.Aci0.TitleId.ToString("x16");
LoadNso("rtld");
LoadNso("main");
LoadNso("subsdk*");
LoadNso("sdk");
ContentManager.LoadEntries();
if (staticObjects.Count == 0)
{
Logger.PrintError(LogClass.Loader, "Could not find an Application NCA in the provided NSP file");
}
else
{
ProgramLoader.LoadStaticObjects(this, metaData, staticObjects.ToArray());
}
} }
public void LoadNca(Nca mainNca, Nca controlNca) public void LoadNca(Nca mainNca, Nca controlNca)

View File

@ -61,6 +61,7 @@ namespace Ryujinx
device.LoadNca(args[0]); device.LoadNca(args[0]);
break; break;
case ".nsp": case ".nsp":
case ".pfs0":
Console.WriteLine("Loading as NSP."); Console.WriteLine("Loading as NSP.");
device.LoadNsp(args[0]); device.LoadNsp(args[0]);
break; break;