public static void CreatePatch(string filename, List <MMFile> originalMMFiles) { using (var filestream = File.Open(Path.ChangeExtension(filename, "mmr"), FileMode.Create)) using (var compressStream = new GZipStream(filestream, CompressionMode.Compress)) using (var writer = new BinaryWriter(compressStream)) { for (var fileIndex = 0; fileIndex < RomData.MMFileList.Count; fileIndex++) { var file = RomData.MMFileList[fileIndex]; if (file.Data == null || (file.IsCompressed && !file.WasEdited)) { continue; } if (fileIndex >= originalMMFiles.Count) { writer.Write(ReadWriteUtils.Byteswap32((uint)fileIndex)); writer.Write(ReadWriteUtils.Byteswap32((uint)0)); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Data.Length)); writer.Write(file.Data); continue; } CheckCompressed(fileIndex, originalMMFiles); var originalFile = originalMMFiles[fileIndex]; if (file.Data.Length != originalFile.Data.Length) { writer.Write(ReadWriteUtils.Byteswap32((uint)fileIndex)); writer.Write(-1); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Data.Length)); writer.Write(file.Data); continue; } int?modifiedIndex = null; var modifiedBuffer = new List <byte>(); for (var i = 0; i <= file.Data.Length; i++) { if (i == file.Data.Length || file.Data[i] == originalFile.Data[i]) { if (modifiedBuffer.Any()) { writer.Write(ReadWriteUtils.Byteswap32((uint)fileIndex)); writer.Write(ReadWriteUtils.Byteswap32((uint)modifiedIndex.Value)); writer.Write(ReadWriteUtils.Byteswap32((uint)modifiedBuffer.Count)); writer.Write(modifiedBuffer.ToArray()); modifiedBuffer.Clear(); modifiedIndex = null; continue; } } else { if (!modifiedIndex.HasValue) { modifiedIndex = i; } modifiedBuffer.Add(file.Data[i]); } } } } }
public static int ByteswapROM(string filename) { using (BinaryReader ROM = new BinaryReader(File.Open(filename, FileMode.Open))) { if (ROM.BaseStream.Length % 4 != 0) { return(-1); } byte[] buffer = new byte[4]; ROM.Read(buffer, 0, 4); // very hacky ROM.BaseStream.Seek(0, 0); if (buffer[0] == 0x80) { return(1); } else if (buffer[1] == 0x80) { using (BinaryWriter newROM = new BinaryWriter(File.Open(filename + ".z64", FileMode.Create))) { while (ROM.BaseStream.Position < ROM.BaseStream.Length) { newROM.Write(ReadWriteUtils.Byteswap16(ReadWriteUtils.ReadU16(ROM))); } } return(0); } else if (buffer[3] == 0x80) { using (BinaryWriter newROM = new BinaryWriter(File.Open(filename + ".z64", FileMode.Create))) { while (ROM.BaseStream.Position < ROM.BaseStream.Length) { newROM.Write(ReadWriteUtils.Byteswap32(ReadWriteUtils.ReadU32(ROM))); } } return(0); } } return(-1); }
public static byte[] CreatePatch(string filename, List <MMFile> originalMMFiles) { var hashAlg = new SHA256Managed(); using (var outStream = filename != null ? (Stream)File.Open(Path.ChangeExtension(filename, "mmr"), FileMode.Create) : new MemoryStream()) using (var cryptoStream = new CryptoStream(outStream, hashAlg, CryptoStreamMode.Write)) { using (var compressStream = new GZipStream(cryptoStream, CompressionMode.Compress)) using (var writer = new BinaryWriter(compressStream)) { writer.Write(ReadWriteUtils.Byteswap32(PatchUtil.PATCH_MAGIC)); writer.Write(ReadWriteUtils.Byteswap32((uint)PatchUtil.PATCH_VERSION)); for (var fileIndex = 0; fileIndex < RomData.MMFileList.Count; fileIndex++) { var file = RomData.MMFileList[fileIndex]; var fileIsStatic = file.IsStatic ? 1 : 0; if (file.Data == null || (file.IsCompressed && !file.WasEdited)) { continue; } if (fileIndex >= originalMMFiles.Count) { writer.Write(ReadWriteUtils.Byteswap32((uint)fileIndex)); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Addr)); writer.Write(ReadWriteUtils.Byteswap32((uint)0)); writer.Write(ReadWriteUtils.Byteswap32((uint)fileIsStatic)); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Data.Length)); writer.Write(file.Data); continue; } CheckCompressed(fileIndex, originalMMFiles); var originalFile = originalMMFiles[fileIndex]; if (file.Data.Length != originalFile.Data.Length) { writer.Write(ReadWriteUtils.Byteswap32((uint)fileIndex)); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Addr)); writer.Write(-1); writer.Write(ReadWriteUtils.Byteswap32((uint)fileIsStatic)); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Data.Length)); writer.Write(file.Data); continue; } int?modifiedIndex = null; var modifiedBuffer = new List <byte>(); for (var i = 0; i <= file.Data.Length; i++) { if (i == file.Data.Length || file.Data[i] == originalFile.Data[i]) { if (modifiedBuffer.Any()) { writer.Write(ReadWriteUtils.Byteswap32((uint)fileIndex)); writer.Write(ReadWriteUtils.Byteswap32((uint)file.Addr)); writer.Write(ReadWriteUtils.Byteswap32((uint)modifiedIndex.Value)); writer.Write(ReadWriteUtils.Byteswap32((uint)fileIsStatic)); writer.Write(ReadWriteUtils.Byteswap32((uint)modifiedBuffer.Count)); writer.Write(modifiedBuffer.ToArray()); modifiedBuffer.Clear(); modifiedIndex = null; continue; } } else { if (!modifiedIndex.HasValue) { modifiedIndex = i; } modifiedBuffer.Add(file.Data[i]); } } } } return(hashAlg.Hash); } }