Example #1
0
        internal static void CalcDirSize(RomfsMetaData metaData, DirectoryInfo dir)
        {
            if (metaData.MDirTableLen == 0)
            {
                metaData.MDirTableLen = 0x18;
            }
            else
            {
                metaData.MDirTableLen += 0x18 + (uint)RomFS.Align((ulong)dir.Name.Length * 2, 4);
            }

            FileInfo[] files = dir.GetFiles();
            foreach (FileInfo t in files)
            {
                metaData.MFileTableLen += 0x20 + (uint)RomFS.Align((ulong)t.Name.Length * 2, 4);
            }

            DirectoryInfo[] subDirectories = dir.GetDirectories();
            foreach (DirectoryInfo t in subDirectories)
            {
                RomFS.CalcDirSize(metaData, t);
            }

            metaData.FileNum += (uint)files.Length;
            metaData.DirNum  += (uint)subDirectories.Length;
        }
Example #2
0
        internal static void CalcRomfsSize(RomfsMetaData metaData)
        {
            metaData.DirNum = 1;
            DirectoryInfo rootDi = new DirectoryInfo(RootDir);

            RomFS.CalcDirSize(metaData, rootDi);

            metaData.MDirHashTableEntry  = RomFS.GetHashTableEntryCount(metaData.DirNum);
            metaData.MFileHashTableEntry = RomFS.GetHashTableEntryCount(metaData.FileNum);

            uint metaDataSize = (uint)RomFS.Align(0x28 + metaData.MDirHashTableEntry * 4 + metaData.MDirTableLen + metaData.MFileHashTableEntry * 4 + metaData.MFileTableLen, PaddingAlign);

            for (int i = 0; i < metaData.MDirHashTableEntry; i++)
            {
                metaData.DirHashTable.Add(RomfsUnusedEntry);
            }

            for (int i = 0; i < metaData.MFileHashTableEntry; i++)
            {
                metaData.FileHashTable.Add(RomfsUnusedEntry);
            }

            uint pos = metaData.InfoHeader.HeaderLength;

            for (int i = 0; i < 4; i++)
            {
                metaData.InfoHeader.Sections[i].Offset = pos;
                uint size = 0;
                switch (i)
                {
                case 0:
                    size = metaData.MDirHashTableEntry * 4;
                    break;

                case 1:
                    size = metaData.MDirTableLen;
                    break;

                case 2:
                    size = metaData.MFileHashTableEntry * 4;
                    break;

                case 3:
                    size = metaData.MFileTableLen;
                    break;
                }
                metaData.InfoHeader.Sections[i].Size = size;
                pos += size;
            }
            metaData.InfoHeader.DataOffset = metaDataSize;
        }