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 :

Wow64EnableWow64FsRedirection pose problème avec XP.


Sujet :

C++

  1. #1
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut Wow64EnableWow64FsRedirection pose problème avec XP.
    Hello,

    Dans le développement de mon application sous Visual Studio Pro 2013, je rencontre un problème avec la fonction "Wow64EnableWow64FsRedirection"
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    La redirection sur les OS 64 Bits fonctionne parfaitement pour W7, W8 et W8.1, et n'il a aucun message d'erreur sur les stations 32 Bits.

    Par contre, un message d'erreur survient au lancement sur Windows XP Pro SP3 32 Bits :
    Le point d'entrée de procédure Wow64EnableWow64FsRedirection est introuvable dans la bibliothèque de liaison dynamique KERNEL32.dll.
    MSDN n'indique pas de problème particulier pour les systèmes XP !

    L'utilisation de la fonction est bien précédée d'un test d'OS 64 Bits avec
    Donc, normalement, cette fonction ne devrait pas être exécutée sur une station 32 bits.

    J'ai cherché mais je n'ai rien trouvé ! Alors si vous avez une piste pour surmonter ce problème , merci d'avance.

    A bientôt...

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Comme tu l'as expliqué, le message d'erreur survient au lancement de ton application, donc bien avant le test IsWow64().

    Le problème, c'est que la fonction Wow64EnableWow64FsRedirection() (en passant, quel nom horrible...) est documentée comme "Windows Vista minimum", ce qui signifie qu'elle n'est pas implémentée par Windows XP.
    Lorsque le système charge ton application, il vérifie que toutes les fonctions que ton programme utilise sont bien disponibles, mais il n'est pas assez intelligent pour dire "Oh mais celle là il ne s'en sert que lorsque cette condition passe à 1, alors c'est bon ...".

    Une solution que tu peux essayer, c'est de trouver cette fonction "dynamiquement", via un appel à GetProcAddress(), mais ça peut être délicat à faire et ça requiert quelques connaissances sur l'ABI et les pointeurs de fonctions.

  3. #3
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Hello phil,

    J'ai regardé du côté de GetProcAdress() et de l'exemple donné par MSDN
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Mais même en passant par cette fonction, le message d'erreur persiste au démarrage.

    Merci quand même pour la piste.

    A+

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça veut dire que tu as toujours la dépendance à la fonction quelque part dans ton code. Poste-le qu'on voie un peu...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 379
    Points
    20 379
    Par défaut
    salut c'est normal d'avoir une erreur au démarrage car lorsque tu effectues une compilation de l'exécutable,l'éditeur de lien( linker) construit une table de correspondance avec les API encapsulées dans kernel32.
    Bref lors de la compilation dans le code généré en assembleur, le compilateur doit écrit un CALL adresse de Wow64EnableWow64FsRedirection selon un certain offset dans kernel32.dll.
    Donc je pense que la solution c'est de fournir une dll qui appelle ces fonctions 64bits pour les clients 64bits et une autre 32bits
    Si tu détectes que l'OS est en 64bits tu appelles la version 64bits sinon 32bits parce que je ne vois pas autrement
    Ou alors effectuée une compilation conditionnelle avec des directives préprocesseurs comme #ifdef _64bits mais je ne pense pas que cela corrige le problème.

  6. #6
    Membre régulier Avatar de Nicolas Coolman
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 76
    Points
    76
    Par défaut
    Hello,


    Je tiens à vous remercier pour m'avoir aider dans mes recherches.

    L'idée de passer deux DLL ne me satisfaisait pas car je ne souhaites pas faire d'installation logicielle.

    Je me suis donc orienté vers la solution des directives de compilation qui me semblait plus appropiée à ce que je voulais obtenir.

    La solution était bien celle-là :
    il faut créer des fonctions de désactivation et de réactivation de redirection en directives de compilation.

    A bientôt...

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Nicolas Coolman Voir le message
    Hello,


    Je tiens à vous remercier pour m'avoir aider dans mes recherches.

    L'idée de passer deux DLL ne me satisfaisait pas car je ne souhaites pas faire d'installation logicielle.

    Je me suis donc orienté vers la solution des directives de compilation qui me semblait plus appropiée à ce que je voulais obtenir.

    La solution était bien celle-là :
    il faut créer des fonctions de désactivation et de réactivation de redirection en directives de compilation.

    A bientôt...
    J'aurais dit que la solution était plutôt de faire quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (IsWow64()) {
       HANDLE h = LoadLibrary("kernel32.dll");
       if (h) {
           void *p = GetProcAddress("LeNomDeFonctionHorribleWoW64");
           if (p) {
              typedef RET (*LeTypeDeLaFonctionAvecUnNomHorribleWoW64)(ARGS...);
              LeTypeDeLaFonctionAvecUnNomHorribleWoW64 pfn = (LeTypeDeLaFonctionAvecUnNomHorribleWoW64)p;
              pfn(args...);
           }
       }
    }
    Mais en plus intelligent - en encapsulant ça dans un objet correspondant par exemple.

    Le but est d'avoir un executable a maintenir, pas plusieurs
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. [AC-2007] Requête avec sous requête qui pose problème
    Par redoran dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 13/04/2014, 16h46
  2. Réponses: 27
    Dernier message: 13/02/2013, 14h53
  3. Réponses: 18
    Dernier message: 12/04/2007, 12h46
  4. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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