Próbuję napisać wzór testowy do każdego sektora sformatowanego dysku USB. Istnieje jeden dysk logiczny (np. H :). Ten wolumin jest sformatowany w systemie FAT i zawiera dane do zastąpienia. Ponadto chcę nadpisać cały fizyczny dysk. Program działa z podwyższonymi uprawnieniami użytkownika.Jak zapisywaćPlik do PhysicalDrive (Windows 7) bez uzyskania ERROR_ACCESS_DENIED?
Najpierw zrobiłem następujące:
// 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);
Wezwanie do WriteFile
nie z ERROR_ACCESS_DENIED
.
Jeśli napiszę jeden sektor, działa.
Po nadpisaniu pierwszego sektora i ponownym podłączeniu urządzenia system Windows chce go sformatować. W tej sytuacji mój kod z 2048 sektorami jednocześnie działa bez ERROR_ACCESS_DENIED
.
Również odmontowałem wolumin, jak opisano w CodeProject: WriteFile on Physical Drives with Windows 7, ale to nic nie zmieniło. Oczywiście wolumin jest odmontowany, ponieważ nie jest już widoczny w Eksploratorze Windows.
Chcę pisać więcej niż jeden sektor ze względu na wydajność. Obawiam się również, że mogą wystąpić inne problemy w tej dziedzinie, ponieważ nie rozumiem w pełni tego problemu.
Wszelkie sugestie?
A ty pracujesz jako administrator? –
@David: Tak, jestem na podwyższeniu. –