2010-04-11 2 views
1

Я написал утилиту для диска, которая позволила вам стереть все физические диски. он использует окно файл апи, вызывая:не может записать на физический диск в win 7?

destFile = CreateFile("\\\\.\\PhysicalDrive1", 
    GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 
    NULL, OPEN_EXISTING,createflags, NULL); 

, а затем просто звонит WriteFile, и убедившись, что вы пишете в упаковке секторов, то есть 512 байт.

Это прекрасно работало в прошлом, на XP и даже на Win7 RC, все, что вам нужно сделать, это убедиться, что вы используете его как администратора.

, но теперь у меня есть розничная лицензия Win7, она больше не работает! диски все еще открыты для записи, но вызов WriteFile на успешно открывшемся диске теперь не удается!

Кто-нибудь знает, почему это может быть? может ли это иметь какое-то отношение к открытию его с помощью общих флагов? это всегда то, что я делал раньше, и это сработало. может быть, что-то теперь делится диском? блокировать записи? есть ли способ правильно «размонтировать» диск или, по крайней мере, разделы на нем, чтобы у меня был эксклюзивный доступ к нему?

Некоторые другие инструменты, которые раньше работали, тоже не работают, но некоторые делают, например, функцию стирания WD Diagnostic. и после того, как он стирает диск, мой инструмент затем работает и на нем! заставив меня поверить, что есть какой-то процесс «размонтировать», который мне нужно сделать с приводом, чтобы освободить разрешение на его запись.

Любые идеи?

Update:

возвращается код ошибки из WriteFile является «5», ERROR_ACCESS_DENIED , но опять же, если я «Стирание» диск первого использования WD Diag, я могу получить доступ и записать на диск штрафа. когда я снова инициализирую диск и даю ему раздел, я возвращаюсь к ошибке ERROR_ACCESS_DENIED.

+0

Пожалуйста, сообщите нам код ошибки или сообщение. – jweyrich

+0

@jweyrich: ошибка: ERROR_ACCESS_DENIED – matt

+0

Мое предложение - проверить, имеет ли UAC что-то с этим. Попробуйте отключить его и повторно запустить приложение. Прокомментируйте результаты. – jweyrich

ответ

1

Это почти наверняка связано с предотвращением атаки, обнаруженной против подписания драйвера, путем изменения секторов в файле страницы. Это предотвратит запись в области диска, содержащего разделы.

См. http://msdn.microsoft.com/en-us/library/aa365747%28VS.85%29.aspx и посмотрите информацию, начинающуюся с текста «Если вы пишете непосредственно на том, который имеет смонтированную файловую систему», в основном вы должны блокировать тома диска для записи в свои сектора.

+0

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

+0

Вы всегда можете перечислять все тома в системе с помощью FindFirstVolume/FindNextVolume, вызывать IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS на каждом из них, а затем проверить, есть ли на томе резервное хранилище на рассматриваемом диске. (Есть несколько более сложных случаев, когда объемы могут быть распределены по нескольким дискам и т. Д.) – reuben

Смежные вопросы