Невозможно переопределить более 104 КБ MBR в Windows с C# - PullRequest
1 голос
/ 03 марта 2020

Я пытался переопределить MBR моего жесткого диска с помощью образа. Я написал C# программу для этого, и она работала, но она не позволяет мне перезаписывать более чем 104 КБ жесткого диска. Важные данные на этом изображении были меньше, поэтому все было успешно скопировано, но для меня это все равно не имеет смысла. Если Windows позволяет мне переопределить основную загрузочную запись с тем, что я хочу, почему это не позволяет мне переопределить больше, чем 104 КБ? Я тестирую его на Windows 10 (установлен в устаревшем режиме B IOS на VirtualBox).

Вот код, который я использовал

private const uint GenericAll = 0x10000000;
private const uint FileShareRead = 0x1;
private const uint FileShareWrite = 0x2;
private const uint OpenExisting = 0x3;        

public static void OverrideMBR()
        {

            var mbr = CreateFile(
                "\\\\.\\PhysicalDrive0",
                GenericAll,
                FileShareRead | FileShareWrite,
                IntPtr.Zero,
                OpenExisting,
                0,
                IntPtr.Zero);

            if (mbr == (IntPtr)(-0x1))
            {
                Console.WriteLine("Fail: Please run this as an administrator");
                return false;
            }
            uint filesize = 0150000u;
            uint sizeRemaining = filesize;
            byte[] imageFile = new byte[filesize];
            /*Here is the image definition*/
            uint overriden = 0;
            while (sizeRemaining > 0)
            {
                uint towrite = 512;
                if (WriteFile(
                mbr,
                imageFile,
                towrite,
                out uint lpNumberOfBytesWritten,
                IntPtr.Zero))
                {
                    Console.WriteLine("Successfully written 512 bytes");
                }
                else
                {
                    Console.WriteLine("Failed to write 512 bytes. Successfully overriden {0} bytes.", overriden);
                    return;
                }
                sizeRemaining -= lpNumberOfBytesWritten;
                overriden += lpNumberOfBytesWritten;

                byte[] dst = new byte[imageFile.Length - (int)lpNumberOfBytesWritten];
                Array.Copy(imageFile, lpNumberOfBytesWritten, dst, 0, dst.Length);
                imageFile = dst;
            }
            Console.WriteLine("DONE!");
            return;
        }
    }
...