Détection d'un média protégé en écriture

cadyf Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 8 décembre 2018 - 12 avril 2009 à 20:04
cadyf Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 8 décembre 2018 - 16 avril 2009 à 11:15
bonjour,
Essayer d'écrire sur un média protégé en écriture génère un message windows qui n'est pas intercepté par le programme.
Existe-t-il un moyen pour savoir, dans un programme, si un média est réellement disponible en écriture avant que windows n'intervienne?
merci.
cadyf.

13 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 21:15
Salut,

Regarde à FindFirst et FindNext ou encore à FileGetAttr dans l'aide Delphi.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
12 avril 2009 à 21:20
Il y a aussi la fonction FileIsReadOnly(constFileName:string) qui renvoie la valeur true si elle a pu trouver et ouvrir FileName alors que le processus en cours n'a pas le droit d'écrire dans le fichier...
0
cadyf Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 8 décembre 2018
13 avril 2009 à 12:39
Bonjour,
<FileIsReadOnly(constFileName:string)>
je ne maitrise pas tout et ne disposant que de la version 5 de Delphi, je n'ai pas trouvé cette fonction...

<Regarde à FindFirst et FindNext ou encore à FileGetAttr dans l'aide Delphi>
je vais tester cette composition.

merci pour les conseils,
Cadyf
0
Miquel75 Messages postés 41 Date d'inscription mercredi 5 mars 2008 Statut Membre Dernière intervention 23 avril 2009
13 avril 2009 à 22:03
FindFirst et FindNext n'ont rien à voir là-dedans (!)

Soit un disable la dialog Système, soit on teste avec l'api win32 Système si Disc writable  = TRUE.

C'est une FAQ Win32 api depuis 1995  (voir [news://nntp.aioe.org/fr.comp.os.ms-windows.programmation groupe expert Win32 ]où ça a été largement détaillé ..)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cadyf Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 8 décembre 2018
13 avril 2009 à 23:55
bonjour,
les premières solutions proposées ne conviennent pas (findfirst etc...).
mon problème reste de détecter si un média pouvant être protégé en écriture (par exemple un clé usb vue comme un disque) est effectivement protégé avant que windows ne prenne la main pour avertir l'utilisateur.
merci de m'aider, mais ne vous fâchez pas.
Cadyf
0
Utilisateur anonyme
14 avril 2009 à 00:16
Personne se fache . Attention à l'utilisation du mot média (Un média est un fichier) et non un périphérique de stockage. C'est pour cela que Cari t'a proposé ses fonctions afin de faire une recherche de tes fichiers et de les tester. Pour répondre à ta question : si j'ai bien compris tu veux avertir l'utilisateur avant que windows le fasse, de la fermeture en écriture d'un tel périphérique : Et pourquoi ne pas intercepter ces messages windows justement ? Regarde du coté des hooks systeme .
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
14 avril 2009 à 15:08
@Cadyf
Oups !
Francky a raison, on s'était mal compris. Désolé.

@Francky
Miquel75 est le plus GRAND programmeur français du monde ! ! ! 
Voir ses mémorables interventions

ICI
.



Dommage qu'il n'ait jamais donné la moindre ligne de code à personne.  

'doit avoir des oursins dans les poches, comme tous les banquiers...
0
Utilisateur anonyme
14 avril 2009 à 17:50
Allez un petit extrait qui en dit long sur le personnage :



Et quel est le problème ?
Ce genre de sites n'a que des codes étant faits par du copier-coller, comme partout.
Il y a des dizaines d'extraits des mes codes aussi, postés sur tous les newsgroups depuis 18 ans.
Sans parler des copies intégrales de MSDN.
Qu'est-ce que ça peut bien faire ?

En fait tout les codes qu'il y a sur CS ne sont que des plagiats de ses codes :  Bon Miquel pour mon prochain poste, je te donne combien pour les copyrights ??
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 avril 2009 à 14:16
Salut,

Miquel75 -> Ton aide est d'une rare inutilité. Soit plus précis ou abstiens toi.

cadyf ->

Regarde du côté de IOCTL_DISK_IS_WRITABLE, utilisable via DeviceIoControl.
Si tu as des problèmes avec la récupération du handle via CreateFile (Vista...), regarde les pré-requis nécessaires.
Je n'ai pas essayé ce code sur un heu... media en lecture seule.
const
  IOCTL_DISK_IS_WRITABLE = $70024;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  hDisk: THandle;        // Handle sur le disque
  nReturned: Cardinal;   // Taille des données retournées
begin
  // Récupération d'un handle sur le disque
  hDisk:= CreateFile('\\.\C:', 0,
                     FILE_SHARE_READ or FILE_SHARE_WRITE,
                     nil, OPEN_EXISTING, 0, 0);
  if hDisk = INVALID_HANDLE_VALUE then RaiseLastOSError;

  if DeviceIoControl(hDisk,
                     IOCTL_DISK_IS_WRITABLE,  // Code de contrôle
                     nil,                     // Buffer d'entrée
                     0,                       // Taille du buffer d'entrée
                     nil,                     // Buffer de sortie
                     0,                       // Taille du buffer de sortie
                     nReturned,               // Nombre d'octets écris dans le buffer de sortie
                     nil) then                // Overlapped
    ShowMessage('Disque accessible en écriture')
  else
    if GetLastError = ERROR_WRITE_PROTECT then
      ShowMessage('Le disque est read only')
    else
      RaiseLastOSError;

  CloseHandle(hDisk);
end;
0
cadyf Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 8 décembre 2018
15 avril 2009 à 22:10
bonjour
moyennant le remplacement de RaiseLastOSError (inconnu) par RaiseLastWin32Error ce code fonctionne et répond exactement à ce que je souhaitais réaliser.
merci pour ce coup de main efficace,
Cadyf
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 avril 2009 à 09:22
Tu as une vielle version de Delphi j'imagine (< 6). Tu as peut être RaiseLastWin32Error, qui fait le même boulot.

Au fait il y a une erreur  :

  else
    if GetLastError = ERROR_WRITE_PROTECT then
      ShowMessage('Le disque est read only')
    else
    begin
      RaiseLastOSError;
      CloseHandle(hDisk);
  end;

  CloseHandle(hDisk);
end;
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 avril 2009 à 09:23
Boulet... Non l'inverse.

  else
    if GetLastError = ERROR_WRITE_PROTECT then
      ShowMessage('Le disque est read only')
    else
    begin
      CloseHandle(hDisk);
      RaiseLastOSError;
  end;

  CloseHandle(hDisk);
end;
0
cadyf Messages postés 7 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 8 décembre 2018
16 avril 2009 à 11:15
bonjour,
j'ai bien noté la correction.
Pour le moment j'utilise la fonction dérivée suivante :

function disquedispoecriture(xx:char):boolean;
const IOCTL_DISK_IS_WRITABLE = $70024;
var ll         : string;
    hDisk      : THandle;        // Handle sur le disque
    nReturned  : Cardinal;   // Taille des données retournées

begin
     // Récupération d'un handle sur le disque
     ll:='\\.\'+xx+':';
     hDisk:= CreateFile(pchar(ll),0,FILE_SHARE_READ or FILE_SHARE_WRITE,nil, OPEN_EXISTING, 0, 0);
     if hDisk = INVALID_HANDLE_VALUE then result:=false
     else
     begin
          if DeviceIoControl(hDisk,
                             IOCTL_DISK_IS_WRITABLE,  // Code de contrôle
                             nil,                     // Buffer d'entrée
                             0,                       // Taille du buffer d'entrée
                             nil,                     // Buffer de sortie
                             0,                       // Taille du buffer de sortie
                             nReturned,               // Nombre d'octets écris dans le buffer de sortie
                             nil) then                // Overlapped

          result:=true
          else result:=false;
          CloseHandle(hDisk);
     end;
end;

qui permet juste de savoir si le disque visé est disponible en écriture.
merci,
Cadyf
0
Rejoignez-nous