Page 1 sur 1
Autorun et Usb
Publié : lun. 03/janv./2005 16:23
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
Publié : lun. 03/janv./2005 17:56
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
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 ?
Publié : lun. 03/janv./2005 19:11
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

Publié : lun. 03/janv./2005 19:45
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
Publié : lun. 03/janv./2005 20:01
par Oliv
Il me semblait bien que tu avait déjà fait ça mais je ne le retrouvait pas, merci

, mainenant je pense que ça va aller vite

(enfin parès mangé)
Publié : lun. 03/janv./2005 21:48
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
ou
Et merci au Soldat Inconnu.
Je vais essayer de faire mieux dans la semaine avec commentaires et l'ogranisation d'un Autorun de CD
Publié : lun. 03/janv./2005 22:57
par Le Soldat Inconnu
Mon pote, il le fait avec un autorun.inf et ça marche chez lui
Publié : mar. 04/janv./2005 15:27
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
@+
Publié : mar. 04/janv./2005 17:56
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

Publié : ven. 04/mars/2005 19:09
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
Publié : dim. 27/janv./2008 0:01
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???????
Publié : dim. 27/janv./2008 0:12
par djes
Publié : dim. 27/janv./2008 11:18
par Fortix
Mouai, mais se qu'ils disent,
et bien vous lavez déjàs dis sur ce topic
