Aujourd'hui nous allons voir un classique du dev système:
**les processus**.
Beaucoup de gens utilisent des processus sans vraiment comprendre ce que c’est.
Ici on va voir **ce qu’est un processus**, comment Windows les gère, et comment les manipuler proprement en Win32.
---
## 1) C’est quoi un processus
Un **processus**, c’est un conteneur d’exécution.
Il contient :
* un espace mémoire virtuel
* un ou plusieurs threads
* des handles
* un contexte de sécurité
* des modules (EXE, DLL)
Un processus **n’exécute rien tout seul**.
Ce sont toujours ses threads qui exécutent le code.
Sans thread → le processus est mort.
---
## 2) Chaque processus est isolé
Chaque processus possède :
* son propre espace mémoire
* ses propres handles
* ses propres variables globales
Un processus ne peut pas :
* lire la mémoire d’un autre
* écrire dedans
* accéder à ses handles
Sauf si :
* le noyau l’autorise
* ou que tu utilises des mécanismes spécifiques (IPC, duplication de handle, etc.)
C’est la base de la stabilité et de la sécurité sous Windows.
---
## 3) Le processus courant
Pour récupérer le processus courant :
Code: Select all
HANDLE hProc = GetCurrentProcess();
DWORD pid = GetCurrentProcessId();
* le handle retourné par GetCurrentProcess est un pseudo-handle
* il ne doit pas être fermé avec CloseHandle
---
## 4) Créer un processus : CreateProcess
La fonction centrale, c’est **CreateProcess**.
Code: Select all
STARTUPINFOW si = {0};
PROCESS_INFORMATION pi = {0};
si.cb = sizeof(si);
BOOL ok = CreateProcessW(
L"C:\Windows\System32\notepad.exe",
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi
);
* un nouveau processus
* un thread principal
* et retourne :
* un handle de processus
* un handle de thread
---
### Important après CreateProcess
Code: Select all
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
* fuite de handles
* ressources jamais libérées
---
## 5) STARTUPINFO et PROCESS_INFORMATION
STARTUPINFO :
* options de démarrage
* redirection STDIN/STDOUT
* fenêtre, desktop, etc.
PROCESS_INFORMATION :
* handle du processus
* handle du thread principal
* PID
* TID
C’est ta porte d’entrée vers le nouveau process.
---
## 6) Processus parent / enfant
Sous Windows :
* un processus peut créer un autre processus
* mais il n’y a pas de hiérarchie forte comme sous Linux
Le parent :
* n’a pas de contrôle automatique
* n’est pas notifié par défaut à la fin de l’enfant
Tout est explicite.
---
## 7) Attendre un processus
Pour attendre la fin d’un processus :
Code: Select all
WaitForSingleObject(pi.hProcess, INFINITE);
Code: Select all
DWORD exitCode;
GetExitCodeProcess(pi.hProcess, &exitCode);
## 8) Ouvrir un processus existant
Tu peux ouvrir un processus existant avec **OpenProcess**.
Code: Select all
HANDLE hProc = OpenProcess(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
pid
);
* trop peu → accès refusé
* trop → refus aussi (sécurité)
---
## 9) Terminer un processus
Fonction brutale :
Code: Select all
TerminateProcess(hProc, 0);
* ne libère pas proprement
* pas de destructeurs
* pas de cleanup
* à utiliser en dernier recours
---
## 10) Les handles et l’héritage
Les processus possèdent des handles.
Par défaut :
* un enfant n’hérite de rien
Mais tu peux :
* rendre un handle héritable
* le transmettre à l’enfant
Via :
* SECURITY_ATTRIBUTES
* flag bInheritHandles dans CreateProcess
C’est très utilisé pour :
* pipes
* redirections
* IPC
---
## 11) Les modules d’un processus
Un processus charge :
* son EXE
* des DLL
Fonctions utiles :
* GetModuleHandle
* GetModuleFileName
* EnumProcessModules (via PSAPI)
Exemple :
Code: Select all
HMODULE hMod = GetModuleHandle(NULL);
## 12) Processus et sécurité
Chaque processus a :
* un token de sécurité
* un utilisateur
* des privilèges
Fonctions importantes :
* OpenProcessToken
* GetTokenInformation
* AdjustTokenPrivileges
C’est ce qui décide :
* ce que le process peut faire
* ce qu’il n’a pas le droit de faire
---
## 13) Erreurs classiques
* oublier CloseHandle
* confondre PID et handle
* utiliser TerminateProcess trop facilement
* ne pas vérifier les retours
* demander trop de droits avec OpenProcess
---
## À retenir
Un processus est un conteneur.
Les threads exécutent le code.
Chaque processus est isolé.
CreateProcess est la base.
Les handles doivent être fermés.
La sécurité passe par les tokens.
Comprendre les processus, c’est comprendre **comment Windows structure l’exécution des programmes**.
A la prochaine pour un nouveau tuto
