Ejemplo n.º 1
0
        private bool ValidateSaveFile()
        {
            DataStream.Seek(0x0, SeekOrigin.Begin);
            var magic = DataStream.ReadInt32();

            if (magic != 1213024082) // RGMH
            {
                MessageBox.Show(
                    $"Invalid DS2 PC magic at 0x0. Should be 'RGMH', found '{Encoding.ASCII.GetString(BitConverter.GetBytes(magic))}'.",
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(false);
            }

            DataStream.Seek(0x28, SeekOrigin.Begin);
            var sig = DataStream.ReadUnicodeString();

            if (sig != "Dead Space 2")
            {
                MessageBox.Show($"Invalid DS2 PC signature at 0x28. Should be 'Dead Space 2', found '{sig}'.",
                                "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(false);
            }

            DataStream.Seek(0x2834, SeekOrigin.Begin);
            MC02Header = new MC02Header
            {
                Magic        = DataStream.ReadUInt32(),
                TotalLength  = DataStream.ReadUInt32(),
                Chunk0Length = DataStream.ReadUInt32(),
                Chunk1Length = DataStream.ReadUInt32(),
                Checksum0    = DataStream.ReadUInt32(),
                Checksum1    = DataStream.ReadUInt32(),
                Checksum2    = DataStream.ReadUInt32(),
            };

            if (MC02Header.Magic != 1296248882) // 20CM
            {
                MessageBox.Show(
                    $"Invalid MC02 magic at 0x2834. Should be '20CM', found '{Encoding.ASCII.GetString(BitConverter.GetBytes(MC02Header.Magic))}'.",
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(false);
            }

            if (MC02Header.TotalLength != MC02Header.Chunk0Length + MC02Header.Chunk1Length + 0x1C)
            {
                MessageBox.Show("Size mismatch", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(false);
            }

            return(true);
        }
Ejemplo n.º 2
0
        //private MemoryStream DataStream { get; set; } = new MemoryStream();
        //private MC02Header MC02Header { get; set; }

        static void Main(string[] args)
        {
            string SaveFilePath = "";

            if (args.Length == 0)
            {
                return;
            }
            else
            {
                SaveFilePath = args[0];
            }

            var DataStream = new MemoryStream();

            using (var fs = File.OpenRead(SaveFilePath)) fs.CopyTo(DataStream);

            DataStream.Seek(0x0, SeekOrigin.Begin);
            var magic = DataStream.ReadInt32();

            if (magic != 1213024082) // RGMH
            {
                return;
            }

            DataStream.Seek(0x28, SeekOrigin.Begin);
            var sig = DataStream.ReadUnicodeString();

            if (sig != "Dead Space 2")
            {
                return;
            }

            DataStream.Seek(0x2834, SeekOrigin.Begin);
            var MC02Header = new MC02Header
            {
                Magic        = DataStream.ReadUInt32(),
                TotalLength  = DataStream.ReadUInt32(),
                Chunk0Length = DataStream.ReadUInt32(),
                Chunk1Length = DataStream.ReadUInt32(),
                Checksum0    = DataStream.ReadUInt32(),
                Checksum1    = DataStream.ReadUInt32(),
                Checksum2    = DataStream.ReadUInt32(),
            };

            if (MC02Header.Magic != 1296248882) // 20CM
            {
                return;
            }

            if (MC02Header.TotalLength != MC02Header.Chunk0Length + MC02Header.Chunk1Length + 0x1C)
            {
                return;
            }

            ChecksumsStuff.FixChecksums(DataStream, MC02Header);
            using (var fs = File.Create(SaveFilePath))
            {
                DataStream.WriteTo(fs);
            }

            Console.WriteLine("fixed");
        }