我正在尝试使用以下代码从PhysicalDrive0
获取 MBR :
private static byte[] ReadMbr(string lpFileName)
{
byte[] mbr = new byte[512];
using (SafeFileHandle drive = CreateFile(
lpFileName: lpFileName,
dwDesiredAccess: (uint) EFileAccess.GenericRead, //DO NOT MODIFY THE MBR!!!
dwShareMode: (uint)EFileShare.Write | (uint)EFileShare.Read | (uint)EFileShare.Delete,
SecurityAttributes: IntPtr.Zero,
dwCreationDisposition: (uint) ECreationDisposition.OpenAlways,
dwFlagsAndAttributes: (uint)EFileAttributes.System,
hTemplateFile: IntPtr.Zero))
{
if (drive.IsInvalid)
throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error());
//Get the 1st 512 bytes of the volume (MBR)
using (FileStream stream = new FileStream(drive, FileAccess.Read))
{
stream.Read(mbr, 0, 512);
}
}
return mbr;
}
我试过传递
\\.\PhysicalDisk0
\\.\PhysicalDrive0
\\.\PhysicalDisk0:
\\.\PhysicalDrive0
并且它们都不起作用。我以管理员身份运行它。我也可以让\\.\C:
工作并显示VBR而不会出现任何问题。
记录:
- 我正在运行Windows Server 2008 R2。
答案 0 :(得分:10)
来自CreateFile()文档:
必须满足以下要求 为了这样的成功召唤:
- 来电者必须具有管理权限。更多 信息,请参阅使用特殊运行 特权
dwCreationDisposition
参数必须包含OPEN_EXISTING
旗帜。- 打开卷或软盘时,
dwShareMode
参数必须 有FILE_SHARE_WRITE
标志。
您可能想尝试在ECreationDisposition.OpenExisting
中传递dwCreationDisposition
。