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 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    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...

  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.

  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 !!

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 379
    Points
    5 379
    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 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 379
    Points
    5 379
    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 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 379
    Points
    5 379
    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