IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Modifier une dll depuis Windows 11 64 bits avec D6 !


Sujet :

Delphi

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut Modifier une dll depuis Windows 11 64 bits avec D6 !
    Bonjour à toutes et à tous,

    Depuis le Windows\système32 j'aimerai copier le fichier "imageres.dll" pour modifier le son de démarrage qui se trouve dans la ressource "5080 1033".

    Je copie bien le fichier dans le dossier de mon application, je le renomme, je dois le modifier au niveau son puis le recopier en lui rendant son nom dans le dossier protégé "C:\Windows\system32".

    Cela fonctionne sauf que le son ajouté n'est pas présent dans la ressource (aStream.SaveToFile(PChar(f)) .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    var
      aStream: TMemoryStream;
      FHandle : THandle;
      f : TFileStream;
      I : integer;
    begin
      chappli := ExtractFilePath(Application.ExeName);
    
      wd := Path[CSIDL_SYSTEM] ;
      S := 'SosDll' ;
    
      //fs := chappli + '\BackgroundDefault.jpg' ;
      fileSource := Wd + '\imageres.dll';
      fileDest := chappli +'\imageres_Sos.dll';
    
    
     BdWav.FileName := '';
     BdWav.initialdir := chappli ;
    
     BdWav.Filter := 'Fichier Audio (*.wav)|*.wav|' ;
    
       if not BdWav.Execute then exit else
      begin
       //f := BdWav.filename ; //l'erreur me semble ici
    
       aStream := TMemoryStream.Create;
    
        aStream.SaveToFile(PChar(f)) ;
       try
          ChangeFSRedirection(true);//!!!!!!!!!!!!
         { if FileExists(wd + '\imageres_Sos.dll') then
          deletefile(wd + '\imageres_Sos.dll'); }
    
          {Teste si le fichier existe, le renomme et recopie l'original}
          if FileExists(wd + '\imageres.dll') then begin
          CopyFile(PChar(fileSource), PChar(fileDest));
    
          Renamefile(chappli + '\imageres.dll', chappli + '\imageres_Sos.dll') ;
          end
          else
          showmessage('Ce fichier n''existe pas');
    
          {Récupère le Handle du fichier qui contient les ressources à modifier}
          FHandle := BeginUpdateResource(PAnsiChar(ExtractFilePath(chappli)+ResDLLName), False);// Edit1.Text .. pour moi
          if FHandle <=0 then
          begin
            ShowMessage(SysErrorMessage(GetLastError));
            Exit; // on sort mais le bloc "finally" est exécuté !!
          end;
    
           {préparation de la modification (rien n'est encore modifié à ce stade)}
        //for I := 1 to 13 do
        UpdateResource(FHandle, 'WAVE', MakeIntResource(5080), 1033,
              aStream.Memory, aStream.Size);
    
           {les données sont écrites ici}
          if not EndUpdateResource(FHandle, False) then
            ShowMessage(SysErrorMessage(GetLastError));
          ChangeFSRedirection(false);
    
        finally
    
          aStream.Free;
    
        end;
      end;
     end;
    Si quelqu'un avait une petite idée ou alors mieux que ce que j'ai imaginé, merci d'avance.

    Sinon avec les procédures habituelles décrites sur le net pour obtenir un son au démarrage depuis Windows 11 cela ne fonctionne pas.

    @+,

    cincap

  2. #2
    Membre émérite Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    juin 2013
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : Enseignement

    Informations forums :
    Inscription : juin 2013
    Messages : 1 427
    Points : 2 730
    Points
    2 730
    Par défaut
    //f := BdWav.filename ; //l'erreur me semble ici
    et si tu penses que c'est là, que penses-tu qui en est la cause ? quelle est la valeur de la variable ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    @ pprem, merci de ton message, la valeur de f = TFileStream.

    Avant j'utilisais ce code pour changer le logon qui était une photo donc un Bmp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
             BMP.Assign(image1.picture.bitmap);
     
             jpgbis.Assign(BMP);
             JPGbis.CompressionQuality  := 80; {75..85 : best ratio Size/Quality}
             JPGbis.ProgressiveEncoding := True; {True : good for web or slow computer}
             jpgbis.Savetostream(astream);
     
             aStream.SaveToFile(PChar(f)) ;
          end;
    Manuellement, je sais le copier dans mon dossier, le modifier et puis au redémarrage le copier dans le dossier Windows\system32, mais le modifier directement dans ce dossier, non car il est protégé normal.

    Merci d'avance,

    @+,

    cincap

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 791
    Points : 37 063
    Points
    37 063
    Billets dans le blog
    55
    Par défaut
    //f := BdWav.filename ; //l'erreur me semble iciCela me semble logique comme erreur puisque F est un TFileStream et que bdWav.FileName n'est qu'un string (bdWav semblant être un TOpendialog)

    F:=TFileStream.Create(BdWav.filename,fmOpenRead) me semble plus correct mais ce qui suit cette instruction je n'arrive pas à en saisir le sens. Cela étant je ne suis pas dans un bon jour
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    @ SergioMaster, merci de ta réaction, avec une photo je ne dois rien changer au code cité et pour la partie que tu ne comprends pas :

    mais ce qui suit cette instruction je n'arrive pas à en saisir le sens.
    Après avoir chargé le fichier .wav, je dois modifier la ressource qui se présente comme ceci :

    Nom : imageres.jpg
Affichages : 82
Taille : 9,4 Ko

    Et c'est à cet endroit que le son de démarrage est sauvé et peut même être lu.

    Puis avec cette dll modifiée je dois la remettre dans le dossier Windows\system32.

    Manuellement tout fonctionne !

    Cela équivaut au logiciel "StartupSoundChanger1.0" mais comme il est Russe et gratuit je me méfie.

    Voila voilou,

    @+,

    cincap

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    13 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 13 791
    Points : 37 063
    Points
    37 063
    Billets dans le blog
    55
    Par défaut
    ce n'est pas l'objectif mais cette suite d'instructions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       if not BdWav.Execute then exit else // pourquoi un else alors qu'un exit sort , un ; suffit
      begin // devient inutile
       //f := BdWav.filename ; //l'erreur me semble ici
    //   si on charge f avec un TFileStreamCreate(f,fmRead) 
       aStream := TMemoryStream.Create;
    
        aStream.SaveToFile(PChar(f)) ; // on ne va pas le sauvegarder non, il y a un pb sur le nom je pense  
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) ,D11 (Alexandria)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    8 489
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 8 489
    Points : 27 480
    Points
    27 480
    Par défaut
    question bête mais...ça fonctionne d'utiliser une appli Win32 pour modifier les ressources d'une DLL 64bits ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    @ Paul TOTH, merci de ton message, en fait dans le dossier de Windows\system32 si tu ouvre la dll (imageres.dll) avec Reshacker ou autres tu ne vois pas la ressource "Wave 5080 1033" forcément puisque elle est en 64bits mais si tu copies cette même dll (imageres.dll) dans un autre dossier et que tu l'ouvres avec Reshacker, tu vois la ressource 'WAVE 5080 1033" et tu peus la modifier par un autre fichier .wav.

    Mais comme elle est utilisée par le system tu ne sais la recopier dans le dossier adéquat qu'au prochain démarrage ce que je fais avec un fichier .bat pour le moment.

    @+,

    cincap

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 599
    Points : 22 449
    Points
    22 449
    Par défaut
    Donc modifier C:\Windows\Media comme dans ton précédent sujet était bloquant, pouvoir hacker une DLL et la remplacer avec tous les risques d'injection de code malveillant possible, tu penses cela plus réalisable ???

    Fait plus simple, désactive le son de Windows
    Ajoute un mini exe Delphi qui fait un PlaySound dans 'C:\Users\TonCompte\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup' ou 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup'.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 599
    Points : 22 449
    Points
    22 449
    Par défaut
    Et je devine le son au Shutdown

    Un script powershell avec les options qui vont bien :
    - HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Group Policy\Scripts\Shutdown\0
    - C:\Windows\System32\GroupPolicy\Machine\Scripts\

    il faut coder l'installation du script comme le fait GPEdit, tout est base de registre et dans un fichier ini

    Citation Envoyé par C:\Windows\System32\GroupPolicy\Machine\Scripts\scripts.ini

    Code ini : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [Shutdown]
    0CmdLine=C:\DEV\xxxx\www\bin_d64\MonScript.exe
    0Parameters=
    Nom : Sans titre.png
Affichages : 68
Taille : 361,0 Ko
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    @ ShaiLeTroll, bonsoir et merci de ta suggestion que j'avais déjà explorée (pas la suite du message).

    Cette suggestion fait entendre un son que le logon est déjà présent et attend ton mot de passe.

    Avec la Dll modifiée uniquement pour le son donc pas de crainte au niveau virus etc.. cela fonctionne dès le démarrage de Windows et avant la photo du logon.

    Je suis arrivé à un bon résultat en modifiant directement la dll et en injectant le nouveau son.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    procedure TForm1.BouvrirClick(Sender: TObject);
    var
      aStream: TMemoryStream;
      FHandle : THandle;
      f : TFileStream;
      I : integer;
    begin
      chappli := ExtractFilePath(Application.ExeName);
     
      wd := Path[CSIDL_SYSTEM] ;
     
      fileSource := Wd + '\imageres.dll';
      fileDest := chappli +'\imageres.dll';
     
     
     BdWav.FileName := '';
     BdWav.initialdir := chappli ;
     
     BdWav.Filter := 'Fichier Audio (*.wav)|*.wav|' ;
     
      try
     
     //Je garde exit sinon une erreur !
     
      if not BdWav.Execute then exit else
     
       Edit1.Text := '';
     
       aStream := TMemoryStream.Create;
     
       edit1.Text := BdWav.FileName;
     
       W1.Wave.loadfromfile(edit1.text);  //extractfilename(op1.FileName);
     
       W1.wave.Savetostream(astream); //Pour le tester
     
       F:=TFileStream.Create(BdWav.filename,fmOpenRead);
     
       ChangeFSRedirection(true);//!!!!!!!!!!!!
     
          {Teste si le fichier existe, le renomme et recopie l'original}
         if not FileExists(chappli + 'imageres.dll') then begin
          CopyFile(PChar(fileSource), PChar(fileDest))
           end
             else
          showmessage('Ce fichier n''existe pas');
     
          {Récupère le Handle du fichier qui contient les ressources à modifier}
          FHandle := BeginUpdateResource(PAnsiChar(ExtractFilePath(chappli)+ResDLLName), False);
          if FHandle <=0 then
          begin
            ShowMessage(SysErrorMessage(GetLastError));
            Exit; // on sort mais le bloc "finally" est exécuté !!
          end;
     
           {préparation de la modification (rien n'est encore modifié à ce stade)}
     
        UpdateResource(FHandle, 'WAVE', MakeIntResource(5080), 1033,
              aStream.Memory, aStream.Size);
     
           {les données sont écrites ici}
     
          if not EndUpdateResource(FHandle, False) then
            ShowMessage(SysErrorMessage(GetLastError));
          ChangeFSRedirection(false);
     
        finally
     
         aStream.Free;
         F.free;
        end;
      end;
    Reste à trouver pour l'injecter directement dans le dossier Windows\system32 dans la même session sinon au démarrage c'est ok.

    @+,

    cincap

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    12 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 12 599
    Points : 22 449
    Points
    22 449
    Par défaut
    imageres.dll c'est vrai que c'est les ressources standards, pas de code mais qu'un programme puisse modifier une DLL dans windows, j'espère qu'il faut les droits administateurs ... et puis chez tes clients, les Anti-Virus, on va voir ce qu'ils en pensent
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    @ ShaiLeTroll, pas de crainte et à mon âge pas de client c'est uniquement pour que mon esprit soit dévié des soins que je subit depuis 8 ans pour un cancer.

    Dans ce dossier Windows\System32 tu n'as pas le droit sauf de copier la dll et de la sauver dans un autre dossier par exemple celui de l'application.

    Dans ce nouveau dossier avec le code transmis, je sais choisir un son et l'injecter dans la dll copiée.

    Reste à la remettre dans le dossier initial au démarrage car je n'ai pas trouvé comment le faire dans la même session même avec un kill.

    Je continue à chercher naturellement sinon, la dll modifiée fonctionne correctement.

    @+,

    cincap

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    Bonjour à toutes et à tous,

    En testant plusieurs possibilités, j'ai constaté que dans le dossier protégé de Windows\System32, on pouvait copier, renommer le fichier "imageres.dll" mais pas le supprimer.

    Partant de la, je copie cette dll dans le dossier de l'application tout en la renommant dans le dossier initial "imageres.dll.bak".

    Il me reste depuis le dossier de l'application modifier la ressource qui contient le son (5080, 1033) et de la recopier dans son dossier initial puisque celle qui figure ne porte pas le même nom (renommée).

    La modification est instantanée depuis la même session.

    Maintenant je cherche à lire ce fichier son depuis la ressource car pour le moment je le lis depuis un conteneur "W1.wave", si quelqu'un avait une idée ?

    Pour Windows 11 la dll "imageres.dll" est minime elle ne contient que 3 éléments, le son (5080) et le langage (1033).

    J'ai mis un son de démarrage de la Ferrari.

    Je peus fermer ce topic.

    @+,

    cincap

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    2 282
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2006
    Messages : 2 282
    Points : 1 269
    Points
    1 269
    Par défaut
    Bonjour à toutes et à tous,

    Voici la commande pour charger un fichier .wav de la ressource dans le composant "TLMDWavComp" soit w1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    W1.Wave.LoadFromStream(F);
    Tout fonctionne suivant le code décrit dans ce topic avec un Manifest.

    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/01/2011, 09h14
  2. Evenement au déchargement d'une dll par windows
    Par peijnoob dans le forum Windows
    Réponses: 3
    Dernier message: 22/06/2007, 09h54
  3. Modifier une dll ecrite en VB6 !
    Par Seb.26 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 30/05/2007, 17h13
  4. Communiquer avec une DLL depuis un driver .SYS
    Par barthelv dans le forum Windows
    Réponses: 17
    Dernier message: 03/04/2006, 10h43
  5. Réponses: 5
    Dernier message: 08/09/2005, 20h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo