public int CompareTo(object obj) { if (obj is Nintendo3dsCtrFile) { Nintendo3dsCtrFile o = (Nintendo3dsCtrFile)obj; return(this.FileName.CompareTo(o.FileName)); } throw new ArgumentException("object is not a Nintendo3dsCtrFile"); }
public void InitializeExeFileSystem(FileStream isoStream, long offset, string nextDirectoryName) { string fileName; long fileOffset; uint fileLength; byte[] hash; long hashOffset; Nintendo3dsCtrFile file; // parse file entries for (int i = 0; i < 10; i++) { // check if row has data if (ParseFile.ReadByte(isoStream, offset + (0x10 * i)) != 0) { // read VFS items fileName = ParseFile.ReadAsciiString(isoStream, offset + (0x10 * i)); fileOffset = ParseFile.ReadUintLE(isoStream, offset + (0x10 * i) + 8); fileOffset += offset + 0x200; fileLength = ParseFile.ReadUintLE(isoStream, offset + (0x10 * i) + 0xC); // read SHA256 hash hashOffset = offset + 0x200 - (0x20 * (i + 1)); hash = ParseFile.ParseSimpleOffset(isoStream, hashOffset, 0x20); // build file object file = new Nintendo3dsCtrFile(isoStream, nextDirectoryName, this.SourceFilePath, fileName, fileOffset, fileLength, this.FileSystem, null); file.Sha256Hash = hash; this.FileArray.Add(file); } } }
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; } } }