Variables d'environnements [Résolu]

Signaler
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
Bonjour,

Je cherche un moyen de récupérer la valeur des variables d'environnement d'un autre processus. Il y a bien les fonctions getenv et putenv, mais elle ne permettent d'accéder à l'environnement du processus courant.

Quelqu'un sait-il comment faire ?

5 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
OpenProcess
NtQueryInformationProcess
ReadProcessMemory
CloseHandle

ciao...
BruNews, MVP VC++
Messages postés
317
Date d'inscription
vendredi 25 mai 2007
Statut
Membre
Dernière intervention
19 octobre 2007

Bonjour,

je vois pas pourquoi elle permettrait pas d'accéder à l'environnement du processus courant..?

Une autruche ne se cuit pas aux petits lardons
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Je veux accéder à l'environnement d'un autre processus, pas le processus courant.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Impeccable, merci, ca m'a permis de trouver un site qui détails tout ca:
http://www.codeproject.com/useritems/GetNtProcessInfo.asp
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
En fait, ce site en lui meme ne répond pas entièrement a mon problème. Mais ca m'a permis de trouver les infos nécessaires manquantes. Donc je résume rapidement les différentes étapes pour récupérer les variables d'environnement (entre autres) d'un processus quelconque. Je n'ai pas encore testé ces étapes, mais ce sont les infos que j'ai regroupé de différents sites:

http://www.codeproject.com/useritems/GetNtProcessInfo.asp
http://forum.sysinternals.com/forum_posts.asp?TID= 7640
http://www.codeguru.com/forum/archive/index.php/t-270030.html

1) On récupère cette structure a partir de la fonction NtQueryInformationProcess:typedef struct _smPROCESS_BASIC_INFORMATION {
LONG ExitStatus;
smPPEB PebBaseAddress;
ULONG_PTR AffinityMask;
LONG BasePriority;
ULONG_PTR UniqueProcessId;
ULONG_PTR InheritedFromUniqueProcessId;
} smPROCESS_BASIC_INFORMATION, *smPPROCESS_BASIC_INFORMATION;
(http://www.codeproject.com/useritems/GetNtProcessInfo.asp)

2) Cette structure possède un membre PebBaseAddress, que l'on va utiliser pour récupérer la structure PEB avec la fonction ReadProcessMemory :
ypedef struct _smPEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
smPPEB_LDR_DATA Ldr;
smPRTL_USER_PROCESS_PARAMETERS ProcessParameters;
BYTE Reserved4[104];
PVOID Reserved5[52];
smPPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved6[128];
PVOID Reserved7[1];
ULONG SessionId;
} smPEB, *smPPEB;
(http://www.codeproject.com/useritems/GetNtProcessInfo.asp)

3) Cette structure (PEB) possède un pointeur (ProcessParameters) sur la structure PROCESS_PARAMETERS.
Cette cette structure qui contient notamment les variables d'environnements du processus.

typedef struct _smRTL_USER_PROCESS_PARAMETERS {
BYTE Reserved1[16];
PVOID Reserved2[10];
UNICODE_STRING ImagePathName;
UNICODE_STRING CommandLine;
} smRTL_USER_PROCESS_PARAMETERS, *smPRTL_USER_PROCESS_PARAMETERS;
(http://www.codeproject.com/useritems/GetNtProcessInfo.asp)

Ce lien fournit la structure précédente, mais elle n'est pas complète. J'ai également trouvé cette
info sur le net:
"Let me assume you are using an NT system (Windows 4NT / 2000 / XP). On
these systems, each process has a PROCESS_PARAMETERS structure, which
has a pointer found at offset 0x48 into the structure. That pointer
points at the environment block for the process which holds the
environment variable strings."

0x48 est en fait la taille de la structure _smRTL_USER_PROCESS_PARAMETERS, donc les variables d'environnements se situent juste après le  dernier membre de cette structure. A cette adresse commence un tableau de WCHAR contenant  a priori les variables d'environnement sous la forme "VAR_1=VALUE1 \0 ...\0VAR_N =VALUEN\0\0" (en WCHAR).
Ce site: http://forum.sysinternals.com/forum_posts.asp?TID=7640 parle en effet d'un membre "Environnement" situé à l'offset 0x48 du début de cette structure.

Ce meme lien permet de comprendre la structure et de calculer la taille du tableau contenant les variables d'environnement.
Une fois que l'on a calculer la taille du buffer contenant toutes les variables d'environnement, on peut récupérer le buffer entier avec la fonction ReadProcessMemory.

Bon j'espère ne pas avoir fait trop d'erreur, mais ca devrait fournir des infos utiles à ceux qui seraient confrontés au meme problème.