private void BuildRomFsFile(FileStream isoStream, long ivfcOffset, long fileEntryOffset, long fileBlockOffset, long romFsDataOffset) { RomFsFileEntry file = new RomFsFileEntry(); // Nintendo3dsCtrFile tempFile; byte[] nameBytes; // load dir file.ParentDirOffset = ParseFile.ReadUintLE(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset); file.SiblingOffset = ParseFile.ReadInt32LE(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset + 4); file.DataOffset = ParseFile.ReadUlongLE(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset + 8); file.DataSize = ParseFile.ReadUlongLE(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset + 0x10); file.WeirdOffset = ParseFile.ReadUintLE(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset + 0x18); file.NameSize = ParseFile.ReadUintLE(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset + 0x1C); // build directory name if (file.NameSize > 0) { nameBytes = ParseFile.ParseSimpleOffset(isoStream, ivfcOffset + fileBlockOffset + fileEntryOffset + 0x20, (int)file.NameSize); file.Name = ByteConversion.GetUtf16LeText(nameBytes); } else // this is root { file.Name = "NO_NAME_FOUND"; // @TODO Make this a constant } this.FileName = file.Name; this.Offset = ivfcOffset + romFsDataOffset + (long)file.DataOffset; this.Size = (long)file.DataSize; // get sibling this.SiblingOffset = file.SiblingOffset; }
private void ParseNcsdHeader(FileStream fs, long offset) { // parse NCSD header this.NcsdHash = ParseFile.ParseSimpleOffset(fs, offset, 0x100); this.MagicBytes = ParseFile.ReadUintBE(fs, offset + 0x100); this.ImageSize = ParseFile.ReadUintLE(fs, offset + 0x104); this.MediaId = ParseFile.ReadUlongLE(fs, offset + 0x108); this.PartitionsFsType = ParseFile.ReadUlongLE(fs, offset + 0x110); this.PartitionsEncryptionType = ParseFile.ReadUlongLE(fs, offset + 0x118); this.NcchOffsetInfo = new SimpleOffset[8]; for (int i = 0; i < 8; i++) { this.NcchOffsetInfo[i] = new SimpleOffset( ParseFile.ReadUintLE(fs, offset + 0x120 + (8 * i)), ParseFile.ReadUintLE(fs, offset + 0x120 + ((8 * i) + 4))); } // parse Exheader this.ExHeaderHash = ParseFile.ParseSimpleOffset(fs, offset + 0x160, 0x20); this.AdditionalHeaderSize = ParseFile.ReadUintLE(fs, offset + 0x180); this.SectorZeroOffset = ParseFile.ReadUintLE(fs, offset + 0x184); this.PartitionFlags = ParseFile.ReadUlongLE(fs, offset + 0x188); this.PartitionIds = new ulong[8]; for (int i = 0; i < 8; i++) { this.PartitionIds[i] = ParseFile.ReadUlongLE(fs, offset + 0x190 + (8 * i)); } this.Reserved01 = ParseFile.ParseSimpleOffset(fs, offset + 0x1D0, 0x20); this.Reserved02 = ParseFile.ParseSimpleOffset(fs, offset + 0x1F0, 0xE); this.Unknown01 = ParseFile.ReadByte(fs, 0x1FE); this.Unknown02 = ParseFile.ReadByte(fs, 0x1FF); // parse Card Info this.CardInfoWritableAddress = ParseFile.ReadInt32LE(fs, offset + 0x200); this.CardInfoBitmask = ParseFile.ReadUintLE(fs, offset + 0x204); this.CardInfoReserved01 = ParseFile.ParseSimpleOffset(fs, offset + 0x208, 0xDF8); this.CardInfoMediaId = ParseFile.ReadUlongLE(fs, offset + 0x1000); this.CardInfoReserved02 = ParseFile.ReadUlongLE(fs, offset + 0x1008); this.CardInfoInitialData = ParseFile.ParseSimpleOffset(fs, offset + 0x1010, 0x30); this.CardInfoReserved03 = ParseFile.ParseSimpleOffset(fs, offset + 0x1040, 0xC0); this.CardInfoNcchHeaderCopy = ParseFile.ParseSimpleOffset(fs, offset + 0x1011, 0x100); }
private void BuildDirectory(FileStream isoStream, long ivfcOffset, long directoryEntryOffset, long directoryBlockOffset, long fileBlockOffset) { RomFsDirEntry dir = new RomFsDirEntry(); RomFsFileEntry file = new RomFsFileEntry(); Nintendo3dsCtrDirectory tempDir; Nintendo3dsCtrFile tempFile; byte[] nameBytes; string nextDirectory; // load dir dir.ParentOffset = ParseFile.ReadUintLE(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset); dir.SiblingOffset = ParseFile.ReadInt32LE(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset + 4); dir.ChildOffset = ParseFile.ReadInt32LE(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset + 8); dir.FileOffset = ParseFile.ReadInt32LE(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset + 0xC); dir.WeirdOffset = ParseFile.ReadInt32LE(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset + 0x10); dir.NameSize = ParseFile.ReadUintLE(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset + 0x14); // build directory name if (dir.NameSize > 0) { nameBytes = ParseFile.ParseSimpleOffset(isoStream, ivfcOffset + directoryBlockOffset + directoryEntryOffset + 0x18, (int)dir.NameSize); dir.Name = ByteConversion.GetUtf16LeText(nameBytes); } else // this is root { dir.Name = "RomFS"; // @TODO Make this a constant } this.DirectoryName = dir.Name; nextDirectory = this.ParentDirectoryName + Path.DirectorySeparatorChar + this.DirectoryName; // add files if (dir.FileOffset != -1) { tempFile = new Nintendo3dsCtrFile(isoStream, nextDirectory, isoStream.Name, null, ivfcOffset, -1, Nintendo3dsCtr.FileSystemType.RomFS, this.IvfcLevels[2], dir.FileOffset, fileBlockOffset, this.RomFsDataOffset); this.FileArray.Add(tempFile); while (tempFile.SiblingOffset != -1) { tempFile = new Nintendo3dsCtrFile(isoStream, nextDirectory, isoStream.Name, null, ivfcOffset, -1, Nintendo3dsCtr.FileSystemType.RomFS, this.IvfcLevels[2], tempFile.SiblingOffset, fileBlockOffset, this.RomFsDataOffset); this.FileArray.Add(tempFile); } } // get sibling dir if (dir.SiblingOffset != -1) { tempDir = new Nintendo3dsCtrDirectory(isoStream, isoStream.Name, this.ParentDirectoryName, ivfcOffset, Nintendo3dsCtr.FileSystemType.RomFS, this.IvfcLevels, dir.SiblingOffset, directoryBlockOffset, fileBlockOffset, this.RomFsDataOffset); this.SiblingDirectory = tempDir; } // add subdirs if (dir.ChildOffset != -1) { tempDir = new Nintendo3dsCtrDirectory(isoStream, isoStream.Name, nextDirectory, ivfcOffset, Nintendo3dsCtr.FileSystemType.RomFS, this.IvfcLevels, dir.ChildOffset, directoryBlockOffset, fileBlockOffset, this.RomFsDataOffset); this.SubDirectoryArray.Add(tempDir); while (tempDir.SiblingDirectory != null) { this.SubDirectoryArray.Add(tempDir.SiblingDirectory); tempDir = tempDir.SiblingDirectory; } } }