Aujourd’hui on va voir **un composant central de Windows** :
**le registre**.
Le registre est partout :
* configuration système
* services
* pilotes
* logiciels
* sécurité
Beaucoup de devs l’utilisent sans comprendre **ce que c’est réellement**.
Ici on va voir **ce qu’est le registre**, comment il fonctionne, et comment l’utiliser proprement en Win32.
---
# 1) C’est quoi le registre Windows
Le **registre Windows** est une **base de données hiérarchique**.
Il stocke :
* la configuration du système
* la configuration des logiciels
* les paramètres utilisateurs
Il remplace les anciens fichiers .ini.
---
# 2) Le registre n’est pas un fichier texte
Le registre :
* n’est PAS un fichier texte
* n’est PAS un XML
* n’est PAS un INI
C’est une base gérée par le noyau.
Chaque accès passe par des API.
---
# 3) Les ruches principales (hives)
Les racines principales sont :
* HKEY_LOCAL_MACHINE (HKLM)
* HKEY_CURRENT_USER (HKCU)
* HKEY_CLASSES_ROOT (HKCR)
* HKEY_USERS (HKU)
* HKEY_CURRENT_CONFIG (HKCC)
Ce sont des **handles spéciaux**.
---
# 4) Clés et valeurs
Le registre est composé de :
* **clés** (comme des dossiers)
* **valeurs** (comme des fichiers)
Une valeur possède :
* un nom
* un type
* des données
---
# 5) Types de valeurs importants
Les types courants :
* REG_SZ → chaîne Unicode
* REG_EXPAND_SZ → chaîne avec variables
* REG_DWORD → entier 32 bits
* REG_QWORD → entier 64 bits
* REG_BINARY → données brutes
---
# 6) Ouvrir une clé du registre
Pour ouvrir une clé existante :
Code: Select all
HKEY hKey = NULL;
RegOpenKeyExW(
HKEY_CURRENT_USER,
L"Software\MyApp",
0,
KEY_READ,
&hKey
);
---
# 7) Créer une clé
Pour créer une clé :
Code: Select all
RegCreateKeyExW(
HKEY_LOCAL_MACHINE,
L"Software\MyApp",
0,
NULL,
0,
KEY_WRITE,
NULL,
&hKey,
NULL
);
# 8) Lire une valeur
Pour lire une valeur :
Code: Select all
DWORD type = 0;
DWORD size = sizeof(DWORD);
DWORD data = 0;
RegQueryValueExW(
hKey,
L"Enabled",
NULL,
&type,
(LPBYTE)&data,
&size
);
# 9) Écrire une valeur
Pour écrire une valeur :
Code: Select all
DWORD data = 1;
RegSetValueExW(
hKey,
L"Enabled",
0,
REG_DWORD,
(const BYTE*)&data,
sizeof(data)
);
# 10) Supprimer clé ou valeur
Supprimer une valeur :
Code: Select all
RegDeleteValueW(hKey, L"Enabled");
Code: Select all
RegDeleteKeyW(HKEY_CURRENT_USER, L"Software\MyApp");
# 11) Droits d’accès au registre
Le registre est protégé par des ACL.
Exemples de droits :
* KEY_READ
* KEY_WRITE
* KEY_ALL_ACCESS
Sans les droits :
* accès refusé
---
# 12) Registre et sécurité
Le registre est lié :
* aux tokens
* aux privilèges
* à l’UAC
Écrire dans HKLM nécessite souvent :
* des droits administrateur
---
# 13) Registre et services
Les services sont configurés dans :
* HKLM\SYSTEM\CurrentControlSet\Services
Le SCM lit directement le registre.
---
# 14) Fermer une clé
Chaque clé ouverte doit être fermée :
Code: Select all
RegCloseKey(hKey);
* fuite de handle
* fuite noyau
---
# 15) Erreurs classiques
* oublier RegCloseKey
* écrire dans HKLM sans droits
* mal gérer la taille des buffers
* utiliser ANSI
* modifier le registre système sans comprendre
---
# À retenir
Le registre est une base système.
Il est hiérarchique.
Chaque clé est un handle.
Les accès sont sécurisés.
Les services et Windows en dépendent.
Comprendre le registre, c’est comprendre **comment Windows stocke sa configuration**.
