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

 C++ Discussion :

Savoir si une dll est 32 ou 64 bits


Sujet :

C++

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut Savoir si une dll est 32 ou 64 bits
    Bonjour,

    Je charge dynamiquement des fonctions dans mon code à partir d'une dll. Seulement, je develope 2 versions du code et de la dll, en 32 et 64bits. Sachant que c'est probablement systeme dépendant, comment puis-je à partir de mon code en C++ savoir si la dll que je charge est 32 ou 64 bits. C.a.d si elle correspond bien à la version du code en question. En gros y a t-il des fonction API windows et linux me permettant de savoir ca.

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Un processus x bits ne peut tout simplement pas charger une DLL qui n'est pas x bits .

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Oui je le sais, ma question etait comment par code determiner cette incompatibilité.

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Tu veux en fait examiner un fichier sur le disque, avant de le charger alors ? Il n'y a pas d'API pour faire cela, il faut aller soi-même chercher l'info dans les en-têtes du fichier, à savoir le champ Machine de l'en-tête IMAGE_FILE_HEADER dans notre cas. Pareil dans le cas où la DLL est en mémoire, sachant que le HMODULE d'une DLL n'est rien d'autre qu'un pointeur vers elle-même.

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ben en cherchant un encore un peu j'ai résolu le probléme sous linux avec le bout de code ci-dessous. Je n'ai pas encore trouvé l'équivalent sous windows, mais on doit pouvoir faire un équivalent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void *DLLHandle = dlopen (my_lib.so,RTLD_LAZY);
    if (DLLHandle==NULL) {
       char *dler=dlerror();
       if (dler!=NULL) {
          if (strstr(dler,"ELFCLASS32")!=NULL || strstr(dler,"ELFCLASS64")!=NULL) mess_error="Incompatible 32bits library for 64bits executable code or vis versa");
       }
    }
    Ca fonctionne bien, quand je charge une dll 32 bits de mon exe 64bits ou vis versa.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Tu pourrais envisager de prévoir un défine en fonction du type de compilation utilisé sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef __WIN32_   //pas sur du tout que cela suffise :-P
    #define BITVERSION 32
    #else
    #define BITVERSION 64
    #endif
     
    /* DLL_API */ const int bitVersion = BITVERSION
    Il te suffurait alors, au moment où tu utilise la dll, de vérifier la valeur de bitVersion...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Oui, mais je fais comment pour obtenir ce bitversion de ma dll si je peux pas l'ouvrir ?

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Tu peux peut être regarder dans les sources de PatchVer.

    Dedans, j'ouvre le binaire à patcher et j'analyse si c'est un 32 bits ou 64 bits pour réagir en conséquence.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ok merci, je vais regarder ca en détail

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Tout se passe dans le fichier PeCoff.cpp avec les fonctions _open(), _get_dos_header(), _check_nt_header32() et _check_nt_header64() (sans oublier bien sûr _close()).

    Bon courage !!
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Oui, mais je fais comment pour obtenir ce bitversion de ma dll si je peux pas l'ouvrir ?
    Je viens de faire un test (sous XP).

    LoadLibrary pète une popup dégueulasse style : "ta dll n'est pas une image valide de Windows."
    GetLastError retourne : 193 : is not a valid Win32 application.

    Reste à savoir si on peut analyser le binaire d'une DLL (fopen ?) pour connaître son architecture.
    VS_VERSIONINFO doit bien être qq part dans le binaire !! C'est peut-etre ce que fait le code ram-0000, je crois (en regardant très vite)

  12. #12
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Reste à savoir si on peut analyser le binaire d'une DLL (fopen ?) pour connaître son architecture.
    Bien sûr qu'on peut. J'ai écrit un message à ce sujet entre autres plus haut.

  13. #13
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par Melem Voir le message
    Bien sûr qu'on peut. J'ai écrit un message à ce sujet entre autres plus haut.
    Ah oui !!!
    Ca marche super bien ton truc (je viens de faire un petit test)

    uriotcea ne l'a pas utilisé peut-être parce qu'il est sous 98.

  14. #14
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Non, je ne suis pas sous 98, mais je n'ai pas vraiment saisi de quel truc tu parlais au juste!

  15. #15
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Je parlais de lire directement dans les en-têtes du fichier. Par exemple :
    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
    #include <iostream>
    #include <fstream>
    #include <windows.h>
     
    using namespace std;
     
    int main()
    {
        IMAGE_DOS_HEADER image_dos_header;
        IMAGE_FILE_HEADER image_file_header;
     
        ifstream file("uriotcea.dll", ios_base::in | ios_base::binary);
        file.read(PCHAR(&image_dos_header), sizeof(image_dos_header));
     
        // A ce stade on a lu l'en-tête MS-DOS du fichier.
        // Le champ image_dos_header.e_lfanew pointe vers le début des en-têtes NT (IMAGE_NT_HEADERS).
        // L'en-tête qui nous intéresse ici est l'en-tête de fichier (IMAGE_FILE_HEADER).
        // Le champ Machine de cet en-tête permet de savoir si le fichier est un 32 ou un 64 bits.
     
        file.seekg(image_dos_header.e_lfanew + 4, ios_base::beg);
        file.read(PCHAR(&image_file_header), sizeof(image_file_header));
     
        if (image_file_header.Machine == IMAGE_FILE_MACHINE_I386)
            cout << "Machine : x86 32 bits" << endl;
        else if (image_file_header.Machine == IMAGE_FILE_MACHINE_AMD64)
            cout << "Machine : x86 64 bits" << endl;
        else if (image_file_header.Machine == IMAGE_FILE_MACHINE_IA64)
            cout << "Machine : IA64" << endl;
        else
            cout << "Mauvais format de fichier." << endl;
     
        file.close();
     
        return 0;
    }
    Je rappelle aussi que le HMODULE d'une DLL n'est rien d'autre qu'un pointeur vers l'en-tête MS-DOS de l'image du fichier en mémoire donc il n'y a pas grand-chose à changer pour faire que ça fonctionne avec un fichier déjà chargé. Dernier truc qui pourrait peut-être aussi servir un jour, tout ceci s'applique à tous les fichiers au format PE, c'est-à-dire .exe, .dll, .sys, .cpl, .scr etc. et non uniquement aux exe et aux dlls.

  16. #16
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Merci beaucoup pour ton code qui fonctionne parfaitement.

    Une question cependant, quel est la difference entre IMAGE_FILE_MACHINE_AMD64 et IMAGE_FILE_MACHINE_IA64

  17. #17
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par uriotcea Voir le message
    Merci beaucoup pour ton code qui fonctionne parfaitement.

    Une question cependant, quel est la difference entre IMAGE_FILE_MACHINE_AMD64 et IMAGE_FILE_MACHINE_IA64
    Sans parle de IMAGE_FILE, mais juste de la généralité sur AMD64 et IA64 :

    L'architecture du CPU :
    le premier est 32/64bit (CPU et OS): Core2 Duo ... (les CPU des PC bureautique) : tu peux exécuter les applis 32bit.
    l'autre est full 64bit : Itanium + une version bien spécifique de Windows

    Je crois ne pas raconter de connerie.

  18. #18
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par fregolo52
    le premier est 32/64bit
    C'est un processeur 64 bits. Seulement, il est compatible avec l'architecture x86 32 bits.

    Citation Envoyé par fregolo52
    l'autre est full 64bit : Itanium + une version bien spécifique de Windows
    Ca je n'ai pas compris. IA64 est tout simplement une autre architecture 64 bits, signée Intel, très différente de l'x86.

  19. #19
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Ok encore merci à tout le monde

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

Discussions similaires

  1. Savoir si une dll est chargé
    Par Invité dans le forum Débuter
    Réponses: 4
    Dernier message: 24/12/2013, 18h26
  2. Réponses: 2
    Dernier message: 25/02/2012, 00h33
  3. Comment savoir si une DLL est COM visible ?
    Par sokai dans le forum C#
    Réponses: 5
    Dernier message: 05/08/2011, 13h32
  4. Savoir sous quoi une DLL est appelée ?
    Par Lino Léum dans le forum Framework .NET
    Réponses: 2
    Dernier message: 24/06/2010, 21h45
  5. [VB6] [Impression] Savoir si une imprimante est installée
    Par Norm59ttp dans le forum Installation, Déploiement et Sécurité
    Réponses: 2
    Dernier message: 19/12/2002, 09h29

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