Cours sur les processus en win32

Développement système natif en c/c++ avec win32 ...

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 19
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Cours sur les processus en win32

Post by Hydraxx »

## Les processus sous Windows

Aujourd'hui nous allons voir un classique du dev système: 8-)
**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();
Important :

* 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
);
CreateProcess crée :

* 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);
Si tu oublies :

* 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);
Récupérer le code de retour :

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
);
Les droits sont importants :

* trop peu → accès refusé
* trop → refus aussi (sécurité)

---

## 9) Terminer un processus

Fonction brutale :

Code: Select all

TerminateProcess(hProc, 0);
À savoir :

* 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 :D

Who is online

Users browsing this forum: No registered users and 1 guest