/* * 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(); }
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); }
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(); }
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(); }
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(); }