예제 #1
0
        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);
                }
            }
        }
예제 #2
0
        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)
                        });
                    }
                }
            }
        }