Как записать файл в PhysicalDrive (Windows 7) без получения ERROR_ACCESS_DENIED? - PullRequest
7 голосов
/ 07 июля 2011

Я пытаюсь записать тестовый шаблон для каждого сектора отформатированного USB-накопителя. Существует один логический диск (например, h :). Этот том отформатирован в FAT и содержит данные для перезаписи. Также я хочу перезаписать весь физический диск. Программа работает с повышенными правами пользователя.

Сначала я сделал следующее:

// from the drive letter "h:" I get the physical disk number using
// IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS => "\\.\PhysicalDrive2"

hDevice = ::CreateFile( "\\.\PhysicalDrive2", GENERIC_READ|GENERIC_WRITE, 
  FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); 

// get the number of available sectors with IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
// => ulNumberOfSectors

// now I try to write some sectors, e.g. 2 (I want to use a higher value):
WriteFile( hDevice, abBuffer, 2*512, &byteswritten, NULL );

Сбой вызова WriteFile с ERROR_ACCESS_DENIED.

Если я напишу один сектор, он будет работать.

Когда я перезаписываю первый сектор и снова подключаю устройство, Windows хочет отформатировать его. В этой ситуации мой код с 2048 секторами сразу работает без ERROR_ACCESS_DENIED.

Я также отключил том, как описано в CodeProject: WriteFile на физических дисках с Windows 7 , но это ничего не изменило. Очевидно, что том отключен, потому что он больше не виден в проводнике Windows.

Я хочу написать более одного сектора по причинам производительности. Я также боюсь, что могут возникнуть другие проблемы на местах, потому что я не до конца понимаю эту проблему.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 30 января 2012

У меня не было проблем с разными WriteFile() размерами, но я решил

WriteFile (): доступ запрещен <ERROR_ACCESS_DENIED/5> «\. \ PhysicalDriveX

устройств (обычно USB HDD / SSD) в Windows 7, работающих от имени администратора (с повышенными правами), следующим образом:

Управление компьютером -> Управление дисками:

  • Громкость (H: в вашем случае) -> щелкните правой кнопкой мыши -> Удалить громкость
  • Диск (Диск 2 в вашем случае) -> щелчок правой кнопкой мыши -> Автономный режим
  • Диск (диск 2 в вашем случае) -> щелкните правой кнопкой мыши -> On-line

После этого я могу без проблем писать в \ ". PhysicalDriveX".

Я думаю, что Win7 блокирует (в отличие от предыдущих выпусков Windows) физическое устройство, если на устройстве имеется какая-либо файловая система, чтобы избежать проблем с согласованностью.

2 голосов
/ 04 ноября 2013

Вы не можете получить прямой доступ к секторам диска, которые принадлежат смонтированной файловой системе.

См. Изменения в файловой системе и в стеке хранения для ограничения прямого доступа к диску и прямого доступа к тому

Документация для FSCTL_DISMOUNT_VOLUME описывает следующую последовательность перезаписи файловой системы:

  1. Открытие тома.
  2. Блокировка громкости.
  3. Форматирование тома.
  4. Снимите громкость.
  5. Разблокировка громкости.
  6. Закройте ручку регулировки громкости.

Операция записи в шаблон будет выполнена на шаге 3 вместо форматирования.

1 голос
/ 23 августа 2013

Другой метод - использовать clean - , удалить все разделы (и ВСЕ ДАННЫЕ) на диске:

C:\> diskpart
Diskpart> list disk

Diskpart> select disk N (where N is your disk number)

Diskpart> clean

Diskpart> exit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...