public NsoExecutable(IStorage inStorage) { NsoReader reader = new NsoReader(); reader.Initialize(inStorage.AsFile(OpenMode.Read)).ThrowIfFailure(); TextOffset = (int)reader.Header.Segments[0].MemoryOffset; RoOffset = (int)reader.Header.Segments[1].MemoryOffset; DataOffset = (int)reader.Header.Segments[2].MemoryOffset; BssSize = (int)reader.Header.BssSize; Text = DecompressSection(reader, NsoReader.SegmentType.Text); Ro = DecompressSection(reader, NsoReader.SegmentType.Ro); Data = DecompressSection(reader, NsoReader.SegmentType.Data); }
public NsoExecutable(IStorage inStorage, string name = null) { NsoReader reader = new NsoReader(); reader.Initialize(inStorage.AsFile(OpenMode.Read)).ThrowIfFailure(); TextOffset = (int)reader.Header.Segments[0].MemoryOffset; RoOffset = (int)reader.Header.Segments[1].MemoryOffset; DataOffset = (int)reader.Header.Segments[2].MemoryOffset; BssSize = (int)reader.Header.BssSize; reader.GetSegmentSize(NsoReader.SegmentType.Data, out uint uncompressedSize).ThrowIfFailure(); Program = new byte[DataOffset + uncompressedSize]; TextSize = DecompressSection(reader, NsoReader.SegmentType.Text, TextOffset, Program); RoSize = DecompressSection(reader, NsoReader.SegmentType.Ro, RoOffset, Program); DataSize = DecompressSection(reader, NsoReader.SegmentType.Data, DataOffset, Program); Name = name; BuildId = reader.Header.ModuleId; }
private void BuildChildItems(SectionItem parentItem) { try { const string?ROOT_PATH = "/"; var fileSystem = parentItem.FileSystem; if (fileSystem == null) { return; } var directoryEntries = SafeGetDirectoryEntries(fileSystem, ROOT_PATH, parentItem); foreach (var directoryEntry in directoryEntries) { var entryName = directoryEntry.Name; var entryPath = directoryEntry.FullPath; // NACP File if (parentItem.ParentItem.ContentType == NcaContentType.Control && string.Equals(entryName, NacpItem.NacpFileName, StringComparison.OrdinalIgnoreCase) && directoryEntry.Type == DirectoryEntryType.File) { IFile nacpFile; try { using var uniqueRefFile = new UniqueRef <IFile>(); fileSystem.OpenFile(ref uniqueRefFile.Ref(), entryPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); nacpFile = uniqueRefFile.Release(); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToOpenNacpFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } ApplicationControlProperty nacp; try { var blitStruct = new BlitStruct <ApplicationControlProperty>(1); nacpFile.Read(out _, 0, blitStruct.ByteSpan).ThrowIfFailure(); nacp = blitStruct.Value; } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadNacpFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } parentItem.ChildItems.Add(new NacpItem(nacp, parentItem, directoryEntry)); } // CNMT File else if (parentItem.ParentItem.ContentType == NcaContentType.Meta && entryName.EndsWith(".cnmt", StringComparison.OrdinalIgnoreCase) && directoryEntry.Type == DirectoryEntryType.File) { IFile cnmtFile; try { using var uniqueRefFile = new UniqueRef <IFile>(); fileSystem.OpenFile(ref uniqueRefFile.Ref(), entryPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); cnmtFile = uniqueRefFile.Release(); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToOpenCnmtFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } Cnmt cnmt; try { cnmt = new Cnmt(cnmtFile.AsStream()); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadCnmtFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } parentItem.ChildItems.Add(new CnmtItem(cnmt, parentItem, directoryEntry)); } // MAIN file else if (parentItem.ParentItem.ContentType == NcaContentType.Program && string.Equals(entryName, "main", StringComparison.OrdinalIgnoreCase) && directoryEntry.Type == DirectoryEntryType.File) { IFile nsoFile; try { using var uniqueRefFile = new UniqueRef <IFile>(); fileSystem.OpenFile(ref uniqueRefFile.Ref(), entryPath.ToU8Span(), OpenMode.Read).ThrowIfFailure(); nsoFile = uniqueRefFile.Release(); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToOpenMainFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } NsoHeader?nsoHeader; try { var nsoReader = new NsoReader(); nsoReader.Initialize(nsoFile).ThrowIfFailure(); nsoHeader = nsoReader.Header; } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadMainFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } parentItem.ChildItems.Add(new MainItem(nsoHeader.Value, parentItem, directoryEntry)); } else { var directoryEntryItem = new DirectoryEntryItem(parentItem, directoryEntry); BuildChildItems(directoryEntryItem); parentItem.ChildItems.Add(directoryEntryItem); } } } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadSectionContent.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); } }