internal static void AddFiles(Romfs_MetaData MetaData, RomfsFile[] Entries) { string PrevDirPath = ""; for (int i = 0; i < Entries.Length; i++) { FileInfo file = new FileInfo(Entries[i].FullName); Romfs_FileEntry Entry = new Romfs_FileEntry(); string DirPath = Path.GetDirectoryName(Entries[i].FullName); int ParentIndex = GetRomfsDirEntry(MetaData, DirPath); Entry.FullName = Entries[i].FullName; Entry.Offset = MetaData.FileTableLen; Entry.ParentDirOffset = MetaData.DirTable.DirectoryTable[ParentIndex].Offset; Entry.SiblingOffset = ROMFS_UNUSED_ENTRY; if (DirPath == PrevDirPath) { MetaData.FileTable.FileTable[i - 1].SiblingOffset = Entry.Offset; } if (MetaData.DirTable.DirectoryTable[ParentIndex].FileOffset == ROMFS_UNUSED_ENTRY) { MetaData.DirTable.DirectoryTable[ParentIndex].FileOffset = Entry.Offset; } Entry.HashKeyPointer = ROMFS_UNUSED_ENTRY; Entry.NameSize = (uint)file.Name.Length * 2; Entry.Name = file.Name; Entry.DataOffset = Entries[i].Offset; Entry.DataSize = Entries[i].Size; MetaData.FileTable.FileTable.Add(Entry); MetaData.FileTableLen += 0x20 + (uint)Align((ulong)file.Name.Length * 2, 4); PrevDirPath = DirPath; } }
private void AddFiles(List <RomfsFile> Entries) { string PrevDirPath = ""; for (int i = 0; i < Entries.Count; i++) { var fileName = Path.GetFileName(Entries[i].FullName); Romfs_FileEntry Entry = new Romfs_FileEntry(); string DirPath = Path.GetDirectoryName(Entries[i].FullName); int ParentIndex = GetRomfsDirEntry(DirPath); Entry.FullName = Entries[i].FullName; Entry.Offset = this.FileTableLen; Entry.ParentDirOffset = this.DirTable[ParentIndex].Offset; Entry.SiblingOffset = ROMFS_UNUSED_ENTRY; if (DirPath == PrevDirPath) { this.FileTable[i - 1].SiblingOffset = Entry.Offset; } if (this.DirTable[ParentIndex].FileOffset == ROMFS_UNUSED_ENTRY) { this.DirTable[ParentIndex].FileOffset = Entry.Offset; } Entry.HashKeyPointer = ROMFS_UNUSED_ENTRY; Entry.NameSize = fileName.Length * 2; Entry.Name = fileName; Entry.DataOffset = Entries[i].Offset; Entry.DataSize = Entries[i].Size; this.FileTable.Add(Entry); this.FileTableLen += 0x20 + BitMath.Align(fileName.Length * 2, 4); PrevDirPath = DirPath; } }
private static Romfs_FileEntry GetFileEntryFromMetadataBytes(byte[] fileMetadataBlock, int fileOffset) { Romfs_FileEntry entry = new Romfs_FileEntry(); entry.ParentDirOffset = BitConverter.ToUInt32(fileMetadataBlock, fileOffset); entry.SiblingOffset = BitConverter.ToUInt32(fileMetadataBlock, fileOffset + 0x04); entry.DataOffset = BitConverter.ToUInt64(fileMetadataBlock, fileOffset + 0x08); entry.DataSize = BitConverter.ToUInt64(fileMetadataBlock, fileOffset + 0x10); entry.NameSize = BitConverter.ToUInt32(fileMetadataBlock, fileOffset + 0x1C); entry.Name = ""; if (entry.NameSize != 0xFFFFFFFF) { byte[] fileNameBytes = new byte[entry.NameSize]; Array.Copy(fileMetadataBlock, fileOffset + 0x20, fileNameBytes, 0, fileNameBytes.Length); entry.Name = Encoding.Unicode.GetString(fileNameBytes); } return(entry); }
private void VisitFile( uint fileOffset, string rootPath, byte[] fileMetadataBlock, ulong dataOffset, RichTextBox TB_Progress = null, ProgressBar PB_Show = null) { Romfs_FileEntry entry = GetFileEntryFromMetadataBytes(fileMetadataBlock, Convert.ToInt32(fileOffset)); string currentPath = Path.Combine(rootPath, entry.Name); UpdateTB_Progress(string.Format("Extracting {0} from romfs", currentPath), TB_Progress); ExtractFileFromRomFS(entry, currentPath, dataOffset, PB_Show); if (entry.SiblingOffset != 0xFFFFFFFF) { VisitFile(entry.SiblingOffset, rootPath, fileMetadataBlock, dataOffset, TB_Progress, PB_Show); } }
private void ExtractFileFromRomFS(Romfs_FileEntry entry, string path, ulong dataOffset, ProgressBar PB_Show = null) { ulong offsetInRomFS = dataOffset + entry.DataOffset; byte[] buffer = new byte[0x2000]; using (FileStream romfsFileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read), outputFileStream = new FileStream(path, FileMode.Append, FileAccess.Write)) { romfsFileStream.Seek(Convert.ToInt64(offsetInRomFS), SeekOrigin.Begin); int remainingSize = Convert.ToInt32(entry.DataSize); if (PB_Show.InvokeRequired) { PB_Show.Invoke((MethodInvoker) delegate { PB_Show.Minimum = 0; PB_Show.Step = 1; PB_Show.Value = 0; PB_Show.Maximum = remainingSize / buffer.Length; }); } else { PB_Show.Minimum = 0; PB_Show.Step = 1; PB_Show.Value = 0; PB_Show.Maximum = remainingSize / buffer.Length; } while (remainingSize > 0) { int sizeToReadWrite = buffer.Length > remainingSize ? remainingSize : buffer.Length; romfsFileStream.Read(buffer, 0, sizeToReadWrite); outputFileStream.Write(buffer, 0, sizeToReadWrite); remainingSize -= sizeToReadWrite; if (PB_Show.InvokeRequired) { PB_Show.Invoke((MethodInvoker)PB_Show.PerformStep); } else { PB_Show.PerformStep(); } } } }
private void AddFiles(Romfs_MetaData MetaData, RomfsFile[] Entries) { string PrevDirPath = ""; for (int i = 0; i < Entries.Length; i++) { FileInfo file = new FileInfo(Entries[i].FullName); Romfs_FileEntry Entry = new Romfs_FileEntry(); string DirPath = Path.GetDirectoryName(Entries[i].FullName); int ParentIndex = GetRomfsDirEntry(MetaData, DirPath); Entry.FullName = Entries[i].FullName; Entry.Offset = MetaData.FileTableLen; Entry.ParentDirOffset = MetaData.DirTable.DirectoryTable[ParentIndex].Offset; Entry.SiblingOffset = ROMFS_UNUSED_ENTRY; if (DirPath == PrevDirPath) { MetaData.FileTable.FileTable[i - 1].SiblingOffset = Entry.Offset; } if (MetaData.DirTable.DirectoryTable[ParentIndex].FileOffset == ROMFS_UNUSED_ENTRY) { MetaData.DirTable.DirectoryTable[ParentIndex].FileOffset = Entry.Offset; } Entry.HashKeyPointer = ROMFS_UNUSED_ENTRY; Entry.NameSize = (uint)file.Name.Length * 2; Entry.Name = file.Name; Entry.DataOffset = Entries[i].Offset; Entry.DataSize = Entries[i].Size; MetaData.FileTable.FileTable.Add(Entry); MetaData.FileTableLen += 0x20 + (uint)Align((ulong)file.Name.Length * 2, 4); PrevDirPath = DirPath; } }