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

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

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.