public void LoadKip(string kipFile) { using (FileStream fs = new FileStream(kipFile, FileMode.Open)) { ProgramLoader.LoadKernelInitalProcess(this, new KernelInitialProcess(fs)); } }
public void LoadCart(string exeFsDir, string romFsFile = null) { if (romFsFile != null) { Device.FileSystem.LoadRomFs(romFsFile); } string npdmFileName = Path.Combine(exeFsDir, "main.npdm"); Npdm metaData = null; if (File.Exists(npdmFileName)) { Logger.PrintInfo(LogClass.Loader, $"Loading main.npdm..."); using (FileStream input = new FileStream(npdmFileName, FileMode.Open)) { metaData = new Npdm(input); } } else { Logger.PrintWarning(LogClass.Loader, $"NPDM file not found, using default values!"); metaData = GetDefaultNpdm(); } List <IExecutable> staticObjects = new List <IExecutable>(); void LoadNso(string searchPattern) { foreach (string file in Directory.GetFiles(exeFsDir, searchPattern)) { if (Path.GetExtension(file) != string.Empty) { continue; } Logger.PrintInfo(LogClass.Loader, $"Loading {Path.GetFileNameWithoutExtension(file)}..."); using (FileStream input = new FileStream(file, FileMode.Open)) { NxStaticObject staticObject = new NxStaticObject(input); staticObjects.Add(staticObject); } } } CurrentTitle = metaData.Aci0.TitleId.ToString("x16"); LoadNso("rtld"); LoadNso("main"); LoadNso("subsdk*"); LoadNso("sdk"); ContentManager.LoadEntries(); ProgramLoader.LoadStaticObjects(this, metaData, staticObjects.ToArray()); }
public void LoadKip(string kipFile) { using (IStorage fs = new LocalStorage(kipFile, FileAccess.Read)) { ProgramLoader.LoadKip(KernelContext, new KipExecutable(fs)); } }
public void LoadProgram(string filePath) { Npdm metaData = GetDefaultNpdm(); bool isNro = Path.GetExtension(filePath).ToLower() == ".nro"; FileStream input = new FileStream(filePath, FileMode.Open); IExecutable staticObject; if (isNro) { NxRelocatableObject obj = new NxRelocatableObject(input); staticObject = obj; // homebrew NRO can actually have some data after the actual NRO if (input.Length > obj.FileSize) { input.Position = obj.FileSize; BinaryReader reader = new BinaryReader(input); uint asetMagic = reader.ReadUInt32(); if (asetMagic == 0x54455341) { uint asetVersion = reader.ReadUInt32(); if (asetVersion == 0) { ulong iconOffset = reader.ReadUInt64(); ulong iconSize = reader.ReadUInt64(); ulong nacpOffset = reader.ReadUInt64(); ulong nacpSize = reader.ReadUInt64(); ulong romfsOffset = reader.ReadUInt64(); ulong romfsSize = reader.ReadUInt64(); if (romfsSize != 0) { Device.FileSystem.SetRomFs(new HomebrewRomFsStream(input, obj.FileSize + (long)romfsOffset)); } } else { Logger.PrintWarning(LogClass.Loader, $"Unsupported ASET header version found \"{asetVersion}\""); } } } } else { staticObject = new NxStaticObject(input); } ContentManager.LoadEntries(); ProgramLoader.LoadStaticObjects(this, metaData, new IExecutable[] { staticObject }); }
public void LoadProgram(string filePath) { Npdm metaData = GetDefaultNpdm(); bool isNro = Path.GetExtension(filePath).ToLower() == ".nro"; using (FileStream input = new FileStream(filePath, FileMode.Open)) { IExecutable staticObject = isNro ? (IExecutable) new NxRelocatableObject(input) : new NxStaticObject(input); ProgramLoader.LoadStaticObjects(this, metaData, new IExecutable[] { staticObject }); } }
private void LoadExeFs(IFileSystem codeFs, out Npdm metaData) { Result result = codeFs.OpenFile(out IFile npdmFile, "/main.npdm", OpenMode.Read); if (result == ResultFs.PathNotFound) { Logger.PrintWarning(LogClass.Loader, "NPDM file not found, using default values!"); metaData = GetDefaultNpdm(); } else { metaData = new Npdm(npdmFile.AsStream()); } List <IExecutable> staticObjects = new List <IExecutable>(); void LoadNso(string filename) { foreach (DirectoryEntryEx file in codeFs.EnumerateEntries("/", $"{filename}*")) { if (Path.GetExtension(file.Name) != string.Empty) { continue; } Logger.PrintInfo(LogClass.Loader, $"Loading {file.Name}..."); codeFs.OpenFile(out IFile nsoFile, file.FullPath, OpenMode.Read).ThrowIfFailure(); NxStaticObject staticObject = new NxStaticObject(nsoFile.AsStream()); staticObjects.Add(staticObject); } } TitleId = metaData.Aci0.TitleId; LoadNso("rtld"); LoadNso("main"); LoadNso("subsdk"); LoadNso("sdk"); ContentManager.LoadEntries(Device); ProgramLoader.LoadStaticObjects(this, metaData, staticObjects.ToArray()); }
private void LoadExeFs(IFileSystem codeFs, out Npdm metaData) { if (codeFs.FileExists("/main.npdm")) { Logger.PrintInfo(LogClass.Loader, "Loading main.npdm..."); metaData = new Npdm(codeFs.OpenFile("/main.npdm", OpenMode.Read).AsStream()); } else { Logger.PrintWarning(LogClass.Loader, "NPDM file not found, using default values!"); metaData = GetDefaultNpdm(); } List <IExecutable> staticObjects = new List <IExecutable>(); void LoadNso(string filename) { foreach (DirectoryEntry file in codeFs.EnumerateEntries($"{filename}*")) { if (Path.GetExtension(file.Name) != string.Empty) { continue; } Logger.PrintInfo(LogClass.Loader, $"Loading {file.Name}..."); NxStaticObject staticObject = new NxStaticObject(codeFs.OpenFile(file.FullPath, OpenMode.Read).AsStream()); staticObjects.Add(staticObject); } } TitleID = CurrentTitle = metaData.Aci0.TitleId.ToString("x16"); LoadNso("rtld"); LoadNso("main"); LoadNso("subsdk"); LoadNso("sdk"); ContentManager.LoadEntries(); ProgramLoader.LoadStaticObjects(this, metaData, staticObjects.ToArray()); }
public void LoadNca(Nca mainNca, Nca controlNca) { if (mainNca.Header.ContentType != ContentType.Program) { Logger.PrintError(LogClass.Loader, "Selected NCA is not a \"Program\" NCA"); return; } Stream romfsStream = mainNca.OpenSection(ProgramPartitionType.Data, false, FsIntegrityCheckLevel); Stream exefsStream = mainNca.OpenSection(ProgramPartitionType.Code, false, FsIntegrityCheckLevel); if (exefsStream == null) { Logger.PrintError(LogClass.Loader, "No ExeFS found in NCA"); return; } if (romfsStream == null) { Logger.PrintWarning(LogClass.Loader, "No RomFS found in NCA"); } else { Device.FileSystem.SetRomFs(romfsStream); } Pfs exefs = new Pfs(exefsStream); Npdm metaData = null; if (exefs.FileExists("main.npdm")) { Logger.PrintInfo(LogClass.Loader, "Loading main.npdm..."); metaData = new Npdm(exefs.OpenFile("main.npdm")); } else { Logger.PrintWarning(LogClass.Loader, $"NPDM file not found, using default values!"); metaData = GetDefaultNpdm(); } List <IExecutable> staticObjects = new List <IExecutable>(); void LoadNso(string filename) { foreach (PfsFileEntry file in exefs.Files.Where(x => x.Name.StartsWith(filename))) { if (Path.GetExtension(file.Name) != string.Empty) { continue; } Logger.PrintInfo(LogClass.Loader, $"Loading {filename}..."); NxStaticObject staticObject = new NxStaticObject(exefs.OpenFile(file)); staticObjects.Add(staticObject); } } Nacp ReadControlData() { Romfs controlRomfs = new Romfs(controlNca.OpenSection(0, false, FsIntegrityCheckLevel)); byte[] controlFile = controlRomfs.GetFile("/control.nacp"); BinaryReader reader = new BinaryReader(new MemoryStream(controlFile)); Nacp controlData = new Nacp(reader); CurrentTitle = controlData.Languages[(int)State.DesiredTitleLanguage].Title; if (string.IsNullOrWhiteSpace(CurrentTitle)) { CurrentTitle = controlData.Languages.ToList().Find(x => !string.IsNullOrWhiteSpace(x.Title)).Title; } return(controlData); } if (controlNca != null) { ReadControlData(); } else { CurrentTitle = metaData.Aci0.TitleId.ToString("x16"); } if (!metaData.Is64Bits) { throw new NotImplementedException("32-bit titles are not supported!"); } LoadNso("rtld"); LoadNso("main"); LoadNso("subsdk"); LoadNso("sdk"); ContentManager.LoadEntries(); ProgramLoader.LoadStaticObjects(this, metaData, staticObjects.ToArray()); }
public void LoadKip(string kipPath) { using IStorage kipFile = new LocalStorage(kipPath, FileAccess.Read); ProgramLoader.LoadKip(KernelContext, new KipExecutable(kipFile)); }
public void LoadNsp(string nspFile) { FileStream file = new FileStream(nspFile, FileMode.Open, FileAccess.Read); Pfs nsp = new Pfs(file.AsStorage(false)); foreach (PfsFileEntry ticketEntry in nsp.Files.Where(x => x.Name.EndsWith(".tik"))) { Ticket ticket = new Ticket(nsp.OpenFile(ticketEntry).AsStream()); if (!KeySet.TitleKeys.ContainsKey(ticket.RightsId)) { KeySet.TitleKeys.Add(ticket.RightsId, ticket.GetTitleKey(KeySet)); } } Nca mainNca = null; Nca controlNca = null; foreach (PfsFileEntry ncaFile in nsp.Files.Where(x => x.Name.EndsWith(".nca"))) { Nca nca = new Nca(KeySet, nsp.OpenFile(ncaFile), true); if (nca.Header.ContentType == ContentType.Program) { mainNca = nca; } else if (nca.Header.ContentType == ContentType.Control) { controlNca = nca; } } if (mainNca != null) { LoadNca(mainNca, controlNca); return; } // 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); } } 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 LoadKip(string kipPath) { using var kipFile = new SharedRef <IStorage>(new LocalStorage(kipPath, FileAccess.Read)); ProgramLoader.LoadKip(KernelContext, new KipExecutable(in kipFile)); }
public void LoadProgram(string filePath) { Npdm metaData = GetDefaultNpdm(); bool isNro = Path.GetExtension(filePath).ToLower() == ".nro"; FileStream input = new FileStream(filePath, FileMode.Open); IExecutable staticObject; if (isNro) { NxRelocatableObject obj = new NxRelocatableObject(input); staticObject = obj; // homebrew NRO can actually have some data after the actual NRO if (input.Length > obj.FileSize) { input.Position = obj.FileSize; BinaryReader reader = new BinaryReader(input); uint asetMagic = reader.ReadUInt32(); if (asetMagic == 0x54455341) { uint asetVersion = reader.ReadUInt32(); if (asetVersion == 0) { ulong iconOffset = reader.ReadUInt64(); ulong iconSize = reader.ReadUInt64(); ulong nacpOffset = reader.ReadUInt64(); ulong nacpSize = reader.ReadUInt64(); ulong romfsOffset = reader.ReadUInt64(); ulong romfsSize = reader.ReadUInt64(); if (romfsSize != 0) { Device.FileSystem.SetRomFs(new HomebrewRomFsStream(input, obj.FileSize + (long)romfsOffset)); } if (nacpSize != 0) { input.Seek(obj.FileSize + (long)nacpOffset, SeekOrigin.Begin); using (MemoryStream stream = new MemoryStream(reader.ReadBytes((int)nacpSize))) { ControlData = new Nacp(stream); } metaData.TitleName = ControlData.Descriptions[(int)State.DesiredTitleLanguage].Title; if (string.IsNullOrWhiteSpace(metaData.TitleName)) { metaData.TitleName = ControlData.Descriptions.ToList().Find(x => !string.IsNullOrWhiteSpace(x.Title)).Title; } metaData.Aci0.TitleId = ControlData.PresenceGroupId; if (metaData.Aci0.TitleId == 0) { metaData.Aci0.TitleId = ControlData.SaveDataOwnerId; } if (metaData.Aci0.TitleId == 0) { metaData.Aci0.TitleId = ControlData.AddOnContentBaseId - 0x1000; } if (metaData.Aci0.TitleId.ToString("x16") == "fffffffffffff000") { metaData.Aci0.TitleId = 0000000000000000; } } } else { Logger.PrintWarning(LogClass.Loader, $"Unsupported ASET header version found \"{asetVersion}\""); } } } } else { staticObject = new NxStaticObject(input); } ContentManager.LoadEntries(); TitleName = CurrentTitle = metaData.TitleName; TitleID = metaData.Aci0.TitleId.ToString("x16"); ProgramLoader.LoadStaticObjects(this, metaData, new IExecutable[] { staticObject }); }
public void LoadCart(string ExeFsDir, string RomFsFile = null) { if (RomFsFile != null) { Device.FileSystem.LoadRomFs(RomFsFile); } string NpdmFileName = Path.Combine(ExeFsDir, "main.npdm"); Npdm MetaData = null; if (File.Exists(NpdmFileName)) { Logger.PrintInfo(LogClass.Loader, $"Loading main.npdm..."); using (FileStream Input = new FileStream(NpdmFileName, FileMode.Open)) { MetaData = new Npdm(Input); } } else { Logger.PrintWarning(LogClass.Loader, $"NPDM file not found, using default values!"); MetaData = GetDefaultNpdm(); } List <IExecutable> StaticObjects = new List <IExecutable>(); void LoadNso(string SearchPattern) { foreach (string File in Directory.GetFiles(ExeFsDir, SearchPattern)) { if (Path.GetExtension(File) != string.Empty) { continue; } Logger.PrintInfo(LogClass.Loader, $"Loading {Path.GetFileNameWithoutExtension(File)}..."); using (FileStream Input = new FileStream(File, FileMode.Open)) { NxStaticObject StaticObject = new NxStaticObject(Input); 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(); ProgramLoader.LoadStaticObjects(this, MetaData, StaticObjects.ToArray()); }