Очистка нулевого сектора устройства со сменным носителем - PullRequest
1 голос
/ 24 сентября 2010

Мне нужно очистить сектор 0 для съемных носителей (пользовательских запоминающих устройств USB), которые я пытался очистить в приложении WPF / C #. Моей первой попыткой было использовать DD , но я столкнулся с проблемами. Во время изготовления устройств MBR создается в секторе 0, а том (логический?) Начинается в секторе 40. Когда я запускаю следующую команду, он очищает сектор 40, а не сектор 0:

dd bs=512 count=1 if=/dev/zero of=\.\E:

Я нашел другую версию DD здесь , которая включает в себя утилиту очистки. Я попробовал эту версию, и я вижу то же самое поведение. Я использую и HxD, и DiskExplorer Runtime, который очищает сектор 40, а не сектор 0. Я мог бы использовать HxD или DiskExplorer Runtime, но это должно быть доступно для сценариев.

Кто-нибудь знает какие-либо другие методы очистки (заполнения) сектора 0 в Windows XP SP2 ?? Любая помощь будет принята с благодарностью. Спасибо.

Mark

Решение: Мое решение использовало WMI для поиска физического диска на основе буквы логического диска. Сначала запросите класс Win32_LogicalDiskToPartition, чтобы найти искомый логический диск. Это обеспечивает поле Antecedent, которое содержит что-то вроде '... DeviceID = "Disk #X, Partition #Y"'. Затем я выполняю запрос к классу Win32_DiskDriveToDiskPartition при поиске в зависимом поле, чтобы найти соответствие для поля Antecedent в классе Win32_LogicalDiskToPartition. После обнаружения поле Antecedent из Win32_LogicalDiskToPartition будет содержать физический диск. Я выбрал Atzz, так как это закрытие моего решения. Я хотел воспользоваться предложением Юджина, но у меня было всего несколько часов, чтобы реализовать это, поэтому я выбрал самый простой из двух. Мне нужно будет вернуться к этому позже, хотя.

Ответы [ 2 ]

2 голосов
/ 24 сентября 2010

Существует два способа форматирования USB-накопителя с точки зрения Windows:

  • Как дискета. В этом случае весь USB-накопитель содержит одну файловую систему, а его загрузочная запись находится в секторе 0.

  • Как жесткий диск. В этом случае сектор 0 содержит MBR с таблицей разделов. Актуальные файловые системы с их индивидуальными загрузочными записями расположены далее на диске.

Я думаю, что вы наблюдаете второй случай. Используя \. \ E: для идентификации устройства, вы в конечном итоге получаете доступ к загрузочной записи файловой системы вместо MBR.

Вот как вы можете получить доступ к сектору 0 USB-накопителя.

  1. Загрузить WinObj из здесь .
  2. В WinObj под GLOBAL?? найдите E :. Это будет символическая ссылка, указывающая на что-то вроде \Device\Harddisk2\DP(1)0-0+30.
  3. В разделе GLOBAL?? найдите символическую ссылку PhysicalDrive #, ссылающуюся на тот же жесткий диск #, который вы нашли на шаге 2. Скорее всего, он будет иметь такой же числовой суффикс, что и жесткий диск #. Например: SymbolicLink PhysicalDrive2 относится к \Device\Harddisk2\DR47.
  4. Используйте PhysicalDrive #, который вы нашли в команде DD:

    dd bs=512 count=1 if=\\.\PhysicalDrive2 of=mbr.dat

1 голос
/ 24 сентября 2010

Вы пытаетесь очистить логическое устройство E: а не физическое устройство. Попробуйте сделать следующее:

вызов CreateFile () Функция WinAPI для открытия «\\. \ PhysicalDriveX», где X - номер устройства (см. Замечания в описании функции CreateFile для получения информации о том, как правильно открыть физическое устройство. ). Затем используйте функцию API WriteFile для записи 512 байт со смещением 0 открытого устройства.

Если при открытии устройства для записи вы получаете сообщение об отказе в разрешении, вы можете воспользоваться нашим продуктом RawDisk (пробная версия подойдет вам), который позволяет обойти эту меру безопасности Windows.

upd: Что касается вызова CreateFile из C #, см. PInvoke.net .

...