示例#1
0
        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;
            }
        }
示例#2
0
        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;
            }
        }
示例#3
0
        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);
        }
示例#4
0
        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);
            }
        }
示例#5
0
        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();
                    }
                }
            }
        }
示例#6
0
 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;
     }
 }