2010-01-18 8 views
0

J'ai récemment trouvé un problème intéressant. Lorsque vous utilisez SetEnvironmentVariable, je peux utiliser Process Explorer pour obtenir la variable d'environnement nouvellement créée. Toutefois, lorsque le processus lui-même est de 32 bits et le système d'exploitation de 64 bits, Process Explorer (au moins v10 ~ la dernière v11.33) ne peut pas trouver les nouvelles variables. Si le programme est natif 64 bits alors tout fonctionne bien, tout comme le processus 32 bits fonctionnant sur un système d'exploitation 32 bits.SetEnvironmentVariable en 32 bits Processus sur OS Windows 64 bits

L'appel de l'API SetEnvironmentVariable doit aboutir, car la valeur de retour est TRUE et l'appel GetEnvironmentVariable renvoie la valeur correcte. De plus, si vous créez un processus fils, vous pouvez trouver que la variable a été correctement définie dans le nouveau processus en utilisant Process Explorer.

Je ne suis pas si c'est la limitation de SysWOW64 ou un bogue dans Process Explorer. Quelqu'un sait?

Et, est-il possible d'obtenir correctement les variables d'environnement 32 bits? (Par exemple, la force Process Explorer pour fonctionner en mode 32 bits, ou d'autres outils)

source d'échantillon pour reproduire:

#include <stdio.h> 
#include <windows.h> 

int main(int argc, char *argv[]) 
{ 
    printf("setting variable... %s\n", 
     SetEnvironmentVariable("a_new_var", "1.0") ? "OK" : "FAILED"); 
    printf("press anykey to continue...\n"); 
    getchar(); 
    // system(argv[0]); // uncomment to inspect the child process 
    return 0; 
} 

Répondre

1

Je ne sais pas comment fonctionne WOW64, mais je suis assez (99%) que deux PEB (Process Environment Blocks) sont créés - un 32 bits et un 64 bits. Les structures de paramètres de processus (RTL_USER_PROCESS_PARAMETERS) sont probablement également dupliquées. Ainsi, lorsque vous appelez SetEnvironmentVariable, il modifie uniquement le bloc d'environnement 32 bits. PE s'exécute en tant que programme natif 64 bits, ce qui signifie qu'il ne connaît que le PEB 64 bits et le bloc d'environnement 64 bits (qui n'a pas changé).

Mise à jour (2010-07-10):

Juste quelques nouvelles informations sur ce vieux sujet: Vous pouvez trouver le PASE 32 bits en appelant NtQueryInformationProcess avec ProcessWow64Information. Il vous donne un PVOID avec l'adresse du PEB.

+0

Alors, est-il possible d'obtenir des résultats corrects? Je ne peux pas trouver l'API pour changer le bloc d'env. 64 bits dans le processus de 32 bits, ni aucun commutateur pour que le PE fonctionne en mode 32 bits ... – Francis

+0

Je ne pense pas. Si vous êtes désespéré, je peux vous recommander d'autres outils ... – wj32

Questions connexes