2010-04-22 3 views
2

Est-il possible de déterminer si une clé de registre donnée est redirigée ou non? Mon problème est que je veux énumérer les clés de registre dans les vues de registre 32 bits et 64 bits d'une manière générique à partir d'une application 32 bits. Je pourrais simplement ouvrir chaque clé deux fois, d'abord avec KEY_WOW64_64KEY, puis avec KEY_WOW64_32KEY. Cependant, si la clé n'est pas redirigée, cela vous donne exactement la même clé et vous finissez par énumérer deux fois exactement le même contenu; C'est ce que j'essaie d'éviter.Comment déterminer si une clé de Registre est redirigée par WOW64?

J'ai trouvé quelques documentation dessus, mais il semble que le seul moyen est d'examiner la ruche et faire un tas de comparaisons de chaînes sur la clé. Une autre possibilité que j'ai pensée est d'essayer d'ouvrir Wow6432Node sur chaque sous-clé; si elle existe, la clé doit être redirigée. C'est à dire. si j'essaie d'ouvrir HKCU \ Software \ Microsoft \ Windows j'essaierais d'ouvrir les clés suivantes: HKCU \ Wow6432Node, HKCU \ Software \ Wow6432Node, HKCU \ Software \ Microsoft \ Wow6432Node et HKCU \ Software \ Microsoft \ Windows \ Wow6432Node. Malheureusement, la documentation semble impliquer qu'un enfant d'une clé redirigée n'est pas nécessairement redirigé de sorte que la route a également des problèmes.

Alors, quelles sont mes options ici?

Répondre

2

Votre objectif n'est pas clair. Pourquoi avez-vous besoin d'énumérer de manière générique les clés de registre dans les vues de registre 32 bits et 64 bits à partir d'une application 32 bits? Que voulez-vous faire avec les valeurs 64 bits dans votre application? Que feriez-vous s'il y a des valeurs différentes pour les clés x64 et x86? Cela ressemble à une idée étrange ou plutôt fausse.

Les clés sont redirigées pour une raison importante: pour ne pas rompre le comportement des applications x86. Par exemple: CLSID est utilisé par COM pour trouver une implémentation correcte pour une interface donnée. Entre autres, "correct" signifie qu'il peut être exécuté par un code appelant, c'est-à-dire qu'il doit être de la même plate-forme. C'est pourquoi il devrait y avoir différents ensembles d'entrées pour x64 et x86. Les raisons d'autres clés redirigées sont similaires. D'une manière générale, ces clés redirigées doivent être différentes pour les applications x86 et x64. Comme Raymond Chen a écrit, "On 64-bit Windows, 32-bit programs run in an emulation layer, and if you don't like that, then don't use the emulator" et je suis entièrement d'accord avec ses conseils. Donc, mon meilleur conseil si vous avez besoin de quelque chose comme ça, c'est de le faire à partir de l'application x64. Mais d'abord reconsidérer si vous en avez vraiment besoin.

EDIT: Il y a samDesired paramètre de RegOpenKeyEx que vous pourriez trouver utile. Jetez aussi un coup d'oeil à l'article MSDN "Accessing an Alternate Registry View".

+0

Idéalement, nous aimerions reconstruire le tout en tant que x64, mais c'est encore un chemin sur la route pour nous. En attendant, c'est une sorte de mesure provisoire. L'application est essentiellement un composant système d'informations/scanner. Par exemple, en vérifiant le registre pour voir ce qu'il y a dans les différentes clés d'exécution. Je sais que ces clés spécifiques sont redirigées, mais je voudrais une méthode générique pour le déterminer afin que je ne sois pas au courant. – Luke

+0

Comme je l'ai dit je crois que la bonne façon est de faire l'application x64, mais vous pourriez le faire d'une autre manière. Voir mon édition – SergGr

+0

Je sais déjà comment accéder aux différentes vues; le problème est qu'il n'y a aucun moyen de déterminer si une clé donnée a une autre vue. Tenter d'ouvrir une autre vue sur une clé qui n'en possède pas vous donnera la vue partagée. – Luke

1

Vous souffrez beaucoup, cela dépend de la version du système d'exploitation. La liste complète est available here.

Questions connexes