2011-07-07 3 views
7

J'essaye d'écrire un modèle de test à chaque secteur d'une commande USB formatée. Il y a un lecteur logique (par exemple h :). Ce volume est au format FAT et contient des données à remplacer. En outre, je veux écraser tout le disque physique. Le programme fonctionne avec des droits d'utilisateur élevés.Comment écrire un fichier sur un disque physique (Windows 7) sans ERROR_ACCESS_DENIED?

abord je les suivantes:

// 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); 

L'appel à WriteFile échoue avec ERROR_ACCESS_DENIED.

Si j'écris un secteur, cela fonctionne.

Lorsque j'écrase le premier secteur et que je branche à nouveau le périphérique, Windows souhaite le formater. Dans cette situation mon code avec 2048 secteurs à la fois fonctionne sans ERROR_ACCESS_DENIED.

J'ai également démonté le volume comme décrit dans CodeProject: WriteFile on Physical Drives with Windows 7 mais cela n'a rien changé. Évidemment, le volume est démonté car il n'est plus visible dans Windows Explorer.

Je souhaite écrire plus d'un secteur pour des raisons de performances. J'ai également peur que d'autres problèmes sur le terrain ne se produisent parce que je ne comprends pas bien le problème.

Des suggestions?

+0

Et vous exécutez en tant qu'administrateur? –

+0

@David: Oui, je cours en hauteur. –

Répondre

3

Je n'ai pas ont des problèmes avec différentes tailles WriteFile(), mais je ne résoudre le

WriteFile(): L'accès est refusé à <ERROR_ACCESS_DENIED/5> \ » \ PhysicalDriveX

appareils (généralement. USB HDD/SSD) dans Windows 7 fonctionnant en tant qu'administrateur (droits élevés) comme suit:

Gestion de l'ordinateur -> Gestion des disques:

  • Volume (H: dans votre cas) -> clic droit sur -> Supprimer le volume
  • disque (disque 2 dans votre cas) -> clic droit sur -> hors ligne
  • Disk (disque 2 dans votre cas) -> clic-droit -> En ligne

Après cela, je suis capable d'écrire '\. \ physicaldriveX' sans problème. Je pense que le Win7 verrouille (contrairement aux précédentes versions de Windows) le périphérique physique tant qu'il y a un système de fichiers sur le périphérique pour éviter les problèmes de cohérence.

+0

Je vais y jeter un coup d'oeil, merci. –

1

Une autre méthode consiste à utiliser clean pour supprimer toutes les partitions sur le disque:

C:\> diskpart 
Diskpart> list disk 

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

Diskpart> clean 

Diskpart> exit 
+1

Préférez votre message avec un avertissement de ce que cela fait. Un utilisateur inexpérimenté qui le fait pourrait facilement effacer les données d'un lecteur sans connaître les ramifications complètes de cette commande. – ScottN

2

Vous ne pouvez pas accéder directement à des secteurs d'un disque qui sont la propriété d'un système de fichiers monté.

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

La documentation FSCTL_DISMOUNT_VOLUME décrit la séquence suivante pour un système de fichiers écraser:

  1. Ouvrir un volume.
  2. Verrouillez le volume.
  3. Formater le volume.
  4. Démonter le volume.
  5. Débloquez le volume.
  6. Fermez la poignée du volume.

Votre opération d'écriture de modèle se ferait à l'étape 3 au lieu de la mise en forme.

Questions connexes