Exemplo n.º 1
0
        public string Patch()
        {
            if (!CheckCorrectInternal(_image))
            {
                return("Invalid settings!");
            }

            var newImage = _image.Image.ToArray();
            var diff     = 0;

            for (var i = 0; i < 10; ++i)
            {
                var currentArray = i % 2 == 0 ? OnLevels : OffLevels;
                var newValue     = currentArray[i / 2];

                foreach (var offset in _image.TableOffsets)
                {
                    diff += newValue - newImage[offset + i];
                    newImage[offset + i] = checked ((byte)newValue);
                }
            }

            var alignmentOffset = ImageMarkup.CopyrightOffset + ImageMarkup.CopyrightString.Count - 2;

            diff -= newImage[alignmentOffset];
            diff -= newImage[alignmentOffset + 1];
            newImage[alignmentOffset] = 0;

            var modulo = (byte)(256 - unchecked ((uint)diff) % 256);

            newImage[alignmentOffset + 1] = modulo;
            diff += modulo;

            _bitConverter.WriteInt(_image.Checksum + diff, newImage, ImageMarkup.CheckSumOffset);

            try
            {
                var unused = _controllerImageCreator(newImage);
            }
            catch
            {
                return("Internal error");
            }

            try
            {
                // ReSharper disable once AssignNullToNotNullAttribute
                File.WriteAllBytes(_outFileName, newImage);
            }
            catch (Exception e)
            {
                return($"Unable to write patched image: {e}");
            }

            return("Image patched successfully");
        }