private sFolder Unpack_Sound(string file, string name)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(file));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            uint fat_size  = br.ReadUInt32();
            uint num_files = fat_size / 0x08;

            for (int i = 0; i < num_files; i++)
            {
                sFile newFile = new sFile();
                newFile.name   = name + '_' + i.ToString() + ".bin";
                newFile.offset = br.ReadUInt32();

                if (i + 1 != num_files)
                {
                    newFile.size = br.ReadUInt32() - newFile.offset;
                }
                newFile.offset += fat_size + 4;
                if (i + 1 == num_files)
                {
                    newFile.size = (uint)br.BaseStream.Length - newFile.offset;
                }
                newFile.path = file;

                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
Beispiel #2
0
        public sFolder Decompress_LZSS(sFile file)
        {
            sFolder unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            string temp = pluginHost.Get_TempFolder() + Path.DirectorySeparatorChar + Path.GetRandomFileName();

            Byte[] compressFile = new Byte[(new FileInfo(file.path).Length) - 4];
            Array.Copy(File.ReadAllBytes(file.path), 4, compressFile, 0, compressFile.Length);
            File.WriteAllBytes(temp, compressFile);

            // Get the decompressed file
            string fileIn = Path.GetDirectoryName(temp) + Path.DirectorySeparatorChar + "de" + Path.DirectorySeparatorChar + Path.GetFileName(temp);

            Directory.CreateDirectory(Path.GetDirectoryName(fileIn));
            DSDecmp.Main.Decompress(temp, fileIn, DSDecmp.Main.Get_Format(temp));
            File.Delete(temp);

            sFile fileOut = new sFile
            {
                path = fileIn,
                name = file.name,
                size = (uint)new FileInfo(fileIn).Length
            };

            unpacked.files.Add(fileOut);

            return(unpacked);
        }
Beispiel #3
0
        public sFolder Unpack(sFile file)
        {
            string tempFile = pluginHost.Get_TempFile();

            Stream       strin  = File.OpenRead(file.path);
            MemoryStream strout = AT6P.Decode(strin);

            FileStream strfile = File.OpenWrite(tempFile);

            strout.WriteTo(strfile);
            strfile.Flush();

            sFolder unpack = new sFolder();

            unpack.files = new List <sFile>();

            sFile newFile = new sFile();

            newFile.name   = file.name;
            newFile.offset = 0;
            newFile.path   = tempFile;
            newFile.size   = (uint)strfile.Length;
            unpack.files.Add(newFile);

            strin.Dispose();
            strout.Dispose();
            strfile.Dispose();

            return(unpack);
        }
        public sFolder Get_Files()
        {
            sFolder devuelta = extraidos;

            extraidos = new sFolder();
            return(devuelta);
        }
Beispiel #5
0
        public static sFolder Unpack_ARCHIVE(string file, string name)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(file));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            uint number_files = br.ReadUInt32() / 8;

            br.BaseStream.Position = 0;

            for (int i = 0; i < number_files; i++)
            {
                sFile newFile = new sFile();
                newFile.name   = name + '_' + i.ToString();
                newFile.offset = br.ReadUInt32();
                newFile.size   = br.ReadUInt32();
                newFile.path   = file;

                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
        private static sFolder AddFile(sFile newFile, sFolder currfolder)
        {
            if (currfolder.files is List <sFile> )
            {
                if (newFile.id >= currfolder.id && newFile.id < (currfolder.id + currfolder.files.Capacity))
                {
                    if (!(currfolder.files is List <sFile>))
                    {
                        currfolder.files = new List <sFile>();
                    }
                    currfolder.files.Add(newFile);
                    return(currfolder);
                }
            }

            if (currfolder.folders is List <sFolder> )
            {
                for (int i = 0; i < currfolder.folders.Count; i++)
                {
                    sFolder returnFolder = AddFile(newFile, currfolder.folders[i]);
                    if (returnFolder.name is string)
                    {
                        currfolder.folders[i] = returnFolder;
                        return(currfolder);
                    }
                }
            }

            return(new sFolder());
        }
Beispiel #7
0
        public sFolder Unpack(sFile file)
        {
            if (file.id >= 0x23 && file.id <= 0x93)
            {
                sFolder unpack = new sFolder();
                unpack.files = new List <sFile>();
                BinaryReader br = new BinaryReader(File.OpenRead(file.path));

                for (int i = 0; i < 0x17; i++)
                {
                    sFile cfile = new sFile();
                    cfile.name = "Block " + i.ToString() + ".bin";
                    cfile.path = file.path;

                    br.BaseStream.Position = 0x14 + i * 4;
                    cfile.offset           = br.ReadUInt32();
                    br.BaseStream.Position = 0x70 + i * 4;
                    cfile.size             = br.ReadUInt32();

                    unpack.files.Add(cfile);
                }

                br.Close();
                br = null;
                return(unpack);
            }

            return(new sFolder());
        }
Beispiel #8
0
        private sFile Get_File(int id, uint newOffset, string path, sFolder currFolder)
        {
            if (currFolder.files is List <sFile> )
            {
                for (int i = 0; i < currFolder.files.Count; i++)
                {
                    if (currFolder.files[i].id == id)
                    {
                        sFile original = currFolder.files[i];
                        sFile newFile  = currFolder.files[i];
                        newFile.offset      = newOffset;
                        newFile.path        = path;
                        currFolder.files[i] = newFile;

                        return(original);
                    }
                }
            }


            if (currFolder.folders is List <sFolder> )
            {
                foreach (sFolder subFolder in currFolder.folders)
                {
                    sFile currFile = Get_File(id, newOffset, path, subFolder);
                    if (currFile.name is string)
                    {
                        return(currFile);
                    }
                }
            }

            return(new sFile());
        }
Beispiel #9
0
        public static sFolder Unpack(sFile file)
        {
            BinaryReader br     = new BinaryReader(File.OpenRead(file.path));
            sFolder      unpack = new sFolder();

            unpack.files = new List <sFile>();

            br.BaseStream.Position = 0x10;  // Header

            const int num_files = 0x1246;

            for (int i = 0; i < num_files; i++)
            {
                sFile newFile = new sFile();
                newFile.name   = "File_" + i.ToString() + '.';
                newFile.size   = br.ReadUInt32();
                newFile.offset = br.ReadUInt32();
                newFile.path   = file.path;

                long currPos = br.BaseStream.Position;
                br.BaseStream.Position = newFile.offset;
                string ext = new String(br.ReadChars(3));
                if (ext != "IMY" && ext != "MAP")
                {
                    ext = "BIN";
                }
                newFile.name          += ext;
                br.BaseStream.Position = currPos;

                unpack.files.Add(newFile);
            }

            br.Close();
            return(unpack);
        }
Beispiel #10
0
        public static sFolder Unpack_PKH2(sFile pkb, sFile pkh)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(pkh.path));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            int num_files = (int)br.BaseStream.Length / 0x10;

            for (int i = 0; i < num_files; i++)
            {
                br.ReadUInt32();    // Unknown - ID¿?

                sFile newFile = new sFile();
                newFile.name   = pkb.name + '_' + i.ToString() + ".pac_";
                newFile.offset = br.ReadUInt32();
                newFile.size   = br.ReadUInt32();
                newFile.path   = pkb.path;

                br.ReadUInt32();    // First four bytes that indicates the type of compression and the final size

                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
Beispiel #11
0
        public string Pack(ref sFolder unpacked, sFile file)
        {
            string output = pluginHost.Get_TempFile();

            Packs.Pack(output, ref unpacked);
            return(output);
        }
Beispiel #12
0
        private static sFile[] GetFiles(sFolder folder)
        {
            List <sFile>    files = new List <sFile>();
            Queue <sFolder> queue = new Queue <sFolder>();

            folder.name = string.Empty;
            queue.Enqueue(folder);

            do
            {
                sFolder currentFolder = queue.Dequeue();
                foreach (sFolder f in currentFolder.folders)
                {
                    sFolder subfolder = f;
                    if (!string.IsNullOrEmpty(currentFolder.name))
                    {
                        subfolder.name = currentFolder.name + '\\' + subfolder.name;
                    }

                    queue.Enqueue(subfolder);
                }

                foreach (sFile f in currentFolder.files)
                {
                    sFile file = f;
                    if (!string.IsNullOrEmpty(currentFolder.name))
                    {
                        file.name = currentFolder.name + '\\' + file.name;
                    }
                    files.Add(file);
                }
            } while (queue.Count != 0);

            return(files.ToArray());
        }
Beispiel #13
0
        public String Pack(ref sFolder unpacked, sFile file)
        {
            if (file.name.EndsWith(".pcm"))
            {
                string fileOut = pluginHost.Get_TempFile();
                PCM.Pack(fileOut, unpacked);
                return(fileOut);
            }

            if (gameCode == "BLFE")
            {
                if (file.name.ToUpper().EndsWith(".DENC"))
                {
                    string fileOut = pluginHost.Get_TempFile() + ".denc";
                    DENC.Pack(fileOut, unpacked);
                    return(fileOut);
                }
                else if (file.name.ToUpper().EndsWith(".DARC"))
                {
                    string fileOut = pluginHost.Get_TempFile() + ".darc";
                    DARC.Pack(fileOut, ref unpacked);
                    return(fileOut);
                }
            }
            return(null);
        }
        private sFolder Unpack_Images(string file)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(file));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            uint   unknown     = br.ReadUInt32(); // Constant? 0x00015618
            ushort num_files   = br.ReadUInt16();
            ushort header_size = br.ReadUInt16();
            uint   unknown2    = br.ReadUInt32(); // Type of pack file

            if (unknown2 != 0)
            {
                System.Windows.Forms.MessageBox.Show("File not supported");
                return(new sFolder());
            }

            for (int i = 0; i < num_files; i++)
            {
                sFile newFile = new sFile();
                newFile.path   = file;
                newFile.offset = br.ReadUInt32();
                newFile.size   = br.ReadUInt32();
                uint decompressed_size = br.ReadUInt32();
                newFile.name = new String(br.ReadChars(0x20)).Replace("\0", "");

                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
Beispiel #15
0
        public static sFolder Decrypt(sFile item, int blockSize, IPluginHost pluginHost)
        {
            sFolder unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            byte[] data      = File.ReadAllBytes(item.path);
            int    numBlocks = data.Length / blockSize;

            for (int i = 0; i < numBlocks; i++)
            {
                byte[] block = new byte[blockSize];
                Array.Copy(data, i * blockSize, block, 0, blockSize);
                Decrypt(ref block);
                Array.Copy(block, 0, data, i * blockSize, blockSize);
            }

            string fileout = pluginHost.Get_TempFile();

            File.WriteAllBytes(fileout, data);

            sFile newItem = new sFile();

            newItem.path   = fileout;
            newItem.offset = 0;
            newItem.name   = item.name;
            newItem.size   = (uint)data.Length;
            unpacked.files.Add(newItem);

            return(unpacked);
        }
Beispiel #16
0
        public sFolder Unpack(sFile file)
        {
            if (file.name.EndsWith(".pk1") || file.name.EndsWith(".pk2") || file.name.EndsWith(".pk"))
            {
                sFolder unpack = new sFolder();
                unpack.files = new List <sFile>();
                BinaryReader br = new BinaryReader(File.OpenRead(file.path));

                ushort unk = br.ReadUInt16();
                if (unk != 0x00)
                {
                    System.Windows.Forms.MessageBox.Show("Different to 0!");
                }
                ushort num_files = br.ReadUInt16();

                for (int i = 0; i < num_files; i++)
                {
                    sFile cfile = new sFile();
                    cfile.name   = "File" + i.ToString() + ".bin";
                    cfile.path   = file.path;
                    cfile.offset = br.ReadUInt32();
                    cfile.size   = br.ReadUInt32();
                    unpack.files.Add(cfile);
                }

                br.Close();
                br = null;
                return(unpack);
            }

            return(new sFolder());
        }
Beispiel #17
0
        private static sFolder ReorderFolder(sFolder rootFolder, sFolder newFolder, string folderPath)
        {
            if (folderPath.Contains('/')) // Necessary to make folders
            {
                string parentFolder = folderPath.Substring(0, folderPath.IndexOf('/'));
                for (int i = 0; i < rootFolder.folders.Count; i++)
                {
                    if (rootFolder.folders[i].name == parentFolder)
                    {
                        folderPath            = folderPath.Substring(folderPath.IndexOf('/') + 1);
                        rootFolder.folders[i] = ReorderFolder(rootFolder.folders[i], newFolder, folderPath);
                        return(rootFolder);
                    }
                }
            }
            else
            {
                newFolder.name = folderPath;
                if (!(rootFolder.folders is List <sFolder>))
                {
                    rootFolder.folders = new List <sFolder>();
                }
                rootFolder.folders.Add(newFolder);

                return(rootFolder);
            }

            return(new sFolder());
        }
        /// <summary>
        /// Get a "sFolder" variable with all files and folders from the main folder path.
        /// </summary>
        /// <param name="folderPath">Folder to read</param>
        /// <param name="currFolder">Empty folder</param>
        /// <returns></returns>
        public static sFolder Recursive_GetDirectories(string folderPath, sFolder currFolder)
        {
            foreach (string file in Directory.GetFiles(folderPath))
            {
                sFile newFile = new sFile();
                newFile.name   = Path.GetFileName(file);
                newFile.offset = 0x00;
                newFile.path   = file;
                newFile.size   = (uint)new FileInfo(file).Length;

                if (!(currFolder.files is List <sFile>))
                {
                    currFolder.files = new List <sFile>();
                }
                currFolder.files.Add(newFile);
            }

            foreach (string folder in Directory.GetDirectories(folderPath))
            {
                sFolder newFolder = new sFolder();
                newFolder.name = new DirectoryInfo(folder).Name;
                newFolder      = Recursive_GetDirectories(folder, newFolder);

                if (!(currFolder.folders is List <sFolder>))
                {
                    currFolder.folders = new List <sFolder>();
                }
                currFolder.folders.Add(newFolder);
            }

            return(currFolder);
        }
Beispiel #19
0
        public static sFolder Unpack(string file, string name)
        {
            name = Path.GetFileNameWithoutExtension(name);

            BinaryReader br = new BinaryReader(File.OpenRead(file));
            sFolder unpack = new sFolder();
            unpack.files = new List<sFile>();

            char[] type = br.ReadChars(4);
            uint header_size = br.ReadUInt32();
            uint num_files = br.ReadUInt32();

            for (int i = 0; i < num_files; i++)
            {
                uint offset = br.ReadUInt32();
                uint size = br.ReadUInt32();

                if (offset == 0x00 || size == 0x00)
                    continue;

                sFile newFile = new sFile();
                newFile.name = name + '_' + i.ToString() + Get_Extension(num_files, i);
                newFile.offset = offset;
                newFile.size = size;
                newFile.path = file;

                unpack.files.Add(newFile);
            }

            br.Close();
            return unpack;
        }
Beispiel #20
0
        public String Pack(ref sFolder unpacked, sFile file)
        {
            BinaryReader br  = new BinaryReader(File.OpenRead(file.path));
            string       ext = new String(br.ReadChars(4));

            br.Close();

            if (ext == "NPCK")
            {
                string fileOut = pluginHost.Get_TempFile();

                NPCK.Pack(fileOut, ref unpacked, pluginHost);
                return(fileOut);
            }
            else if (ext == "KPCN")
            {
                string fileOut = pluginHost.Get_TempFile();

                KPCN.Pack(fileOut, file.path, ref unpacked, pluginHost);
                return(fileOut);
            }
            else if (ext == "spdl")
            {
                string fileOut = pluginHost.Get_TempFile();

                SPDL.Pack(fileOut, file.path, ref unpacked, pluginHost);
                return(fileOut);
            }

            return(null);
        }
Beispiel #21
0
        void Change_System(string path)
        {
            string[] files = Directory.GetFiles(path);
            sFolder  ftc   = pluginHost.Search_Folder(0xF378);

            for (int i = 0; i < ftc.files.Count; i++)
            {
                string cf = Array.Find(files, a => Path.GetFileName(a) == ftc.files[i].name);
                if (cf == null)
                {
                    continue;
                }

                if (ftc.files[i].name == "arm9.bin")
                {
                    byte[] d    = File.ReadAllBytes(cf);
                    byte[] size = BitConverter.GetBytes((uint)new FileInfo(cf).Length);
                    d[0xB9C] = size[0];
                    d[0xB9D] = size[1];
                    d[0xB9E] = size[2];
                    File.WriteAllBytes(cf, d);
                }

                pluginHost.ChangeFile(ftc.files[i].id, cf);
            }
        }
        public sFolder Unpack_NMDP(string fileIn, string name)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(fileIn));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            char[] header      = br.ReadChars(4);
            ushort header_size = br.ReadUInt16();

            br.BaseStream.Position = 0x10;
            uint unknown2 = br.ReadUInt32();

            uint unknown1 = br.ReadUInt32();

            sFile newFile = new sFile();

            newFile.name   = name;
            newFile.size   = br.ReadUInt32();
            newFile.offset = br.ReadUInt32();
            newFile.path   = fileIn;

            unpacked.files.Add(newFile);

            br.Close();
            return(unpacked);
        }
Beispiel #23
0
        public override void Read(string file)
        {
            // It's compressed
            pluginHost.Decompress(file);
            string  dec_file;
            sFolder dec_folder = pluginHost.Get_Files();

            if (dec_folder.files is List <sFile> )
            {
                dec_file = dec_folder.files[0].path;
            }
            else
            {
                string tempFile     = Path.GetTempFileName();
                Byte[] compressFile = new Byte[(new FileInfo(file).Length) - 0x08];
                Array.Copy(File.ReadAllBytes(file), 0x08, compressFile, 0, compressFile.Length);;
                File.WriteAllBytes(tempFile, compressFile);

                pluginHost.Decompress(tempFile);
                dec_file = pluginHost.Get_Files().files[0].path;
            }

            BinaryReader br = new BinaryReader(File.OpenRead(dec_file));

            NTFS[] map = new NTFS[br.BaseStream.Length / 2];
            for (int i = 0; i < map.Length; i++)
            {
                map[i] = Actions.MapInfo(br.ReadUInt16());
            }
            br.Close();

            Set_Map(map, false, 0x100, 0x100);
            pluginHost.Set_Map(this);
        }
        public sFolder Unpack_SSAM(string fileIn)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(fileIn));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            char[] header    = br.ReadChars(4);
            uint   num_files = br.ReadUInt32();

            uint pos_base = num_files * 0x28 + 8;

            for (int i = 0; i < num_files; i++)
            {
                sFile newFile = new sFile();
                newFile.offset = br.ReadUInt32() + pos_base;
                newFile.size   = br.ReadUInt32();
                newFile.name   = new String(br.ReadChars(0x20)).Replace("\0", "");
                newFile.path   = fileIn;

                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
Beispiel #25
0
        public static sFolder Unpack(string file, IPluginHost pluginHost)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(file));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            uint num_files = (br.ReadUInt32() / 0x04) - 1;

            br.ReadUInt32(); // Pointer table
            for (int i = 0; i < num_files; i++)
            {
                uint startOffset = br.ReadUInt32();
                long currPos     = br.BaseStream.Position;
                br.BaseStream.Position = startOffset;

                sFile newFile = new sFile();
                newFile.name   = "File " + (i + 1).ToString("X") + ".bin";
                newFile.offset = startOffset + 4;
                newFile.path   = file;
                newFile.size   = br.ReadUInt32();

                br.BaseStream.Position = currPos;
                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
        public sFolder Unpack_FLSC(string fileIn, string name)
        {
            BinaryReader br       = new BinaryReader(File.OpenRead(fileIn));
            sFolder      unpacked = new sFolder();

            unpacked.files = new List <sFile>();

            uint num_files = br.ReadUInt32();

            br.BaseStream.Position = 0x10;
            for (int i = 0; i < num_files; i++)
            {
                sFile newFile = new sFile();
                newFile.name   = name + '_' + i.ToString();
                newFile.offset = br.ReadUInt32();
                newFile.size   = br.ReadUInt32();
                newFile.path   = fileIn;

                // Get the extension
                long currPos = br.BaseStream.Position;
                br.BaseStream.Position = newFile.offset;
                newFile.name          += new String(Encoding.ASCII.GetChars(br.ReadBytes(4)));
                br.BaseStream.Position = currPos;

                unpacked.files.Add(newFile);
            }

            br.Close();
            return(unpacked);
        }
Beispiel #27
0
        private static void AddFile(sFolder folder, sFile file, string filePath)
        {
            const char SEPARATOR = '/';

            if (filePath.Contains(SEPARATOR))
            {
                string  folderName = filePath.Substring(0, filePath.IndexOf(SEPARATOR));
                sFolder subfolder  = new sFolder();
                foreach (sFolder f in folder.folders)
                {
                    if (f.name == folderName)
                    {
                        subfolder = f;
                    }
                }

                if (string.IsNullOrEmpty(subfolder.name))
                {
                    subfolder.name    = folderName;
                    subfolder.folders = new List <sFolder>();
                    subfolder.files   = new List <sFile>();
                    folder.folders.Add(subfolder);
                }

                AddFile(subfolder, file, filePath.Substring(filePath.IndexOf(SEPARATOR) + 1));
            }
            else
            {
                file.name = filePath;
                folder.files.Add(file);
            }
        }
Beispiel #28
0
        public override void Read(string file)
        {
            // It's compressed
            pluginHost.Decompress(file);
            string  dec_file;
            sFolder dec_folder = pluginHost.Get_Files();

            if (dec_folder.files is List <sFile> )
            {
                dec_file = dec_folder.files[0].path;
            }
            else
            {
                string tempFile     = Path.GetTempFileName();
                Byte[] compressFile = new Byte[(new FileInfo(file).Length) - 0x08];
                Array.Copy(File.ReadAllBytes(file), 0x08, compressFile, 0, compressFile.Length);;
                File.WriteAllBytes(tempFile, compressFile);

                pluginHost.Decompress(tempFile);
                dec_file = pluginHost.Get_Files().files[0].path;
            }

            BinaryReader br = new BinaryReader(File.OpenRead(dec_file));

            Byte[] tiles = br.ReadBytes((int)br.BaseStream.Length);

            br.Close();
            Set_Tiles(tiles, 0x100, tiles.Length / 0x100, ColorFormat.colors16, TileForm.Horizontal, false);
            pluginHost.Set_Image(this);
        }
        public static sFolder Unpack_Type2(sFile fileIn)
        {
            FileStream   fs       = new FileStream(fileIn.path, FileMode.Open, FileAccess.Read);
            BinaryReader br       = new BinaryReader(fs);
            sFolder      unpacked = new sFolder();

            unpacked.folders = new List <sFolder>();

            uint numFolders = br.ReadUInt32() / 4;

            for (int i = 0; i < numFolders; i++)
            {
                Console.WriteLine("Reading folder {0}", i);

                // Get folder address
                fs.Position = 4 + i * 4;
                uint folderAddress = br.ReadUInt32() * 4;

                sFolder folder = GetSubfolder_Type2(fs, folderAddress, fileIn.path);
                folder.name = string.Format("Folder {0}", i);
                if (folder.files.Count > 0 || folder.folders.Count > 0)
                {
                    unpacked.folders.Add(folder);
                }
            }

            br = null;
            fs.Close();
            fs.Dispose();
            fs = null;

            return(unpacked);
        }
Beispiel #30
0
        public static void Pack(string output, ref sFolder unpackedFiles)
        {
            BinaryWriter bw = new BinaryWriter(File.OpenWrite(output));

            // Write pointers
            bw.Write((uint)((unpackedFiles.files.Count + 1) * 4)); // Pointer table size
            uint currOffset = 0x00;                                // Pointer table offset

            bw.Write(currOffset);
            currOffset += (uint)(unpackedFiles.files.Count + 1) * 4 + 4;

            List <byte> buffer = new List <byte>();

            for (int i = 0; i < unpackedFiles.files.Count; i++)
            {
                BinaryReader br = new BinaryReader(File.OpenRead(unpackedFiles.files[i].path));
                br.BaseStream.Position = unpackedFiles.files[i].offset;
                buffer.AddRange(br.ReadBytes((int)unpackedFiles.files[i].size));
                br.Close();

                sFile newFile = unpackedFiles.files[i];
                newFile.offset         = currOffset;
                newFile.path           = output;
                unpackedFiles.files[i] = newFile;

                bw.Write(currOffset);
                currOffset += unpackedFiles.files[i].size;
            }

            // Write files
            bw.Write(buffer.ToArray());

            bw.Flush();
            bw.Close();
        }