Exemple #1
0
        /*
         * public class QFont
         * {
         * public uint Width;
         * public uint Height;
         * public uint RowCount;
         * public uint RowHeight;
         * public CharInfo[] FontInfo; //Size = 256
         * public byte[] data; //Size = 4
         * }*/


        /// <summary>
        /// Load and read WAD3 file.
        /// </summary>
        /// <param name="inputFile">Input file.</param>
        /// <exception cref="HLToolsUnsupportedFile"></exception>
        public void LoadFile(string inputFile)
        {
            Filename = inputFile;

            //Reset previous loaded data
            LumpsInfo.Clear();
            Close();

            fs        = new FileStream(inputFile, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
            binReader = new BinaryReader(fs);

            //First try get header ID
            header = new WADHeader
            {
                Id = binReader.ReadChars(4)
            };

            string magic = new string(header.Id);

            if (magic != System.Text.Encoding.ASCII.GetString(WadHeaderId)) //if invalid WAD file
            {
                Close();
                throw new HLToolsUnsupportedFile("Invalid or unsupported WAD File!");
            }

            header.LumpCount  = binReader.ReadUInt32();
            header.LumpOffset = binReader.ReadUInt32();

            //Load all lumps info
            LoadLumpsInfo();
        }
Exemple #2
0
        static List <WADEntry> ProcessOnlineWAD(byte[] bytes)
        {
            MemoryStream stream = new MemoryStream(bytes);
            BinaryReader reader = new BinaryReader(stream);

            WADHeader header = new WADHeader();

            header.magic        = reader.ReadUInt32();
            header.timestamp    = reader.ReadUInt32();
            header.numEntries   = reader.ReadUInt32();
            header.ffotdVersion = reader.ReadUInt32();

            if (header.magic != 0x543377AB)
            {
                Console.WriteLine("Invalid or unsupported file.");
                return(null);
            }

            Console.WriteLine("FFOTD version: {0}, entries: {1}",
                              header.ffotdVersion, header.numEntries);

            List <WADEntry> entries = new List <WADEntry>();

            for (int i = 0; i < header.numEntries; i++)
            {
                byte[] entryData = new byte[44]; //size of WADEntry
                int    index     = (16 + (44 * i));
                Array.Copy(bytes, index, entryData, 0, entryData.Length);

                MemoryStream stream2 = new MemoryStream(entryData);
                BinaryReader reader2 = new BinaryReader(stream2);

                WADEntry entry = new WADEntry();

                byte[] entryNameBytes = reader2.ReadBytes(32);

                entry.name = Encoding.ASCII.GetString(entryNameBytes).Trim('\0');

                entry.compressedSize = SwapUInt32(reader2.ReadUInt32());
                entry.size           = SwapUInt32(reader2.ReadUInt32());
                entry.offset         = SwapUInt32(reader2.ReadUInt32());
                entry.compressedBuf  = new byte[entry.compressedSize];

                entries.Add(entry);
            }

            return(entries);
        }
Exemple #3
0
        static WAD WriteOnlineWAD(string[] filenames)
        {
            WADHeader header = new WADHeader();

            header.magic        = 0x543377AB;
            header.timestamp    = 13371337;
            header.numEntries   = (uint)filenames.Length;
            header.ffotdVersion = 0;

            List <WADEntry> entries = new List <WADEntry>();

            uint offset = 16 + (header.numEntries * 44);

            foreach (string name in filenames)
            {
                string[] nameA = name.Split('\\');
                string   name2 = nameA[nameA.Length - 1];

                Console.WriteLine("Compressing " + name2 + "...");

                WADEntry entry           = new WADEntry();
                byte[]   decompressedBuf = File.ReadAllBytes(name);
                byte[]   compressedBuf   = ZlibStream.CompressBuffer(decompressedBuf);

                entry.name           = name2;
                entry.compressedBuf  = compressedBuf;
                entry.compressedSize = (uint)compressedBuf.Length;
                entry.offset         = offset;
                entry.size           = (uint)decompressedBuf.Length;

                offset += entry.compressedSize;
                entries.Add(entry);
            }

            WAD wad = new WAD();

            wad.header  = header;
            wad.entries = entries;

            return(wad);
        }
        public static void WriteWad(NintendoTitle currentTitle, string directoryName)
        {
            byte[] cetkbuf = currentTitle.cetk;
            string[] contentnames = currentTitle.GetContentNames();

            // Create tmd file holder
            byte[] tmdbuf = currentTitle.TMD;

            // Create wad file
            if (!Directory.Exists(directoryName + "\\" + currentTitle.TitleId + @"\"))
                Directory.CreateDirectory(directoryName + "\\" + currentTitle.TitleId);
            FileStream wadfs = new FileStream(directoryName + "\\" + currentTitle.TitleId
                + @"\" + currentTitle.TitleId + ".wad", FileMode.Create);

            // Add wad stuffs
            WADHeader wad = new WADHeader();
            wad.HeaderSize = 0x20;
            wad.WadType = 0x49730000;
            wad.CertChainSize = 0xA00;

            // TMDSize is length of buffer.
            wad.TMDSize = tmdbuf.Length;
            // TicketSize is length of cetkbuf.
            wad.TicketSize = cetkbuf.Length;

            // Write cert[] to 0x40.
            wadfs.Seek(0x40, SeekOrigin.Begin);
            wadfs.Write(cert, 0, cert.Length);

            WriteStatus("Cert wrote at 0x40");

            // Need 64 byte boundary...
            wadfs.Seek(2624, SeekOrigin.Begin);

            // Cert is 2560
            // Write ticket at this point...
            wad.TicketSize = 0x2A4;
            wadfs.Write(cetkbuf, 0, wad.TicketSize);

            WriteStatus("Ticket wrote at " + (wadfs.Length - 0x2A4));

            // Need 64 byte boundary...
            wadfs.Seek(ByteBoundary(Convert.ToInt32(wadfs.Length)), SeekOrigin.Begin);

            // Write TMD at this point...
            wadfs.Write(tmdbuf, 0, 484 + ((currentTitle.Contents.Count - 2) * 36));

            WriteStatus("TMD wrote at " + (wadfs.Length - (484 + ((currentTitle.Contents.Count - 2) * 36))));

            // Preliminary data size of wad file.
            wad.DataSize = 0;

            // Loop n Add contents
            for (int i = 0; i < currentTitle.Contents.Count - 2; i++)
            {
                // Need 64 byte boundary...
                wadfs.Seek(ByteBoundary(Convert.ToInt32(wadfs.Length)), SeekOrigin.Begin);
                byte[] contbuf = currentTitle.Contents[contentnames[i]];
                wadfs.Write(contbuf, 0, contbuf.Length);
                WriteStatus(contentnames[i] + " wrote at " + (wadfs.Length - contbuf.Length));
                wad.DataSize += contbuf.Length;
            }

            wadfs.Seek(0, SeekOrigin.Begin);

            // Write initial part of header
            byte[] start = new byte[8] { 0x00, 0x00, 0x00, 0x20, 0x49, 0x73, 0x00, 0x00 };
            wadfs.Write(start, 0, start.Length);

            //WriteStatus("Initial header wrote");

            // Write CertChainLength
            wadfs.Seek(0x08, SeekOrigin.Begin);
            byte[] chainsize = InttoByteArray(wad.CertChainSize);
            wadfs.Write(chainsize, 0, 4);

            // Write res
            byte[] reserved = new byte[4] { 0x00, 0x00, 0x00, 0x00 };
            wadfs.Seek(0x0C, SeekOrigin.Begin);
            wadfs.Write(reserved, 0, 4);

            // Write ticketsize
            byte[] ticketsize = new byte[4] { 0x00, 0x00, 0x02, 0xA4 };
            wadfs.Seek(0x10, SeekOrigin.Begin);
            wadfs.Write(ticketsize, 0, 4);

            // Write tmdsize
            int strippedtmd = 484 + (currentTitle.Contents.Count - 2 * 36);
            byte[] tmdsize = InttoByteArray(strippedtmd);
            wadfs.Seek(0x14, SeekOrigin.Begin);
            wadfs.Write(tmdsize, 0, 4);

            // Write data size
            wadfs.Seek(0x18, SeekOrigin.Begin);
            byte[] datasize = InttoByteArray(wad.DataSize);
            wadfs.Write(datasize, 0, 4);

            WriteStatus("WAD Created: " + currentTitle.TitleId + ".wad");
            wadfs.Close();
        }
Exemple #5
0
        public void PackWAD(string titleid, string tmdfilename, int contentcount, string[] contentnames)
        {
            // Directory stuff
            string currentdir = Application.StartupPath;
            if (!(currentdir.EndsWith(@"\")) || !(currentdir.EndsWith(@"/")))
                currentdir += @"\";

            // Create ticket file holder
            FileStream fs1 = File.OpenRead(currentdir + titleid + @"\cetk");
            byte[] cetkbuf = ReadFully(fs1, 20);
            fs1.Close();

            // Create tmd file holder
            FileStream fs2 = File.OpenRead(currentdir + titleid + @"\" + tmdfilename);
            byte[] tmdbuf = ReadFully(fs2, 20);
            fs2.Close();

            //WriteStatus("Ticket and TMD loaded into memory...");

            // Create wad file
            FileStream wadfs = new FileStream(currentdir + titleid + @"\" + titleid + ".wad", FileMode.Create);

            // Add wad stuffs
            WADHeader wad = new WADHeader();
            wad.HeaderSize = 0x20;
            wad.WadType = 0x49730000;
            wad.CertChainSize = 0xA00;

            // TMDSize is length of buffer.
            wad.TMDSize = tmdbuf.Length;
            // TicketSize is length of cetkbuf.
            wad.TicketSize = cetkbuf.Length;

            // Write cert[] to 0x40.
            wadfs.Seek(0x40, SeekOrigin.Begin);
            wadfs.Write(cert, 0, cert.Length);

            WriteStatus("Cert wrote at 0x40");

            // Need 64 byte boundary...
            wadfs.Seek(2624, SeekOrigin.Begin);

            // Cert is 2560
            // Write ticket at this point...
            wad.TicketSize = 0x2A4;
            wadfs.Write(cetkbuf, 0, wad.TicketSize);

            WriteStatus("Ticket wrote at " + (wadfs.Length - 0x2A4));

            // Need 64 byte boundary...
            wadfs.Seek(ByteBoundary(Convert.ToInt32(wadfs.Length)), SeekOrigin.Begin);

            // Write TMD at this point...
            wadfs.Write(tmdbuf, 0, 484 + (contentcount*36));

            WriteStatus("TMD wrote at " + (wadfs.Length - (484 + (contentcount * 36))));

            // Preliminary data size of wad file.
            wad.DataSize = 0;

            // Loop n Add contents
            for (int i = 0; i < contentcount; i++)
            {
                // Need 64 byte boundary...
                wadfs.Seek(ByteBoundary(Convert.ToInt32(wadfs.Length)), SeekOrigin.Begin);

                // Create content file holder
                FileStream cont = File.OpenRead(currentdir + titleid + @"\" + contentnames[i]);
                byte[] contbuf = ReadFully(cont, 20);
                cont.Close();

                wadfs.Write(contbuf, 0, contbuf.Length);

                WriteStatus(contentnames[i] + " wrote at " + (wadfs.Length - contbuf.Length));

                wad.DataSize += contbuf.Length;
            }

            wadfs.Seek(0, SeekOrigin.Begin);

            // Write initial part of header
            byte[] start = new byte[8] {0x00, 0x00, 0x00, 0x20, 0x49, 0x73, 0x00, 0x00};
            wadfs.Write(start, 0, start.Length);

            //WriteStatus("Initial header wrote");

            // Write CertChainLength
            wadfs.Seek(0x08, SeekOrigin.Begin);
            byte[] chainsize = InttoByteArray(wad.CertChainSize);
            wadfs.Write(chainsize, 0, 4);

            // Write res
            byte[] reserved = new byte[4] { 0x00, 0x00, 0x00, 0x00 };
            wadfs.Seek(0x0C, SeekOrigin.Begin);
            wadfs.Write(reserved, 0, 4);

            // Write ticketsize
            byte[] ticketsize = new byte[4] { 0x00, 0x00, 0x02, 0xA4 };
            wadfs.Seek(0x10, SeekOrigin.Begin);
            wadfs.Write(ticketsize, 0, 4);

            // Write tmdsize
            int strippedtmd = 484 + (contentcount * 36);
            byte[] tmdsize = InttoByteArray(strippedtmd);
            wadfs.Seek(0x14, SeekOrigin.Begin);
            wadfs.Write(tmdsize, 0, 4);

            // Write data size
            wadfs.Seek(0x18, SeekOrigin.Begin);
            byte[] datasize = InttoByteArray(wad.DataSize);
            wadfs.Write(datasize, 0, 4);

            WriteStatus("WAD Created: " + titleid + ".wad");
            wadfs.Close();
        }
        /// <summary>
        /// Load and read WAD3 file.
        /// </summary>
        /// <param name="inputFile">Input file.</param>
        /// <exception cref="HLToolsUnsupportedFile"></exception>
        public void LoadFile(string inputFile)
        {
            this.Filename = inputFile;

            //Reset previous loaded data
            LumpsInfo.Clear();
            Close();

            fs = new FileStream(inputFile, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
            binReader = new BinaryReader(fs);

            //First try get header ID
            header = new WADHeader();
            header.Id = binReader.ReadChars(4);

            string magic = new string(header.Id);
            if (magic != System.Text.Encoding.ASCII.GetString(WadHeaderId)) //if invalid WAD file
            {
                Close();
                throw new HLToolsUnsupportedFile("Invalid or unsupported WAD File!");
            }

            header.LumpCount = binReader.ReadUInt32();
            header.LumpOffset = binReader.ReadUInt32();

            //Load all lumps info
            LoadLumpsInfo();
        }
Exemple #7
0
        public static void WriteWad(NintendoTitle currentTitle, string directoryName)
        {
            byte[]   cetkbuf      = currentTitle.cetk;
            string[] contentnames = currentTitle.GetContentNames();

            // Create tmd file holder
            byte[] tmdbuf = currentTitle.TMD;

            // Create wad file
            if (!Directory.Exists(directoryName + "\\" + currentTitle.TitleId + @"\"))
            {
                Directory.CreateDirectory(directoryName + "\\" + currentTitle.TitleId);
            }
            FileStream wadfs = new FileStream(directoryName + "\\" + currentTitle.TitleId
                                              + @"\" + currentTitle.TitleId + ".wad", FileMode.Create);

            // Add wad stuffs
            WADHeader wad = new WADHeader();

            wad.HeaderSize    = 0x20;
            wad.WadType       = 0x49730000;
            wad.CertChainSize = 0xA00;

            // TMDSize is length of buffer.
            wad.TMDSize = tmdbuf.Length;
            // TicketSize is length of cetkbuf.
            wad.TicketSize = cetkbuf.Length;

            // Write cert[] to 0x40.
            wadfs.Seek(0x40, SeekOrigin.Begin);
            wadfs.Write(cert, 0, cert.Length);

            WriteStatus("Cert wrote at 0x40");

            // Need 64 byte boundary...
            wadfs.Seek(2624, SeekOrigin.Begin);

            // Cert is 2560
            // Write ticket at this point...
            wad.TicketSize = 0x2A4;
            wadfs.Write(cetkbuf, 0, wad.TicketSize);

            WriteStatus("Ticket wrote at " + (wadfs.Length - 0x2A4));

            // Need 64 byte boundary...
            wadfs.Seek(ByteBoundary(Convert.ToInt32(wadfs.Length)), SeekOrigin.Begin);

            // Write TMD at this point...
            wadfs.Write(tmdbuf, 0, 484 + ((currentTitle.Contents.Count - 2) * 36));

            WriteStatus("TMD wrote at " + (wadfs.Length - (484 + ((currentTitle.Contents.Count - 2) * 36))));

            // Preliminary data size of wad file.
            wad.DataSize = 0;

            // Loop n Add contents
            for (int i = 0; i < currentTitle.Contents.Count - 2; i++)
            {
                // Need 64 byte boundary...
                wadfs.Seek(ByteBoundary(Convert.ToInt32(wadfs.Length)), SeekOrigin.Begin);
                byte[] contbuf = currentTitle.Contents[contentnames[i]];
                wadfs.Write(contbuf, 0, contbuf.Length);
                WriteStatus(contentnames[i] + " wrote at " + (wadfs.Length - contbuf.Length));
                wad.DataSize += contbuf.Length;
            }

            wadfs.Seek(0, SeekOrigin.Begin);

            // Write initial part of header
            byte[] start = new byte[8] {
                0x00, 0x00, 0x00, 0x20, 0x49, 0x73, 0x00, 0x00
            };
            wadfs.Write(start, 0, start.Length);

            //WriteStatus("Initial header wrote");

            // Write CertChainLength
            wadfs.Seek(0x08, SeekOrigin.Begin);
            byte[] chainsize = InttoByteArray(wad.CertChainSize);
            wadfs.Write(chainsize, 0, 4);

            // Write res
            byte[] reserved = new byte[4] {
                0x00, 0x00, 0x00, 0x00
            };
            wadfs.Seek(0x0C, SeekOrigin.Begin);
            wadfs.Write(reserved, 0, 4);

            // Write ticketsize
            byte[] ticketsize = new byte[4] {
                0x00, 0x00, 0x02, 0xA4
            };
            wadfs.Seek(0x10, SeekOrigin.Begin);
            wadfs.Write(ticketsize, 0, 4);

            // Write tmdsize
            int strippedtmd = 484 + (currentTitle.Contents.Count - 2 * 36);

            byte[] tmdsize = InttoByteArray(strippedtmd);
            wadfs.Seek(0x14, SeekOrigin.Begin);
            wadfs.Write(tmdsize, 0, 4);

            // Write data size
            wadfs.Seek(0x18, SeekOrigin.Begin);
            byte[] datasize = InttoByteArray(wad.DataSize);
            wadfs.Write(datasize, 0, 4);

            WriteStatus("WAD Created: " + currentTitle.TitleId + ".wad");
            wadfs.Close();
        }