begin process at 2010 09 06 12:03:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > RÉCUPÉRER LES INFOS D'UNE DLL, EXE, ETC.

RÉCUPÉRER LES INFOS D'UNE DLL, EXE, ETC.


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Débutant Date de création :01/12/2003 Date de mise à jour :01/12/2003 09:36:12 Vu / téléchargé :9 301 / 540

Auteur : radada

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Il y a peu de temps, j'avais posé une question sur le forum sur comment récupérer les infos d'une dll, exe, etc. (copyright, internalName, etc.). N'ayant pas eu de réponse, j'ai cherché et trouvé la façon de le faire. C'est pas une méchante source, mais je pense qu'elle peut s'avérer utile à certains. Voila. C'est mon premier post (source) en cpp, et cela ne fait que 2 semaines que j'en fait (mais j'ai un peu de C et de VB avant ; ))). Voila. J'ai mis ça dans une dll, comme ça, cela peut éventuellement être utilisable direct. Pour les infos sur les != fonctions -> MSDN :D

Source

  • #define __BROWSEDLL__
  • // INCLUDE
  • #include "GetDllInfo.h"
  • #include <string.h>
  • extern "C" int APIENTRY DllMain
  • (
  • HINSTANCE p_hInstance ,
  • DWORD p_dwReason ,
  • LPVOID p_lpReserved
  • )
  • {
  • // (1) Cas ou la raison de l'appel à DllMain vaut :
  • switch( p_dwReason )
  • {
  • // (1.10) Appel a la dll.
  • case DLL_PROCESS_ATTACH :
  • break;
  • // (1.20) Liberation de la dll.
  • case DLL_PROCESS_DETACH :
  • break;
  • // (1.30) Autre cas.
  • default :
  • break;
  • }
  • // (2) Retourner OK.
  • return 1; // ok
  • }
  • // ne pas oublier de rajouter version.lib dans les liens des Settings du projet pour avoir les != fonctions qui vont bien ; )
  • DLLPREFIX BL_ERRORS GetDLLVersion
  • (
  • char* p_pcDllName,
  • VS_FIXEDFILEINFO* p_ptVerInfo,
  • BROWSEDATA* p_bdDataArray
  • )
  • {
  • // variables pour la version de la dll
  • BL_ERRORS l_ErrCode = BLE_NO_ERROR;
  • DWORD l_dwVerInfoSize; // Taille de la version.
  • DWORD l_dwVerHnd; // Non utilisé.
  • // (1) Vérifier si le buffer de réception a été alloué.
  • if (p_pcDllName!= NULL)
  • {
  • l_dwVerInfoSize = GetFileVersionInfoSize(p_pcDllName, &l_dwVerHnd);
  • if (l_dwVerInfoSize > 0)
  • {
  • unsigned char* l_pucVersionBlock ;
  • //Allocate memory space for version block
  • l_pucVersionBlock = new unsigned char [l_dwVerInfoSize];
  • if (l_pucVersionBlock != NULL)
  • {
  • if (GetFileVersionInfo(p_pcDllName, NULL, l_dwVerInfoSize, (LPVOID) l_pucVersionBlock) > 0 ) // on commence à récupérer les infos dans l_dwVerInfoSize. Si >0, c'est OK
  • {
  • VS_FIXEDFILEINFO *l_ptVerInfo ;
  • BOOL l_bRetCode ;
  • unsigned int l_uiVersionLen ;
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\", (LPVOID *)&l_ptVerInfo, &l_uiVersionLen); //on récupère encore des infos par VerQueryValue
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • else
  • {
  • memcpy (p_ptVerInfo, l_ptVerInfo, sizeof (VS_FIXEDFILEINFO ));
  • // et on copie toutes les infos sur la dll dans la structure
  • WORD *l_pwVerInfo ;
  • BOOL l_bRetCode ;
  • unsigned int l_uiVersionLen ;
  • //on récupère les infos de langues et de version (voir msdn sur VerQueryValue)
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\VarFileInfo\\Translation", (LPVOID *)&l_pwVerInfo, &l_uiVersionLen);
  • if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL)
  • {
  • char* l_pcDllInfos;
  • char l_cStartString[30];
  • char l_pulLangageRef[50];
  • // on concatène les infos langues sous forme de 2 chaines char en hexa
  • sprintf(l_cStartString, "\\StringFileInfo\\%04x%04x\\", l_pwVerInfo[0], l_pwVerInfo[1]);
  • // on commence par le nom de la compagnie
  • sprintf(l_pulLangageRef, "%sCompanyName", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acCompanyName, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on continue par la description du fichier
  • sprintf(l_pulLangageRef, "%sFileDescription", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acFileDescription, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on commence par la version du fichier
  • sprintf(l_pulLangageRef, "%sFileVersion", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acFileVersion, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on commence par le nom nom interne du produit
  • sprintf(l_pulLangageRef, "%sInternalName", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acInternalName, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on commence par le copyright
  • sprintf(l_pulLangageRef, "%sLegalCopyright", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acLegalCopyright, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on commence par le nom d'origine
  • sprintf(l_pulLangageRef, "%sOriginalFilename", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acOriginalFilename, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on commence par le nom de produit
  • sprintf(l_pulLangageRef, "%sProductName", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acProductName, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • // on termine par la version du produit
  • sprintf(l_pulLangageRef, "%sProductVersion", l_cStartString);
  • l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef, (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
  • strncpy(p_bdDataArray->m_acProductVersion, l_pcDllInfos, l_uiVersionLen);
  • if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
  • {
  • return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }
  • }//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) deuxieme niveau
  • else // si il ne trouve pas de langage set (ie, pas de champs renseignés pour cette dll
  • l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) premier niveau
  • }// end if GetFileVersionInfo
  • } // if l_puc
  • }// if l_dwVer
  • else
  • l_ErrCode = BLE_INVALIDE_DLL_VERSION;
  • }// if p_pcVersion
  • return l_ErrCode;
  • }
#define __BROWSEDLL__

//	INCLUDE
#include "GetDllInfo.h"
#include <string.h>

extern "C" int APIENTRY DllMain
(
    HINSTANCE p_hInstance  ,
    DWORD     p_dwReason   ,
    LPVOID    p_lpReserved
)
{
	// (1) Cas ou la raison de l'appel à DllMain vaut :
	switch( p_dwReason )
	{
		// (1.10) Appel a la dll.
		case DLL_PROCESS_ATTACH :
			break;
		// (1.20) Liberation de la dll.
		case DLL_PROCESS_DETACH :

			break;
		// (1.30) Autre cas. 
		default :
			break;
	}

	// (2) Retourner OK.
	return 1;   // ok
}

// ne pas oublier de rajouter version.lib dans les liens des Settings du projet pour avoir les != fonctions qui vont bien ; )
DLLPREFIX BL_ERRORS GetDLLVersion
( 
   char*             p_pcDllName,
   VS_FIXEDFILEINFO* p_ptVerInfo,
   BROWSEDATA*       p_bdDataArray
)
{
   // variables pour la version de la dll
   BL_ERRORS l_ErrCode = BLE_NO_ERROR;
   DWORD l_dwVerInfoSize;     // Taille de la version.
   DWORD l_dwVerHnd;          // Non utilisé.
   // (1) Vérifier si le buffer de réception a été alloué.
   if (p_pcDllName!= NULL)
   {
      l_dwVerInfoSize = GetFileVersionInfoSize(p_pcDllName, &l_dwVerHnd);
      if (l_dwVerInfoSize > 0)
      {
         unsigned char* l_pucVersionBlock ;

         //Allocate memory space for version block
         l_pucVersionBlock = new unsigned char [l_dwVerInfoSize];
         if (l_pucVersionBlock != NULL)
         {
            if (GetFileVersionInfo(p_pcDllName, NULL, l_dwVerInfoSize, (LPVOID) l_pucVersionBlock) > 0 ) // on commence à récupérer les infos dans l_dwVerInfoSize. Si >0, c'est OK
            {
               VS_FIXEDFILEINFO *l_ptVerInfo   ;
               BOOL             l_bRetCode     ;
               unsigned int     l_uiVersionLen ;
               
               l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\", (LPVOID *)&l_ptVerInfo, &l_uiVersionLen); //on récupère encore des infos par VerQueryValue
               if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
               {
                  return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
               }
               else
               {
                  memcpy (p_ptVerInfo, l_ptVerInfo, sizeof (VS_FIXEDFILEINFO ));
                  // et on copie toutes les infos sur la dll dans la structure
                  WORD             *l_pwVerInfo   ;
                  BOOL             l_bRetCode     ;
                  unsigned int     l_uiVersionLen ;
                  
                  //on récupère les infos de langues et de version (voir msdn sur VerQueryValue)
                  l_bRetCode = VerQueryValue (l_pucVersionBlock, "\\VarFileInfo\\Translation",  (LPVOID *)&l_pwVerInfo, &l_uiVersionLen);
                  if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL)
                  {
                     char* l_pcDllInfos;
                     char  l_cStartString[30];
                     char  l_pulLangageRef[50];

                     // on concatène les infos langues sous forme de 2 chaines char en hexa
                     sprintf(l_cStartString, "\\StringFileInfo\\%04x%04x\\", l_pwVerInfo[0], l_pwVerInfo[1]);
                
                     // on commence par le nom de la compagnie
                     sprintf(l_pulLangageRef, "%sCompanyName", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acCompanyName, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on continue par la description du fichier
                     sprintf(l_pulLangageRef, "%sFileDescription", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acFileDescription, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on commence par la version du fichier
                     sprintf(l_pulLangageRef, "%sFileVersion", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acFileVersion, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on commence par le nom nom interne du produit
                     sprintf(l_pulLangageRef, "%sInternalName", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acInternalName, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on commence par le copyright
                     sprintf(l_pulLangageRef, "%sLegalCopyright", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acLegalCopyright, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on commence par le nom d'origine
                     sprintf(l_pulLangageRef, "%sOriginalFilename", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acOriginalFilename, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on commence par le nom de produit
                     sprintf(l_pulLangageRef, "%sProductName", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acProductName, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                     // on termine par la version du produit
                     sprintf(l_pulLangageRef, "%sProductVersion", l_cStartString);
                     l_bRetCode = VerQueryValue (l_pucVersionBlock, l_pulLangageRef,  (LPVOID *)&l_pcDllInfos, &l_uiVersionLen);
                     strncpy(p_bdDataArray->m_acProductVersion, l_pcDllInfos, l_uiVersionLen);
                     if (!( l_bRetCode && (l_uiVersionLen > 0) && (l_ptVerInfo != NULL)))
                     {
                        return l_ErrCode = BLE_INVALIDE_DLL_VERSION;
                     }

                  }//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) deuxieme niveau

                  else // si il ne trouve pas de langage set (ie, pas de champs renseignés pour cette dll
                     l_ErrCode = BLE_INVALIDE_DLL_VERSION;
               }//end if (l_bRetCode && (l_uiVersionLen > 0) && l_ptVerInfo != NULL) premier niveau

            }// end if GetFileVersionInfo
         } // if l_puc
      }// if l_dwVer
      else
         l_ErrCode = BLE_INVALIDE_DLL_VERSION;
   }// if p_pcVersion

   return l_ErrCode;
}


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip LISTER LES USERS ET LES PERMISSIONS DES DOSSIERS PARTAGÉS D'...

 Sources de la même categorie

Source avec Zip GESTION DU PORT SÉRIE AVEC SURVEILLANCE DES PAQUETS POUR QT par samoura969
Source avec Zip Source avec une capture MYOS KERNEL : UN NOYAU EN C++ par SamyPesse
Source avec Zip Source avec une capture [C/WIN32/WMI]SAVOIR SI UNE CLASSE COM EST INSTALLÉE par rt15
Source avec Zip Source avec une capture [C/WIN32][DRIVER] DÉTECTION DE CRÉATION OU DE SUPPRESSION DE... par deck_bsd
Source avec Zip DÉTECTION DE LANCEMENT D'APPLICATION (WIN32, REGISTERSHELLHO... par buno

Commentaires et avis

Commentaire de neodante le 01/12/2003 17:02:59 administrateur CS

Juste pour info pour lier une librairie à partir du code et non de l'IDE :
#pragma comment(lib, "toto.lib")
@+

Commentaire de radada le 01/12/2003 17:18:45

OK, merci c bon à savoir ; ))

Commentaire de PunkDude424 le 25/02/2004 03:52:33

Comment on fait pour récupérer les info du dll ??? comment je fais pour executer le programme?

Commentaire de radada le 25/02/2004 20:57:18

Ben tu compile le code et tu le teste : )) Il doit y avoir tout ce qu'il faut dans le zip...

Commentaire de PunkDude424 le 25/02/2004 21:41:39

Ouais mais quand je compile sa me crée un dll et c'est tout, comment je fais pour l'exécuter et connaitre les fonction d'un DLL

Commentaire de radada le 26/02/2004 19:11:11

Ben tu utilise les fonctions qui sont dans le code que tu compile ma foi!!!!!
Tu utilise donc GetDLLVersion avec les paramêtres qui vont bien. N'oublie pas de bien faire tes include du .h et de bien déclarer tse objets VS_FIXEDFILEINFO et BROWSEDATA. Ensuite, tu laisse faire...

l_EndStatement=GetDLLVersion("C:\test.dll", ), &p_ptVersion, &p_DataArary);

avec p_ptVersion qui est un VS_FIXEDFILEINFO et p_DataArray qui est un  BROWSEDATA. Vala

Commentaire de PunkDude424 le 27/02/2004 20:07:53

merci, mais j'ai encore un problème, j'ai crée un nouveau projet dans lequel j'ai integré se projet et j'ai une erreur quand je le compile

Linking...
MainFrm.obj : error LNK2001: unresolved external symbol __imp__GetDLLVersion
Debug/DLL Import.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.


qu'est-ce que c'est ?

Commentaire de radada le 01/03/2004 18:52:51

Ben ce qu'il faut faire, c'est créer la dll et ensuite l'utiliser dans ton projet, soit en faisant un lien comme l'a indiqué néodante en début de discuss, soit en alant dans les settings du projet, au niveau library, et ajouter le chemin vesr cette dll. Ensuite, tu peux l'utiliser, mais n'oublie pas de mettre la dll avec si tu l'utilise par la suite... Je ne sais pas si je suis bien clair???? Dis moi sinon, je recommencerai + doucement ; )

Commentaire de militaire75 le 16/01/2005 05:45:00

Tres bien ! Ca compile, ca fonctionne ... C est pratique !!

Commentaire de deck_bsd le 04/07/2006 11:19:48

"C'est mon premier post (source) en cpp, et cela ne fait que 2 semaines que j'en fait (mais j'ai un peu de C et de VB avant ; )))."

C'est du C ça et non du C++ ;)

Commentaire de neodante le 04/07/2006 11:35:04 administrateur CS

Effectivement ... :s

Commentaire de radada le 08/08/2006 06:54:52

deck_bsd et neodante : juste pour l'info, qu'est-ce qui vous fait dire ça?
En fait c'est bien du cpp (utilisation des new et pas des maloc par exemple), mais pas besoin de construire de modèle objet simplement pour une méthode  non?
Donc si pouviez éclairer ma lanterne, merci ;)

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales