c# - 无法使用 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;
}
}
解决方案
推荐阅读
- haskell - 将字符串中的每个字符映射到 1 或 0
- php - 输入表单时用户体验异常滞后
- angular - 尝试访问 Google Maps API 时“找不到名称 'google'”
- vue.js - 获取子组件中的当前语言环境
- javascript - 盖子关闭的浏览器事件
- amazon-web-services - AWS 在另一个端口上托管新版本的 Web 应用程序?
- java - 由于空对象引用,应用程序崩溃
- ruby - 安装 HomeBrew 不适用于 Mojave
- database - Access 365:使用拆分表单更新表行
- oracle - Oracle apex 中是否有方法来验证用户注册的电子邮件