Autorun et Usb

Sujets variés concernant le développement en PureBasic
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Autorun et Usb

Message par LavaLava »

Salut,
cela fait quelques temps que je cherche à faire executer une appli au branchement d'une clé usb.
Aprés recherche et test, il semblerait que l'utilisation d'un fichier Autorun.inf ne fonctionne pas ...
Il faudrait donc instaler un soft qui detecte la clé et lance l'appli (type PenDrive qui est payant).

Quelqu'un saurais t'il comment utiliser l'autorun.inf avec une clé ?
Sinon, pensez-vous qu'il soit possible de réaliser un 'PenDrive' en Pb ?
Merci
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Je ne connais pas PenDrive, par contre j'ai déjà pensé à ça et je me disais qu'avec un programme qui regarde tout les X temps si il y a un nouveau disque, si il y a, on va voir si il y a un "autorun.inf" (par exemple) et on lance le contnu de l'autorun. Il y a peut-être une meilleure méthode avec les API windows, c'est intéressant, je vais peut-être regarder ce soir :D

Edit : c'est peut être pas aussi simple que ce que je pensais, Fred sur un post du forum anglais dit qu'il avait quelquechose pour et qu'il va le rechercher mais il ne l'a jamais donné.

Quelqu'un sait énumérer les disques ?
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Je pense que le bus usb peut être lu comme un fichier via CreateFile qui te renverra un handle.
Utilisé conjointement avec WaitCommEvent, je pense qu'il y a moyen d'en tirer quelque chose ;)
"Qui baise trop bouffe un poil." P. Desproges
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

j'ai un copain qui a déjà fait ça, je lui demanderais comment il procède.
(avec un autorun, pas de programme qui détecte l'apparition de la clé)

sinon, pour détecter l'apparation de la clé, il suffit de capter l'évènement #WM_DEVICECHANGE = $219

ensuite, il faut lister tous les lecteurs et de répérer la clé, voir sur 2Dev pour un exmple ou fait une recherche ici
Dernière modification par Le Soldat Inconnu le lun. 03/janv./2005 19:49, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Il me semblait bien que tu avait déjà fait ça mais je ne le retrouvait pas, merci :D , mainenant je pense que ça va aller vite :) (enfin parès mangé)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Une petite ébauche pour ce soir (un peu fouilli)

Code : Tout sélectionner

;- Declarations
; Constantes
#WM_DEVICECHANGE = $219 

; Structures
Structure DriveInfos 
  DriveLetter.s 
  DriveType.l 
  DriveTypeString.s 
  NameOfVolume.s 
  Ancien.b
EndStructure
Structure OldDriveInfos 
  DriveLetter.s 
  DriveType.l 
  DriveTypeString.s 
  NameOfVolume.s 
EndStructure  

; Listes
NewList DriveList.DriveInfos()
NewList OldDriveList.OldDriveInfos()

; Buffer

; Variables
Sortie.b






Procedure MAJ()
  ClearList(OldDriveList())
  ForEach DriveList()
    AddElement(OldDriveList())
    OldDriveList()\DriveLetter = DriveList()\DriveLetter
    OldDriveList()\DriveType = DriveList()\DriveType
    OldDriveList()\DriveTypeString = DriveList()\DriveTypeString
    OldDriveList()\NameOfVolume = DriveList()\NameOfVolume
  Next
EndProcedure





Procedure GetDrive(ListDriveType.l)
; D'après un code du prodigieux Soldat Inconnu.
  Protected Drive.s, DriveLetter.s, DriveType.l, Start.l, LengthDrive.l, DriveTypeString.s 
  #REMOVABLE_DRIVE = 1 
  #FIXED_DRIVE = 2 
  #REMOTE_DRIVE = 4 
  #CDROM_DRIVE = 8 
  #RAMDISK_DRIVE = 16 
  #UNKNOWN_DRIVE = 32 
  #ALL_DRIVE = 63 

  ; On vide la liste 
  ClearList(DriveList()) 

  ; On récupère la lettre des différents lecteurs présent sur l'ordinateur 
  Drive = Space(255) 
  LengthDrive = GetLogicalDriveStrings_(255, @Drive) 

  For Start = 0 To LengthDrive - 4 Step 4 

    DriveLetter.s = PeekS(@Drive + Start, 3) ; on récupère une lettre 

    DriveType.l = GetDriveType_(@DriveLetter) ; on récupère le type du lecteur 

    Select DriveType ; On donne un nom au type de lecteur 
      Case #DRIVE_REMOVABLE : DriveType = #REMOVABLE_DRIVE : DriveTypeString.s = "Disquette" 
      Case #DRIVE_FIXED : DriveType = #FIXED_DRIVE : DriveTypeString.s = "Disque dur" 
      Case #DRIVE_REMOTE : DriveType = #REMOTE_DRIVE : DriveTypeString.s = "Lecteur réseau" 
      Case #DRIVE_CDROM : DriveType = #CDROM_DRIVE : DriveTypeString.s = "CD-ROM" 
      Case #DRIVE_RAMDISK : DriveType = #RAMDISK_DRIVE : DriveTypeString.s = "RamDisk" 
      Case #DRIVE_UNKNOWN : DriveType = #UNKNOWN_DRIVE : DriveTypeString.s = "" 
    EndSelect 

    If DriveType & ListDriveType ; on regarde si le type du lecteur correspond à ceux demandés
     If DriveLetter <> "A:\" ; On ne prend pas en compte la disquette
        AddElement(DriveList()) 
        DriveList()\DriveLetter = RemoveString(DriveLetter, "\") 
        DriveList()\DriveType = DriveType 
        DriveList()\DriveTypeString = DriveTypeString 

        If DriveLetter <> "A:\" And DriveLetter <> "B:\" 
          DriveList()\NameOfVolume = Space(255) 
          GetVolumeInformation_(@DriveLetter, @DriveList()\NameOfVolume, 255, 0, 0, 0, 0, 0) 
          DriveList()\NameOfVolume = Trim(DriveList()\NameOfVolume) 
        Else 
          DriveList()\NameOfVolume = "" 
        EndIf 
      EndIf
    EndIf 

  Next 
EndProcedure 

; Création de la fenêtre
OpenWindow(0,0,0,100,100,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"")


GetDrive(#REMOVABLE_DRIVE)

MAJ()
  
Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
    Case #WM_DEVICECHANGE
      GetDrive(#REMOVABLE_DRIVE)
      If CountList(OldDriveList()) < CountList(DriveList())
        ForEach Drivelist()
          ForEach OldDrivelist()
            If DriveList()\DriveLetter = OldDriveList()\DriveLetter
              DriveList()\Ancien = 1
              Break
            EndIf
          Next
        Next
        ForEach DriveList()
          If DriveList()\Ancien = 0
            If ReadFile(0,DriveList()\DriveLetter + "\" + "Autorun.inf")
              RunProgram(DriveList()\DriveLetter + "\" + ReadString())
              CloseFile(0)
            EndIf
          EndIf
        Next
      EndIf
      MAJ()
        
  EndSelect
  Delay(10)
Until Sortie = 1

End
et dans le "Autorun.inf", juste mettre le non relatif du fichier à lancer sur la clef par exemple

Code : Tout sélectionner

Lancezmoi.exe
ou

Code : Tout sélectionner

txt\Readme.txt
Et merci au Soldat Inconnu.
Je vais essayer de faire mieux dans la semaine avec commentaires et l'ogranisation d'un Autorun de CD
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Mon pote, il le fait avec un autorun.inf et ça marche chez lui
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message par LavaLava »

Merci Oliv pour la rapidité de ton code, cela me fera une bonne base ...
J'espére quand même que Le Soldat Inconnu pourra me donner l'autorun de son pote
@+
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Le Soldat Inconnu a écrit :Mon pote, il le fait avec un autorun.inf et ça marche chez lui
J'ai fait une petite recherche sur internet et à mon avis il doit y avoir autre chose :wink:
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Voilà une version qui marche sur tous les windows car la constante #WM_DEVICECHANGE ne fonctionne que sous XP

Code : Tout sélectionner

;- Declarations 
; Constantes 
#WM_DEVICECHANGE = $219 

; Structures 
Structure DriveInfos 
  DriveLetter.s 
  DriveType.l 
  DriveTypeString.s 
  NameOfVolume.s 
  Ancien.b 
EndStructure 
Structure OldDriveInfos 
  DriveLetter.s 
  DriveType.l 
  DriveTypeString.s 
  NameOfVolume.s 
EndStructure  

; Listes 
NewList DriveList.DriveInfos() 
NewList OldDriveList.OldDriveInfos() 

; Buffer 

; Variables 
Sortie.b 






Procedure MAJ() 
  ClearList(OldDriveList()) 
  ForEach DriveList() 
    AddElement(OldDriveList()) 
    OldDriveList()\DriveLetter = DriveList()\DriveLetter 
    OldDriveList()\DriveType = DriveList()\DriveType 
    OldDriveList()\DriveTypeString = DriveList()\DriveTypeString 
    OldDriveList()\NameOfVolume = DriveList()\NameOfVolume 
  Next 
EndProcedure 





Procedure GetDrive(ListDriveType.l) 
; D'après un code du prodigieux Soldat Inconnu.
  Protected Drive.s, DriveLetter.s, DriveType.l, Start.l, LengthDrive.l, DriveTypeString.s 
  #REMOVABLE_DRIVE = 1 
  #FIXED_DRIVE = 2 
  #REMOTE_DRIVE = 4 
  #CDROM_DRIVE = 8 
  #RAMDISK_DRIVE = 16 
  #UNKNOWN_DRIVE = 32 
  #ALL_DRIVE = 63 

  ; On vide la liste 
  ClearList(DriveList()) 

  ; On récupère la lettre des différents lecteurs présent sur l'ordinateur 
  Drive = Space(255) 
  LengthDrive = GetLogicalDriveStrings_(255, @Drive) 

  For Start = 0 To LengthDrive - 4 Step 4 

    DriveLetter.s = PeekS(@Drive + Start, 3) ; on récupère une lettre 
    If DriveLetter <> "A:\" ; On ne prend pas en compte la disquette
      DriveType.l = GetDriveType_(@DriveLetter) ; on récupère le type du lecteur 
  
      Select DriveType ; On donne un nom au type de lecteur 
        Case #DRIVE_REMOVABLE : DriveType = #REMOVABLE_DRIVE : DriveTypeString.s = "Disquette" 
        Case #DRIVE_FIXED : DriveType = #FIXED_DRIVE : DriveTypeString.s = "Disque dur" 
        Case #DRIVE_REMOTE : DriveType = #REMOTE_DRIVE : DriveTypeString.s = "Lecteur réseau" 
        Case #DRIVE_CDROM : DriveType = #CDROM_DRIVE : DriveTypeString.s = "CD-ROM" 
        Case #DRIVE_RAMDISK : DriveType = #RAMDISK_DRIVE : DriveTypeString.s = "RamDisk" 
        Case #DRIVE_UNKNOWN : DriveType = #UNKNOWN_DRIVE : DriveTypeString.s = "" 
      EndSelect 

      If DriveType & ListDriveType ; on regarde si le type du lecteur correspond à ceux demandés
          AddElement(DriveList()) 
          DriveList()\DriveLetter = RemoveString(DriveLetter, "\") 
          DriveList()\DriveType = DriveType 
          DriveList()\DriveTypeString = DriveTypeString 
  
            If DriveLetter <> "A:\" And DriveLetter <> "B:\" 
              DriveList()\NameOfVolume = Space(255) 
              ; GetVolumeInformation_(@DriveLetter, @DriveList()\NameOfVolume, 255, 0, 0, 0, 0, 0) 
              DriveList()\NameOfVolume = Trim(DriveList()\NameOfVolume) 
            Else 
              DriveList()\NameOfVolume = "" 
            EndIf 
        EndIf
    EndIf 

  Next 

EndProcedure 

; Création de la fenêtre 
OpenWindow(0,0,0,100,100,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"") 


GetDrive(#REMOVABLE_DRIVE) 

MAJ() 
  
Repeat 
  Select WindowEvent() 
    Case #PB_Event_CloseWindow 
      Sortie = 1  
      
        
  EndSelect 
  Delay(10) 
Until Sortie = 1 

Delay(3000) ; rafraichissement toutes les 3 secondes
GetDrive(#REMOVABLE_DRIVE) 
      If CountList(OldDriveList()) < CountList(DriveList()) 
        ForEach Drivelist() 
          ForEach OldDrivelist() 
            If DriveList()\DriveLetter = OldDriveList()\DriveLetter 
              DriveList()\Ancien = 1 
              Break 
            EndIf 
          Next 
        Next 
        ForEach DriveList() 
          If DriveList()\Ancien = 0 
            If ReadFile(0,DriveList()\DriveLetter + "\" + "Autorun.inf") 
              RunProgram(DriveList()\DriveLetter + "\" + ReadString()) 
              CloseFile(0) 
            EndIf 
          EndIf 
        Next 
      EndIf 
      MAJ() 


End 
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

la solution miracle serait de charger un amorceur (un petit executable de 15ko pas plus) dans le secteur d'amorçage (ou secteur de boot) de la clé USB et de mettre le programme cible dans la raçine de cette même clé pour que dès l'instant où la clé se charge en courant éléctrique le petit programme qui se trouve dans le secteur boot sera executé en priorité et il executera à son tour le programme cible qui se trouve dans la racine!!!

mais la vrais question est:
peut on réaliser se projet avec PB???????
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

Mouai, mais se qu'ils disent,
et bien vous lavez déjàs dis sur ce topic :roll:
Répondre