Example #1
0
        internal static void AddFiles(RomfsMetaData metaData, RomfsFile[] entries)
        {
            string prevDirPath = "";

            for (int i = 0; i < entries.Length; i++)
            {
                FileInfo       file        = new FileInfo(entries[i].FullName);
                RomfsFileEntry entry       = new RomfsFileEntry();
                string         dirPath     = Path.GetDirectoryName(entries[i].FullName);
                int            parentIndex = RomFS.GetRomfsDirEntry(metaData, dirPath);
                entry.FullName        = entries[i].FullName;
                entry.Offset          = metaData.FileTableLen;
                entry.ParentDirOffset = metaData.DirTable.DirectoryTable[parentIndex].Offset;
                entry.SiblingOffset   = RomfsUnusedEntry;
                if (dirPath == prevDirPath)
                {
                    metaData.FileTable.FileTable[i - 1].SiblingOffset = entry.Offset;
                }
                if (metaData.DirTable.DirectoryTable[parentIndex].FileOffset == RomfsUnusedEntry)
                {
                    metaData.DirTable.DirectoryTable[parentIndex].FileOffset = entry.Offset;
                }
                entry.HashKeyPointer = RomfsUnusedEntry;
                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)RomFS.Align((ulong)file.Name.Length * 2, 4);
                prevDirPath            = dirPath;
            }
        }
Example #2
0
        internal static void AddDirHashKey(RomfsMetaData metaData, int index)
        {
            uint   parent = metaData.DirTable.DirectoryTable[index].ParentOffset;
            string name   = metaData.DirTable.DirectoryTable[index].Name;

            byte[] nArr = index == 0
                                                          ? Encoding.Unicode.GetBytes("")
                                                          : Encoding.Unicode.GetBytes(name);
            uint hash = RomFS.CalcPathHash(parent, nArr, 0);
            int  ind2 = (int)(hash % metaData.MDirHashTableEntry);

            if (metaData.DirHashTable[ind2] == RomfsUnusedEntry)
            {
                metaData.DirHashTable[ind2] = metaData.DirTable.DirectoryTable[index].Offset;
            }
            else
            {
                int i         = RomFS.GetRomfsDirEntry(metaData, metaData.DirHashTable[ind2]);
                int tempindex = index;
                metaData.DirHashTable[ind2] = metaData.DirTable.DirectoryTable[index].Offset;
                while (true)
                {
                    if (metaData.DirTable.DirectoryTable[tempindex].HashKeyPointer == RomfsUnusedEntry)
                    {
                        metaData.DirTable.DirectoryTable[tempindex].HashKeyPointer = metaData.DirTable.DirectoryTable[i].Offset;
                        break;
                    }
                    i         = tempindex;
                    tempindex = RomFS.GetRomfsDirEntry(metaData, metaData.DirTable.DirectoryTable[i].HashKeyPointer);
                }
            }
        }
Example #3
0
        internal static void AddDir(RomfsMetaData metaData, DirectoryInfo dir, uint parent, uint sibling, bool doSubs)
        {
            DirectoryInfo[] subDirectories = dir.GetDirectories();
            if (!doSubs)
            {
                uint          currentDir = metaData.DirTableLen;
                RomfsDirEntry entry      = new RomfsDirEntry {
                    ParentOffset = parent
                };
                entry.ChildOffset   = entry.HashKeyPointer = entry.FileOffset = RomfsUnusedEntry;
                entry.SiblingOffset = sibling;
                entry.FullName      = dir.FullName;
                entry.Name          = entry.FullName == RootDir
                                                                 ? ""
                                                                 : dir.Name;
                entry.Offset = currentDir;
                metaData.DirTable.DirectoryTable.Add(entry);
                metaData.DirTableLen += currentDir == 0
                                                                                        ? 0x18
                                                                                        : 0x18 + (uint)RomFS.Align((ulong)dir.Name.Length * 2, 4);
                // int ParentIndex = GetRomfsDirEntry(MetaData, Dir.FullName);
                // uint poff = MetaData.DirTable.DirectoryTable[ParentIndex].Offset;
            }
            else
            {
                int  curIndex   = RomFS.GetRomfsDirEntry(metaData, dir.FullName);
                uint currentDir = metaData.DirTable.DirectoryTable[curIndex].Offset;
                for (int i = 0; i < subDirectories.Length; i++)
                {
                    RomFS.AddDir(metaData, subDirectories[i], currentDir, sibling, false);
                    if (i <= 0)
                    {
                        continue;
                    }

                    string prevFullName = subDirectories[i - 1].FullName;
                    string thisName     = subDirectories[i].FullName;
                    int    prevIndex    = RomFS.GetRomfsDirEntry(metaData, prevFullName);
                    int    thisIndex    = RomFS.GetRomfsDirEntry(metaData, thisName);
                    metaData.DirTable.DirectoryTable[prevIndex].SiblingOffset =
                        metaData.DirTable.DirectoryTable[thisIndex].Offset;
                }
                foreach (DirectoryInfo t in subDirectories)
                {
                    RomFS.AddDir(metaData, t, currentDir, sibling, true);
                }
            }

            if (subDirectories.Length <= 0)
            {
                return;
            }

            int curindex   = RomFS.GetRomfsDirEntry(metaData, dir.FullName);
            int childindex = RomFS.GetRomfsDirEntry(metaData, subDirectories[0].FullName);

            if (curindex > -1 && childindex > -1)
            {
                metaData.DirTable.DirectoryTable[curindex].ChildOffset =
                    metaData.DirTable.DirectoryTable[childindex].Offset;
            }
        }