首页 > 解决方案 > 无法使用 C# 在 Windows 中覆盖超过 104KB 的 MBR

问题描述

我试图用图像覆盖我的硬盘驱动器的 MBR。为此,我编写了一个 C# 程序,它确实有效,但它不允许我覆盖超过 ~104KB 的硬盘驱动器。这张图片上的重要数据比那个小,所以一切都被成功复制了,但对我来说仍然没有意义。如果 Windows 允许我使用我想要的任何内容覆盖主引导记录,为什么它不允许我覆盖超过 104KB 的内容?我正在 Windows 10 上测试它(在 VirtualBox 上以旧版 BIOS 模式安装)。

这是我使用的代码

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;
        }
    }

标签: c#windowsmbr

解决方案


推荐阅读