


http://www.purebasic.fr/english/viewtop ... 39#p520539
Bien que très intéressant, le fait que ça se perde selon certaines manips reste quand même gênant

En tout cas merci de ton très bon tuto

je ne vois pas ce qui est compliqué. Teste le code figurant dans le premier message.Kwai chang caine a écrit :Bien que très intéressant, le fait que ça se perde selon certaines manips reste quand même gênant
Code : Tout sélectionner
; -------------------------------------------------------------------------------------
; Topic, du code original: http://www.purebasic.fr/french/viewtopic.php?f=6&t=17225
; -------------------------------------------------------------------------------------
; Voici un code qui permet de scanner seulement les streams Alternate Data
;(Ceux qu'on peut créer et modifier), les autres sont réservés à l'OS je crois.
; -------------------------------------------------------------------------------------
; De Nico
; Sept 2010
; Version 1.0
; Fonctionne à partir de Window 2000 (Système de Fichier NTFS)
; -------------------------------------------------------------------------------------
; Mise à jour
; PureBasic 4.61 ->PAPIPP (2012)
; PureBasic 5.61 ->Nico (2018)
; -------------------------------------------------------------------------------------
; --> Compiler en Unicode et Activer la gestion des Threads ! <--
; -------------------------------------------------------------------------------------
; Ce code permet seulement de lister les streams "Alternate Data"
; contenus dans les fichiers ou les dossiers
; -------------------------------------------------------------------------------------
;{- Enumerations / DataSections
;{ Windows
Enumeration
#Window_Main
EndEnumeration
;}
;{ Gadgets
Enumeration
#String_Dossier_Fichier
#Button_Dossier
#Button_Fichier
#ListIcon_Stream
#Button_Scan
#Button_StopperScan
#Button_SupprimerleStream
#Button_OuvrirSansExtraire
#Button_ExtraireEtEditer
#Button_Quitter
#Text_Info
#Button_OuvrirExplorateur
#BarreEtat
EndEnumeration
;}
;}
Global Chemin$
Global NomStream.s,StreamSize.q
Global FinRecherche.l
Procedure ReadStream(CheminDossier_CheminFichier.s)
Protected file_h.i,z.i,*stream.WIN32_STREAM_ID
Protected context.l=0,bytes_read.l=0,bytes_read1.l=0,seek_l=0,seek_h=0,Result.l=0
Protected namesize.l,streamHight.q,streamLow.q
file_h=CreateFile_(@CheminDossier_CheminFichier,#READ_CONTROL,0,0,#OPEN_EXISTING,#FILE_FLAG_BACKUP_SEMANTICS,0)
If file_h<>0
*stream.WIN32_STREAM_ID=AllocateMemory(20)
z=BackupRead_(file_h,*stream,20,@bytes_read,0,1,@context)
While (bytes_read<>0) And Result=0
namesize=*stream\dwStreamNameSize
If namesize>0
*buffer=AllocateMemory(namesize)
BackupRead_(file_h,*buffer,namesize,@bytes_read1,0,1,@context)
NomStream=PeekS(*buffer,namesize/2,#PB_Unicode)
FreeMemory(*buffer)
EndIf
If *stream\dwStreamID=#BACKUP_ALTERNATE_DATA
; streamHight.q=*stream\dwStreamSizeHigh & $FFFFFFFF
; streamLow.q=*stream\dwStreamSizeLow & $FFFFFFFF
streamHight.q=*stream\Size\highpart & $FFFFFFFF
streamLow.q=*stream\Size\lowpart & $FFFFFFFF
StreamSize.q=streamHight<<32 | streamLow
Result=1
EndIf
; BackupSeek_(file_h,*stream\dwStreamSizeLow,*stream\dwStreamSizeHigh,@seek_l,@seek_h,@context)
BackupSeek_(file_h,*stream\Size\lowpart,*stream\Size\lowpart,@seek_l,@seek_h,@context)
FreeMemory(*stream)
*stream.WIN32_STREAM_ID=AllocateMemory(20)
bytes_read=0
z=BackupRead_(file_h,*stream,20,@bytes_read,0,1,@context)
Wend
FreeMemory(*stream)
BackupRead_(file_h,0,0,@bytes_read,1,0,@context)
CloseHandle_(file_h)
EndIf
ProcedureReturn Result
EndProcedure
Procedure.s ParseDirectory(folder.s,id.l=0)
Protected Type.s
If Right(folder,1)<>"\"
folder+"\"
EndIf
If ExamineDirectory(id,folder,"*.*")
If FinRecherche<2
While NextDirectoryEntry(id)
If DirectoryEntryName(id)<>"." And DirectoryEntryName(id)<>".."
;##########################################
StatusBarText(#BarreEtat,0,folder+DirectoryEntryName(id))
If ReadStream(folder+DirectoryEntryName(id))
If DirectoryEntryType(id)=#PB_DirectoryEntry_Directory
Type.s="Dossier"
Else
Type.s="Fichier"
EndIf
AddGadgetItem(#ListIcon_Stream,-1,NomStream+Chr(10)+Str(StreamSize)+Chr(10)+Type+Chr(10)+folder+DirectoryEntryName(id))
EndIf
;##########################################
If DirectoryEntryType(id)=#PB_DirectoryEntry_Directory
ParseDirectory(folder+DirectoryEntryName(id),id+1)
EndIf
EndIf
Wend
EndIf
FinishDirectory(id)
EndIf
EndProcedure
Procedure ParseCheminFichierouDossier(folder.s)
Protected Type.s
If FileSize(folder)=-2
Type.s="Dossier"
Else
Type.s="Fichier"
EndIf
If ReadStream(folder)
AddGadgetItem(#ListIcon_Stream,-1,NomStream+Chr(10)+Str(StreamSize)+Chr(10)+Type+Chr(10)+folder)
EndIf
If Type="Dossier"
ParseDirectory(folder)
EndIf
EndProcedure
Procedure DisableGadgetGroup1(Etat.l)
DisableGadget(#Button_Dossier,Etat)
DisableGadget(#Button_Fichier,Etat)
DisableGadget(#Button_Scan,Etat)
DisableGadget(#Button_Quitter,Etat)
EndProcedure
Procedure DisableGadgetGroup2(Etat.l)
DisableGadget(#Button_SupprimerleStream,Etat)
DisableGadget(#Button_OuvrirSansExtraire,Etat)
DisableGadget(#Button_ExtraireEtEditer,Etat)
DisableGadget(#Button_OuvrirExplorateur,Etat)
EndProcedure
Procedure Thread(lParam.i)
ParseCheminFichierouDossier(Chemin$)
StatusBarText(#BarreEtat,0,"")
FinRecherche=0
DisableGadget(#Button_StopperScan,1)
DisableGadgetGroup1(0)
EndProcedure
Procedure OpenWindow_Window_Main()
If OpenWindow(#Window_Main,200,200,660,460,"Alternate Data Stream SPY",#PB_Window_SystemMenu | #PB_Window_TitleBar)
StringGadget(#String_Dossier_Fichier,10,25,560,25,"",#PB_String_ReadOnly)
ButtonGadget(#Button_Dossier,580,10,60,25,"Dossier")
ButtonGadget(#Button_Fichier,580,40,60,25,"Fichier")
ListIconGadget(#ListIcon_Stream,10,110,640,250,"Nom du Stream",170,#PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
AddGadgetColumn(#ListIcon_Stream,1,"Taille",60)
AddGadgetColumn(#ListIcon_Stream,2,"Type",60)
AddGadgetColumn(#ListIcon_Stream,3,"Chemin",360)
ButtonGadget(#Button_Scan,100,70,175,25,"Scan Alternate Data Stream")
ButtonGadget(#Button_StopperScan,330,70,175,25,"Stopper le Scan")
ButtonGadget(#Button_SupprimerleStream,335,370,145,25,"Supprimer le Stream")
ButtonGadget(#Button_OuvrirSansExtraire,10,370,145,25,"Ouvrir sans extraire")
ButtonGadget(#Button_ExtraireEtEditer,170,370,145,25,"Extraire et éditer")
ButtonGadget(#Button_Quitter,265,405,130,25,"Quitter")
TextGadget(#Text_Info,10,5,520,20,"Vous pouvez glisser-déposer un Fichier ou un Dossier dans la zone de texte ci-dessous")
ButtonGadget(#Button_OuvrirExplorateur,495,370,155,25,"Ouvrir dans l'explorateur")
CreateStatusBar(#BarreEtat,WindowID(#Window_Main))
AddStatusBarField(#PB_Ignore)
EnableGadgetDrop(#String_Dossier_Fichier,#PB_Drop_Files,#PB_Drag_Copy)
DisableGadget(#Button_StopperScan, 1)
DisableGadgetGroup2(1)
EndIf
EndProcedure
OpenWindow_Window_Main()
;{- Event loop
Repeat
Select WaitWindowEvent()
; ///////////////////
Case #PB_Event_GadgetDrop
Select EventGadget()
Case #String_Dossier_Fichier
Files$=EventDropFiles()
Count=CountString(Files$,Chr(10))+1
SetGadgetText(#String_Dossier_Fichier,StringField(Files$,1,Chr(10)))
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case #Button_Dossier
Chemin$=PathRequester("Choisissez un répertoire:","C:\")
SetGadgetText(#String_Dossier_Fichier,Chemin$)
Case #Button_Fichier
Chemin$=OpenFileRequester("Choisissez un fichier:","C:\","*.*",0)
SetGadgetText(#String_Dossier_Fichier,Chemin$)
Case #ListIcon_Stream
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
DisableGadgetGroup2(0)
Else
DisableGadgetGroup2(1)
EndIf
Case #Button_Scan
ClearGadgetItems(#ListIcon_Stream)
Chemin$=GetGadgetText(#String_Dossier_Fichier)
If FileSize(Chemin$)<>-1
DisableGadgetGroup1(1)
DisableGadgetGroup2(1)
DisableGadget(#Button_StopperScan,0)
FinRecherche=1
CreateThread(@Thread(),0)
Else
MessageRequester("Info","Choisissez un chemin de Dossier ou de Fichier valide!")
EndIf
Case #Button_StopperScan
FinRecherche=2
DisableGadget(#Button_StopperScan,1)
DisableGadgetGroup1(0)
Case #Button_OuvrirSansExtraire
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
NameStream=StringField(NameStream,2,":")
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
MessageRequester("Info","Dans certain cas, Notepad ne sera pas en mesure d'ouvrir le Stream !"+Chr(13)+"mais vous pouvez toujours faire une Extraction puis ensuite éditer le Fichier ainsi obtenu.")
RunProgram("Notepad.exe",CheminStream+":"+NameStream,"")
EndIf
Case #Button_ExtraireEtEditer
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
NameStream=StringField(NameStream,2,":")
Taille.s=GetGadgetItemText(#ListIcon_Stream,Index,1)
If Taille<>"0"
NomFichier$=SaveFileRequester("Choisissez un emplacement:",NameStream,"*.*",0)
If NomFichier$<>""
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
If ReadFile(0,CheminStream+":"+NameStream)
Longueur.q=Lof(0)
*Buffer=AllocateMemory(Longueur)
ReadData(0,*Buffer,Longueur)
CloseFile(0)
If CreateFile(0,NomFichier$)
WriteData(0,*Buffer,Longueur)
CloseFile(0)
ret = MessageRequester("Erreur","Voulez vous ouvrir ce fichier? " + Chr(10) + NomFichier$, #PB_MessageRequester_YesNo)
If ret = #PB_MessageRequester_Yes
RunProgram("Notepad.exe",NomFichier$,"")
EndIf
Else
MessageRequester("Erreur","Impossible de créer le fichier! " + Chr(10) + NomFichier$ )
EndIf
FreeMemory(*Buffer)
Else
MessageRequester("Erreur","Le Stream n'a pas pu être sauvegardé!")
EndIf
EndIf
Else
MessageRequester("Info","La Taille de ce Stream est de 0 octet, il est inutile de vouloir le sauvegarder!")
EndIf
EndIf
Case #Button_SupprimerleStream
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
NameStream.s=GetGadgetItemText(#ListIcon_Stream,Index,0)
NameStream=StringField(NameStream,2,":")
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
Type.s=GetGadgetItemText(#ListIcon_Stream,Index,2)
Message$="Êtes-vous sûr de vouloir supprimer le Stream : "+NameStream+" ?"+Chr(13)+"du "+Type+" "+CheminStream
Resultat=MessageRequester("Attention",Message$,#PB_MessageRequester_YesNo)
If Resultat=#PB_MessageRequester_Yes
If DeleteFile(CheminStream+":"+NameStream)<>0
RemoveGadgetItem(#ListIcon_Stream,Index)
Else
MessageRequester("Erreur","Le Stream n'a pas pu être effacé!")
EndIf
EndIf
EndIf
Case #Button_OuvrirExplorateur
Index.l=GetGadgetState(#ListIcon_Stream)
If Index>-1
CheminStream.s=GetGadgetItemText(#ListIcon_Stream,Index,3)
RunProgram("Explorer.exe","/e, /Select,"+CheminStream,"")
EndIf
Case #Button_Quitter
CloseWindow(#Window_Main)
Break
EndSelect
; ////////////////////////
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Window_Main
If FinRecherche=0
CloseWindow(#Window_Main)
Break
Else
MessageRequester("Info","Cliquez sur le Bouton Stopper le Scan avant de quitter!")
EndIf
EndSelect
EndSelect
ForEver
;
;}
Pour une fois que j'ai pas dit que c'était compliquéfalsam a écrit :je ne vois pas ce qui est compliqué. Teste le code figurant dans le premier message.Kwai chang caine a écrit :Bien que très intéressant, le fait que ça se perde selon certaines manips reste quand même gênant