не может записать на физический диск в Win 7?

Я написал дисковую утилиту, которая позволяла стирать все физические диски. он использует api файла Windows, вызывая:

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

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

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

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

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

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

Любые идеи?

Обновлять:

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


person matt    schedule 11.04.2010    source источник
comment
Сообщите код ошибки или сообщение об ошибке.   -  person jweyrich    schedule 11.04.2010
comment
@jweyrich: ошибка: ERROR_ACCESS_DENIED   -  person matt    schedule 11.04.2010
comment
Я предлагаю проверить, есть ли у UAC что-нибудь с этим. Попробуйте отключить его и повторно запустить приложение. Прокомментируйте результаты.   -  person jweyrich    schedule 11.04.2010


Ответы (1)


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

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

person tyranid    schedule 11.04.2010
comment
это выглядит многообещающим, я предполагаю, что вы не можете вызвать FSCTL_DISMOUNT_VOLUME на физическом диске, и вам нужно перечислить разделы на диске и вызвать FSCTL_DISMOUNT_VOLUME на всех из них. Я не уверен, как получить разделы на физическом диске, но я посмотрю и попробую завтра, спасибо. - person matt; 11.04.2010
comment
Вы всегда можете перечислить все тома в системе с помощью FindFirstVolume / FindNextVolume, вызвать IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS на каждом, а затем проверить, есть ли у тома какое-либо резервное хранилище на рассматриваемом диске. (Есть несколько более сложных случаев, когда тома могут быть распределены по нескольким дискам и т. Д.) - person reuben; 12.04.2010