A.D.S : Associer des méta-données à un fichier exécutable

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

A.D.S : Associer des méta-données à un fichier exécutable

Message par falsam »

A.D.S. (Alternate Data Stream) est une technologie apparu en 1993 et utilisable qu'avec des disques formatés NTFS uniquement ce qui est le cas de la majorité des ordinateurs en 2018.

Cette technologie consiste à ajouter un ou plusieurs flux de données à un fichier existant.

Ces flux de données peuvent être de toutes natures (texte, graphique, code exécutable...).

Ces flux sur le disque sont sous la forme application.exe:nomduflux et sont jusqu'à présent invisibles (Presque invisibles :wink: )

C'est ce que nous allons voir avec ce code qui permet de compter le nombre de fois qu'un exécutable est lancé.

Deux petites procédures :

ReadADS(ADS.s) pour lire un flux de données ADS associé à un éxécutable.
WriteADS(ADS.s, Value.s) pour écrire dans un flux de données associé à un exécutable.

Code : Tout sélectionner

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure

Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure

;Read and show number of lauches
NumberofLauches$ = ReadADS("NUMBEROFLAUCHES")

MessageRequester("Number of launches", Str(Val(NumberofLauches$)))

;Write number of lauches  + 1 
NumberofLauches = Val(NumberofLauches$) + 1 
WriteADS("NUMBEROFLAUCHES", Str(NumberofLauches))
Créer un éxécutable avec ce code et lancer le.

La première fois vous aurez la valeur 0 puis au second lancement 1, troisième lancement 2, etc ....
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par falsam »

Vous pouvez déplacer l'exécutable d'un dossier à un autre dossier ou sur un autre support comme une clé USB et tester sur un autre ordinateur, le compteur continuera à s'incrémenter.

Dans mon commentaire précédent, j'ai dit que les flux de données étaient presque invisibles car on peut les lister avec l'utilitaire AlternateStreamView v1.54 de l'éditeur NirSoft.

Image

Site https://www.nirsoft.net/utils/alternate ... reams.html (Download en fin de page)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Ar-S »

Court et simple.
Sympa pour faire un exe de demo de soft exécutable x fois par exemple.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par falsam »

Ar-S a écrit :Sympa pour faire un exe de demo de soft exécutable x fois par exemple.
Ouiiiii

Ce deuxième exemple enregistre deux fluxs associés à l’exécutable.
- Le compteur vu précédemment,
- La date et heure du dernier lancement.

Code : Tout sélectionner

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure

Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure


;Read and show number of lauches
NumberofLauches$ = ReadADS("NUMBEROFLAUCHES")
Time$ = ReadADS("LASTTIME")

MessageRequester("Number of launches", Str(Val(NumberofLauches$)) + " Last run  " + Time$)

;Write number of lauches  + 1 
NumberofLauches = Val(NumberofLauches$) + 1 
WriteADS("NUMBEROFLAUCHES", Str(NumberofLauches))

;Write last time
Time$ = FormatDate("%dd/%mm/%yyyy - %hh:%ii:%ss", Date())
WriteADS("LASTTIME", Time$)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Fig »

Très intéressant... :idea:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par falsam »

Avec cet exemple nous allons stocker le contenu d'une structure dans un flux de données associé à l’exécutable.

Cette structure reprend les variables de l'exemple précédent.

Code : Tout sélectionner

Structure Parameter
  NumberOfLauches.i
  Time.s
EndStructure
Define Setup.Parameter
Et sera sauvegardée dans un objet JSON.

Code : Tout sélectionner

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure

Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure

;Test area
Structure Parameter
  NumberOfLaunches.i
  Time.s
EndStructure
Define Setup.Parameter

;Read and show number of lauches
If ParseJSON(0, ReadADS("SETUP"))
  ExtractJSONStructure(JSONValue(0), @Setup, Parameter)
  MessageRequester("Number of launches", Str(Setup\NumberOfLaunches) + " at " + Setup\Time)
Else
  MessageRequester("Number of launches", "This is your first run")
EndIf


;Write number of lauches +1 and last time 
Setup\NumberOfLaunches + 1 
Setup\Time = FormatDate("%dd/%mm/%yyyy - %hh:%ii:%ss", Date())

If CreateJSON(0)
  InsertJSONStructure(JSONValue(0), @Setup, Parameter)
  WriteADS("SETUP", ComposeJSON(0))
EndIf
Créer un exécutable et lancer le plusieurs fois.

Vous pouvez aussi stocker une map ou une liste chainée.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par cage »

Merci falsam,

Démystifie ce qu'est A.D.S. (Alternate Data Stream) que je ne connaissez pas.
Comme d'habitude, tes explications sont limpides et intéressantes.
Cela m'ouvre des possibilités.

cage
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Ar-S »

Petite précision :
Méfiez vous tout de même. L'ADS n'est pas compatible FAT32.. Donc si vous transférez votre fichier sur un support formaté en Fat32, vous devriez perdre les données en ADS.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Zorro »

falsam a écrit :[.... des disques formatés NTFS uniquement ce qui est le cas de la majorité des ordinateurs en 2018.

perso, j'ai bloqué sur cette phrase , mais ne trouvant pas de sources indiquant le contraire, je ne fais que de m’étonner de ça ....

considerant le nombre de systemes utilisant LINUX et le systeme Ext3/Ext4/XFS .....
je parle tout aussi bien des systeme sous Ordinateur que sous Tablettes, Telephones Portables....

sans parler des Ordinateurs encore nombreux a tourner sur Fat32 / win XP ... (les distributeurs de billets de Banque )
http://www.phonandroid.com/95-distribut ... atage.html


bref , je ne suis pas sur que cette affirmation soit vrais ....
meme si on se restreint aux ordinateurs possédés par des particuliers (entreprises compris) .. :)


pour l'ADS , je ne connaissais pas .
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Ar-S »

en fait je faisais plus allusion aux cle usb qui sont parfois reconnus uniquement en fat32 dans certains autoradio par ex. mais j'avais aussi zappé que falsam l'avait dit.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par GallyHC »

Bonjour,

Zorro > Falsam avec ça phrase a surement oublier de préciser que cela n'été valable que sous Windows avec un disque formater en "NTFS". "ADS" à visiblement été fait pour une compatibilité avec les ordinateur sous MacOS.

Voir https://manumation.developpez.com/articles/windows/ads/
Les ADS ont été créés dans le but d'offrir une compatibilité avec HFS, le système de gestion de fichiers sous Mac. Sans entrer dans les détails, le but était de pouvoir créer un serveur de fichier Windows avec comme clients des Mac. De nos jours, ils sont aussi utilisés dans certaines techniques de traçabilité de fichiers, et pour par exemple, des résumés (voir fin du chapitre).
Donc oui, pas forcement touts les OS, mais juste Windows, mais cela permet déjà pas mal de chose du style stockage de la clef d'enregistrement, des informations de configuration et même comme quand l'exemple un compteur d'utilisation.

Tout comme, si tu Zip le fichier et que tu l'extrais tu perds aussi les donnée "ADS", cette méthode a ses avantages et ses défauts.

Cordialement,
GallyHC
Dernière modification par GallyHC le ven. 13/avr./2018 12:12, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par falsam »

GallyHC a écrit : Falsam avec ça phrase a surement oublier de préciser que cela n'été valable que sous Windows avec un disque formater en "NTFS"
Pas du tout. Relis bien mon premier message que zorro a d'ailleurs quotée dans son commentaire :wink:

@Ar-S : J'avais fait mes tests sur une clé USB formaté NTFS.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par falsam »

Zorro tu m'énerves :wink:
falsam a écrit :A.D.S. (Alternate Data Stream) est une technologie apparu en 1993 et utilisable qu'avec des disques formatés NTFS uniquement ce qui est le cas de la majorité des ordinateurs en 2018.
- La majorité des ordinateurs ne veut pas dire 100%
- J'ai bien précisé sur partition NTFS (Ca c'est pour Gally ^-^)

Part de marché des OS en Mars 18 2018 (Source Net Market Share)

- Windows : 88.72%
- Mac OS : 8.56%
- Linux : 2.30%
- Chrome OS : 0.31
- le reste on s'en fiche (BSD et autres ....) :wink:

■ Sur ces 88.72% d'ordinateurs équipés de Microsoft Windows (Source StatCounter

- Windows 10 : 43.95%
- Windows 7 : 41.51%
- Windows 8.1 : 7.99 %
- Windows XP : 3.42 %
- Windows 8 : 2.44%
- Windows Vista : 0.61
- Autres : 0.08 %
Zorro a écrit :considerant le nombre de systemes utilisant LINUX et le systeme Ext3/Ext4/XFS .....
2.30%
Zorro a écrit :je parle tout aussi bien des systeme sous Ordinateur que sous Tablettes, Telephones Portables....
Purebasic ne fonctionnant pas sur ce types de terminaux, j'en ai pas tenu compte.
Zorro a écrit :sans parler des Ordinateurs encore nombreux a tourner sur Fat32 / win XP ... (les distributeurs de billets de Banque )
Sous xp 3.42% !
Zorro a écrit :bref , je ne suis pas sur que cette affirmation soit vrais ....
Ben justement si : En faisant référence à ces chiffres, la majorité des ordinateurs sont partitionnés NTFS.

:idea: Pour info j'ai procédé aussi à des tests sous Mac OS et ça fonctionne parfaitement.

Linux je suis loin d’être un spécialiste mais je pense qu'on peut partitionner un support en NTFS. Maintenant est ce que le code fonctionne ? je ne sais pas. Mais ce n'est de toute façon que 2.30% de part de marché.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2147
Inscription : sam. 08/févr./2014 15:19

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Marc56 »

Précision:
:arrow:
̶P̶a̶r̶t̶ ̶d̶e̶ ̶m̶a̶r̶c̶h̶é̶ ̶d̶e̶s̶ ̶O̶S̶ ̶e̶n̶ ̶M̶a̶r̶s̶ ̶1̶8̶ ̶2̶0̶1̶8̶
Part de marché des OS qui se sont connecté à l'Internet

Methodology: Details on our data collection, aggregation and quality control processes.
Source of Data:
We collect data from the browsers [...]

On ne peut pas connaitre le % réel de chaque OS en temps réel :wink:
On sait qu'il y a déjà environ 1.2 milliard de téléphones, tablettes etc sous android, ce qui fait plus d'os android que windows mais comme la plupart ne sont pas utilisés pour aller naviguer sur les sites de stats, on ne les voit pas.

Pour ce qui est des partitions NTFS, linux peut les lire, y écrire (péniblement) mais les systèmes natifs de Linux sont bien plus fiables et rapides.
Paradoxe: Linux utilisé comme serveur de fichier pour des clients Windows (avec Samba) est plus rapide qu'un serveur Windows d'origine :mrgreen:

Mais je m'égare là oups :oops:

:idea: PS Merci pour ton article, je ne connaissais pas ADS j'aurais appris un truc aujourd'hui :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: A.D.S : Associés des méta-données à un fichier exécutabl

Message par Ar-S »

Voilà un exemple pour générer une petite protection par clé en utilisant ADS.

2 programmes.
- le 1er est le petit keygen qui va créer une 1ère clé. Cette clé vous devez la copier dans le second code ligne 74
- Le second est l'exe que vous compilerez est qui sera destiné à votre client.

Instructions :

- Compilez le code 2 en un fichier test.exe
- Lancez le
Il vous demande nom et prénom. Vous devrez alors rentrer Dupont Jean dans cet exemple sauf si vous avez généré une autre clé avec le keygen
Une fois cela fait, le programme vous demandera de redémarrer. Si les noms et prénom sont bons, la fenêtre du prog s'ouvrira.
Petite protection supplémentaire. L'exe sera lié au serial de votre disque C en plus de votre nom et prénom.

Note : je suis bien conscient que cette protection nécessite de créer un exe pour chaque client et que l'ADS reste très volatile comme protection.
Cet exemple est pour le fun. Je me suis bien amusé.
:mrgreen:

Code : Tout sélectionner

; Générateur de clé

UseSHA3Fingerprint()

Procedure.s GenerateLic(Mot$)
  N$ = UCase(Mot$)
  N$ = Trim(Mot$)
  ProcedureReturn StringFingerprint(N$, #PB_Cipher_SHA3)
EndProcedure


; Exemple de création de la clé à coller dans le code du programme principal
NameKey$ = GenerateLic(Trim("DUPONT JEAN"))
SetClipboardText("NameKey$ = "+Chr(34)+NameKey$+Chr(34))
; Vous pouvez directement faire un clic droit / coller ligne 74 du programme principale.

Code : Tout sélectionner

; Falsam : ADS / MVXA : HDD SERIAL /Ar-S : Prog

UseSHA3Fingerprint()

Procedure.s ReadADS(ADS.s)
  Protected Buffer.s
  Protected Filename.s = ProgramFilename()
  
  If ReadFile(0, Filename + ":" + ADS, #PB_File_SharedRead)
    Buffer = ReadString(0, #PB_Unicode)
    CloseFile(0)
  EndIf
  ProcedureReturn Buffer
EndProcedure



Procedure WriteADS(ADS.s, Value.s)
  Protected Filename.s = ProgramFilename()
  If CreateFile(0, Filename + ":" + ADS, #PB_File_SharedWrite)
    WriteData(0, @Value, StringByteLength(Value))
    CloseFile(0)
  EndIf
EndProcedure



Procedure.s GenerateLic(Mot$)
  ProcedureReturn StringFingerprint(Mot$, #PB_Cipher_SHA3)
EndProcedure

Procedure.s ReturnHDDSerial(Laufwerk.s)
  ;code de MVXA
  Define.i tmpSerial
  Define.s tmpLfwrk, tmpFileSystem
  
  tmpLfwrk      = Left(Laufwerk, 1) + ":\"
  tmpFileSystem = Space(256)
  GetVolumeInformation_(@tmpLfwrk, @tmpFileSystem, 255, @tmpSerial, 0, 0, @tmpFileSystem, 255)
  Debug Hex(tmpSerial)
  
  ProcedureReturn Hex(tmpSerial)
EndProcedure



Procedure OW()
  If OpenWindow(0, 0, 0, 220, 100, "Licence OK !...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ButtonGadget  (1, 10, 60, 200, 30, "Fermer")
    
    Repeat
      Event = WaitWindowEvent()
      
      Select Event
          
        Case #PB_Event_Gadget
          Select EventGadget()
            Case 1 
              CloseWindow(0)
              End  
          EndSelect
          
      EndSelect
    Until Event = #PB_Event_CloseWindow
  EndIf
  
EndProcedure



; -----------------------------------------------------
; Clé générée avec le keygen du code précédent
NameKey$ = "18ff575513a42ae5ea7dad4cd8165c032dd837ff09f8197bd6ab9078b8a3baec" ;
;------------------------------------------------------

LicRead.s = ReadADS("NAMEKEY")

If LicRead =""
  WriteADS("NAMEKEY", NameKey$)
  LicRead = NameKey$
EndIf

If Len(LicRead) = 64 ; s'il ni a que le nom prenom
    N$ = InputRequester ("Licence","Entrez votre nom et prénom (ex : marc dumoulin)","")
    
    N$  = Trim(UCase(N$))
    N$ = GenerateLic(N$)
    
    If N$ = LicRead.s
      DD$ = GenerateLic(ReturnHDDSerial("c"))
      Licence.s = N$+":"+DD$
      WriteADS("NAMEKEY", Licence.s)
      MessageRequester("Succés","Vous devez relancer le logiciel pour terminer l'activation"+Chr(10)+"Cle "+Licence.s ,#PB_MessageRequester_Info)
      End
    Else
      MessageRequester("Erreur","Vous devez entrer votre Nom et Prénom"+Chr(10)+"Ce programme va se terminer",#PB_MessageRequester_Error)
      End
    EndIf
    
  ElseIf Len(LicRead) > 64
    
    ; VerifDD
    DDcrypt.s = Mid(LicRead,FindString(LicRead,":")+1,Len(LicRead)-FindString(LicRead,":")+1 )
    ;   MessageRequester("test",DDcrypt.s + " = " +  ReturnHDDSerial("c"),#PB_MessageRequester_Ok)
    If DDcrypt.s =  GenerateLic(ReturnHDDSerial("c"))
      
      OW()
    Else
      MessageRequester("Attention","Ce logiciel est lié à un seul ordinateur",#PB_MessageRequester_Info)
      End
    EndIf
    
  EndIf
  
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre