Bloquer l'accès à un volume (lecteur: disque dur, disquette, cd-rom, partition etc...)

Soyez le premier à donner votre avis sur cette source.

Vue 32 075 fois - Téléchargée 2 060 fois

Description

Un code assez simple démontrant l'utilisation de l'api DeviceIoControl, avec comme code de controle FSCTL_LOCK_VOLUME pour le blocage du volume. Ceci est un code en réponse a une question posée sur le forum (http://www.delphifr.com/forum.v2.aspx?ID=501631#2).

Le volume bloquée est débloqué a la fermeture du programme (vu que l'handle utilisé pour le pointage vers celui-ci est libéré) sinon vous utilisez un simple CloseHandle comme montré dans le code ou un FSCTL_UNLOCK_VOLUME dans DeviceIoControl.

On obtien un handle sur le volume via CreateFile.

Source / Exemple :


var
  bByteReturn: Cardinal;
  FSCTL_LOCK_VOLUME: integer;
begin
try
//FSCTL_LOCK_VOLUME  CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
FSCTL_LOCK_VOLUME := CTL(FILE_DEVICE_FILE_SYSTEM, METHOD_BUFFERED, 6, FILE_ANY_ACCESS); //dwIoControlCode Code de controle de l'action a effectuer

  hFile := CreateFile(PChar('\\.\' + copy(dcbLecteur.Text, 1, pos(':', dcbLecteur.Text))), GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE,
                      nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); //on récupère un handle sur le volume désiré
                                                                     //FILE_SHARE_READ ou FILE_SHARE_WRITE est obligatoire (au moins l'un des deux) pour dwShareMode

  if hFile = INVALID_HANDLE_VALUE then   //si l'handle est invalide alors on arrête
  begin
    ShowMessage(SysErrorMessage(GetLastError));   //message explicatif du code erreur renvoyé
                                                 //par GetLastError
    Exit;                  
  end;

  if NOT DeviceIoControl(hFile, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, bByteReturn, nil) then
    ShowMessage(SysErrorMessage(GetLastError))   //message explicatif du code erreur renvoyé
  else                                           //par GetLastError
    Caption := dcbLecteur.Text + ' > Locked (' + IntToStr(hFile) + ')';
    //******************************************************************************
    //Si vous avez un accès refusé c'est possible que vous n'y avez pas accès car
    //il y a un fichier d'ouvert sur ce volume ! Il vous faut laccès exclusif dessus
    //****************************************************************************** 

  ShowMessage('Si tout s''est bien passé, n''oubliez pas de UNLOCK le meme driver que vous avez' +
              ^M + 'LOCK! sinon en fermant le programme les volumes seront reliberés a la fermeture des handles');
except
    ShowMessage(SysErrorMessage(GetLastError))
end;

Conclusion :


Compo standar + API

- wG -

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
22 juin 2009

comment l'installer
Messages postés
129
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
14 juillet 2008

j'ai tester sans succes
Messages postés
30
Date d'inscription
lundi 10 avril 2006
Statut
Membre
Dernière intervention
24 décembre 2011

Salut,
Je cherchais depuis un mois comment créer un volume, le monter ,le demonter et le supprimer .
Il y a de cela trois jour, je suis tombé sur DeviceIoControl.Je voudrais savoir si c'est possible de m'aider.Quelles sont les commandes à utiliser, je veux dire les paramètres à utiliser pour chaque cas.Ou si tu as une autre proposition à me donner alors je suis partant.Je programme normalement en C# mais sur le forum je n'ai pas une réponse à ça.C'est pour mon projet de fin d'étude.Aidez moi s'il vous plaît !Même si je trouve une dll contenant c'est fonction alors je suis partant en connaissant bien sûr les paramètres des fonctions inclurent .
Merci !
Amicalement .
Messages postés
106
Date d'inscription
mardi 18 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2007

Salut, effectivement ça ne marche pas avec les répertoires. Il faudrait utiliser un autre systeme
Messages postés
455
Date d'inscription
mardi 24 juillet 2001
Statut
Modérateur
Dernière intervention
10 mars 2009

Cool ;)

ça ne marche pas sur un répertoire n'ext ce pas?
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.