Autorun et Usb
Autorun et Usb
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
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
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 ?

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 ?
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
Utilisé conjointement avec WaitCommEvent, je pense qu'il y a moyen d'en tirer quelque chose

"Qui baise trop bouffe un poil." P. Desproges
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
(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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Une petite ébauche pour ce soir (un peu fouilli)
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
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
Code : Tout sélectionner
Lancezmoi.exe
Code : Tout sélectionner
txt\Readme.txt
Je vais essayer de faire mieux dans la semaine avec commentaires et l'ogranisation d'un Autorun de CD
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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???????
mais la vrais question est:
peut on réaliser se projet avec PB???????