luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
22 sept. 2007 à 10:48
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
23 sept. 2007 à 14:27
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 23 sept. 2007 à 14:27
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:
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.
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.