public void Load(System.IO.Stream stream) { _stream = stream; FileInfo.KeepOpen = true; using (var reader = new FileReader(stream, true)) { reader.ByteOrder = Syroot.BinaryData.ByteOrder.LittleEndian; header = reader.ReadStruct <Header>(); Console.WriteLine("RomfsOffset " + header.RomfsOffset); Console.WriteLine("RomfsSize " + header.RomfsSize); if (header.RomfsOffset != 0 && header.RomfsSize != 0) { uint offset = header.RomfsOffset * MediaUnitSize; uint size = header.RomfsSize * MediaUnitSize; RomFS = new RomFS(); RomFS.FileInfo = new File_Info(); RomFS.FileInfo.ParentArchive = this; RomFS.Load(new SubStream(stream, offset, size)); files.AddRange(RomFS.files); } } }
public NCCH(Stream input) { _stream = input; using (var br = new BinaryReaderX(input, true)) { //NCCH Header ncchHeader = br.ReadStruct <Header>(); if (ncchHeader.ncchSize != input.Length / mediaUnitSize) { throw new Exception("Size in header is not the same as the file."); } //ExtHeader if (ncchHeader.exHeaderSize != 0) { var exHeaderOffset = br.BaseStream.Position; exHeader = br.ReadStruct <ExHeader>(); Files.Add(new ArchiveFileInfo { State = ArchiveFileState.Archived, FileName = "ExHeader.bin", FileData = new SubStream(br.BaseStream, exHeaderOffset, ncchHeader.exHeaderSize * 2) }); } //Plain Region if (ncchHeader.plainRegionOffset != 0 && ncchHeader.plainRegionSize != 0) { br.BaseStream.Position = ncchHeader.plainRegionOffset * mediaUnitSize; plainRegion = br.ReadBytes(ncchHeader.plainRegionSize * mediaUnitSize); Files.Add(new ArchiveFileInfo { State = ArchiveFileState.Archived, FileName = "PlainRegion.bin", FileData = new SubStream(br.BaseStream, ncchHeader.plainRegionOffset * mediaUnitSize, ncchHeader.plainRegionSize * mediaUnitSize) }); } //Logo Region if (ncchHeader.logoRegionOffset != 0 && ncchHeader.logoRegionSize != 0) { br.BaseStream.Position = ncchHeader.logoRegionOffset * mediaUnitSize; logoRegion = br.ReadBytes(ncchHeader.logoRegionSize * mediaUnitSize); Files.Add(new ArchiveFileInfo { State = ArchiveFileState.Archived, FileName = "Logo.icn", FileData = new SubStream(br.BaseStream, ncchHeader.logoRegionOffset * mediaUnitSize, ncchHeader.logoRegionSize * mediaUnitSize) }); } //ExeFS int exeFSHeaderSize = 0x200; if (ncchHeader.exeFSOffset != 0 && ncchHeader.exeFSSize != 0) { br.BaseStream.Position = ncchHeader.exeFSOffset * mediaUnitSize; exeFS = new ExeFS(br.BaseStream); foreach (var exeFsFile in exeFS.fileHeader) { if (exeFsFile.offset == 0 && exeFsFile.size == 0) { break; } Files.Add(new ExeFSFileInfo { State = ArchiveFileState.Archived, FileName = "ExeFS\\" + exeFsFile.name, FileData = new SubStream(br.BaseStream, ncchHeader.exeFSOffset * mediaUnitSize + exeFSHeaderSize + exeFsFile.offset, exeFsFile.size), compressed = exeFsFile.name == ".code" && (exHeader.sci.flag & 0x1) == 1 }); } } //RomFS if (ncchHeader.romFSOffset != 0 && ncchHeader.romFSSize != 0) { br.BaseStream.Position = ncchHeader.romFSOffset * mediaUnitSize; romFS = new RomFS(br.BaseStream); foreach (var romFSFile in romFS.files) { Files.Add(new ArchiveFileInfo { State = ArchiveFileState.Archived, FileName = "RomFS" + romFSFile.fileName, FileData = new SubStream(br.BaseStream, romFSFile.fileOffset, romFSFile.fileSize) }); } } } }