Ejemplo n.º 1
0
        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");
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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;
                }
            }
        }