CreateFile в Kernel32.dll не позволяет мне открыть физический диск - PullRequest
5 голосов
/ 26 ноября 2010

Я пытаюсь использовать следующий код для получения MBR от PhysicalDrive0:

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.

Ссылки

1 Ответ

10 голосов
/ 27 ноября 2010

Из документации CreateFile () :

Для успешного вызова необходимо выполнить следующие требования:

  • Вызывающий должениметь административные привилегии.Для получения дополнительной информации см. Запуск со специальными привилегиями .
  • Параметр dwCreationDisposition должен иметь флаг OPEN_EXISTING .
  • При открытиитом или дискету, параметр dwShareMode должен иметь флаг FILE_SHARE_WRITE.

Возможно, вы захотите попробовать передать ECreationDisposition.OpenExisting в dwCreationDisposition.

...