2011-07-07 7 views
7

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?

+0

A ty pracujesz jako administrator? –

+0

@David: Tak, jestem na podwyższeniu. –

Odpowiedz

3

nie miałem problemów z różnych WriteFile() rozmiarach, ale nie rozwiąże

WriteFile(): Odmowa dostępu <ERROR_ACCESS_DENIED/5> do „\ \ PhysicalDriveX

urządzeń (zazwyczaj. USB HDD/SSD) w systemie Windows 7 działającym jako Administrator (podwyższone prawa) w następujący sposób:

Zarządzanie komputerem -> Zarządzanie dyskami:

  • głośności (H: w Twoim przypadku) -> kliknij prawym przyciskiem myszy -> Usuń Tom
  • Disk (Dysk 2 w danym przypadku) -> kliknij prawym przyciskiem myszy -> Off-line
  • Disk (Dysk 2 w twoim przypadku) -> kliknij prawym przyciskiem myszy -> On-line

Po tym, jestem w stanie napisać do "\. \ physicaldriveX" bez problemu.

Myślę, że zamki Win7 (w przeciwieństwie do poprzednich wydań systemu Windows) fizycznego urządzenia tak długo, jak istnieje system plików na urządzeniu, aby uniknąć problemów z konsystencją.

+0

Muszę się temu przyjrzeć, dziękuję. –

1

Inną metodą jest użycie clean usunąć wszystkie partycje na dysku:

C:\> diskpart 
Diskpart> list disk 

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

Diskpart> clean 

Diskpart> exit 
+1

Powinieneś poprzedzić swój post ostrzeżeniem o tym, co robi. Niedoświadczony użytkownik może łatwo usunąć dane z dysku, nie znając pełnych konsekwencji tego polecenia. – ScottN

2

Nie można bezpośrednio przejść sektorów dysku, które są własnością zamontowanym systemie plików.

Zobacz Changes to the file system and to the storage stack to restrict direct disk access and direct volume access

dokumentacji dla FSCTL_DISMOUNT_VOLUME opisuje następującą sekwencję nadpisanie systemu plików:

  1. Otwórz objętość.
  2. Zablokuj głośność.
  3. Sformatuj głośność.
  4. Wymontuj głośność.
  5. Odblokuj głośność.
  6. Zamknij uchwyt głośności.

Twoja operacja pisania wzoru będzie w kroku 3 zamiast formatowania.

Powiązane problemy