# Les systèmes d'exploitation/La base de registre de Windows

Vous avez peut-être entendu parler de la fameuse base de registre de Windows, sans trop savoir ce que c'est ni à quoi cela peut bien servir. Beaucoup de sites web racontent n'importe quoi à son propos et la plupart préconisent des manipulations inutiles, voire dangereuses, de celle-ci. Certaines manipulations du registre permettraient ainsi de gagner en performance, de débloquer des fonctionnalités cachées, ou de résoudre divers problèmes techniques (spoiler : non). Nettoyer celle-ci permettrait de gagner en performance (spoiler : non plus), de même que la défragmenter.
Dans les grandes lignes, la base de registre est juste une base de données. Il s'agit d'un ensemble de fichiers, qui mémorise les options de configuration des logiciels ou du système d'exploitation. Elle y stocke les associations de fichier (quel programme permet d'ouvrir tel type de fichier), les paramètres configurables dans le panneau de configuration, les programmes lancés au démarrage, etc. Toutes les options du matériel, des pilotes de périphérique, du système d'exploitation, ou des différents programmes sont ainsi mémorisées dans le registre (à quelques exceptions près).

## Pourquoi une base de registre ?

On peut se demander pourquoi Windows utilise une base de registre relativement centralisée, contrairement à ce que font d'autres systèmes d'exploitation. Par exemple, les distributions Linux regroupent leurs fichiers de configuration dans un répertoire nommé /etc. Eh bien il faut savoir que Windows n'a pas toujours procédé ainsi. Les premières versions de Windows se passaient totalement de base de registre, celle-ci n'ayant été ajoutée qu'à partir de la version 3.1.

### Avant la base de registre

À l'époque du MS-DOS, seuls deux fichiers étaient utilisés en lieu et place de la base de registre :
* config.sys contenait des informations de configuration du DOS ;
* autoexec.bat démarrait une série de commandes au démarrage de l'OS.
Puis vinrent les premières versions de Windows. Avant Windows 3.1, Windows utilisait des fichiers .ini pour mémoriser les options de l'OS, d'un programme ou d'un pilote de périphérique. Ces fichiers étaient des fichiers textes, découpés en sections qui pouvaient contenir plusieurs déclarations de données. Chaque donnée était déclarée par un nom de variable, suivi par un signe égal, lui-même suivi par la valeur de la variable. Les noms des sections étaient indiqués entre crochets et tout ce qui suivait ce nom appartenait à la section.
Les programmes décidaient où placer leurs fichiers .ini sur le disque dur, le plus souvent dans le répertoire du pilote ou du programme. En faisant ainsi, chaque programme avait accès seulement à ses options de configuration et ne pouvait pas récupérer les options du système d'exploitation directement.
Seuls quelques fichiers étaient utilisés par le système d'exploitation :
* win.ini pour les paramètres de l'utilisateur ;
* system.ini pour tout ce qui a trait au matériel ;
* et reg.dat pour les associations de fichier.
Si vous regardez sur votre disque dur, vous verrez que les deux premiers fichiers existent toujours. Évidemment, ceux-ci ne contiennent pas le registre de Windows. Ils ne sont là que pour conserver la compatibilité avec les anciennes versions de Windows, au cas où vous tenteriez d'utiliser un programme conçu pour Windows 3.1 sur votre ordinateur. Une grande part du mode de compatibilité des programmes de Windows se base sur ce fichier.

### L'apparition de la base de registre

Sous Windows 3.1, la base de registre avait un rôle extrêmement limité comparé à celui qui prévaut de nos jours. Le registre de 3.1 servait uniquement pour les associations de fichiers. Il mémorisait que tel fichier s'ouvre avec tel programme. Ce n'est qu'avec les Windows suivants que le rôle de la base de registre s'est complexifié et qu'elle a commencé à mémoriser des informations de plus en plus disparates.
Si le registre a été inventé, c'est pour limiter le nombre de fichiers de configuration et organiser un petit peu les informations de configuration. Centraliser le tout dans une base de registre a clairement facilité la tâche des développeurs de logiciels, notamment pour la création des installeurs et désinstalleurs. Aujourd'hui, le registre n'utilise que quelques fichiers sur le disque dur qui sont appelés des ruches. On est bien loin de l'orgie de fichiers de configuration des premiers temps.

## Le contenu de la base de registre

Les informations sont mémorisées dans le registre sous la forme d'attributs auxquels on affecte un nom, une valeur et un type. Les types autorisés sont les suivants :
* des données binaires (REG_BINARY) ;
* des nombres entiers, (REG_DWORD pour les entiers 32 bits, REG_QWORD pour les 64 bits) ;
* des chaines de caractères (REG_SZ pour les chaines simples, REG_EXPAND_SZ pour les chaines qui contiennent des variables d'environnement et REG_MULTI_SZ pour des listes de chaines) ;
* des données non-typées (NONE) ;
* et un type spécifique au registre, que je ne détaillerai pas : REG_LINK.

### Les clés de registre

L'ensemble des attributs est mémorisé dans une arborescence qui ressemble beaucoup à celle d'un système de fichier. On peut voir le registre comme une sorte d'arborescence de répertoires qui contiennent soit des attributs, soit d'autres répertoires. Les clés de registres étant au registre ce que les répertoires sont aux systèmes de fichiers.
Certaines clés de registres sont partagées par tous les utilisateurs de l’ordinateur. Les différents comptes administrateurs, invités et utilisateur y ont donc accès. Mais certaines clés sont spécifiques à un utilisateur bien précis. Un utilisateur a notamment accès à ses clés HKEY_USERS, mais n'a pas accès aux clés de registres des autres utilisateurs. Pour cela, chaque clé de registre se voit attribuer une liste de contrôle d'accès. Cette liste mémorise, pour chaque clé, quels sont les utilisateurs qui peuvent y accéder et quels sont les droits de chaque utilisateur. Les droits prévus pour chaque clé sont les suivants :
* lire la clé ;
* modifier la clé ;
* supprimer la clé
* être prévenu des changements sur cette clé ;
* créer un lien vers cette clé (réservé au système d'exploitation) ;
* créer une sous-clé ;
* récupérer la liste des sous-clés ;
* modifier la liste des contrôles d'accès ;
* récupérer la liste des contrôles d'accès.
L'administrateur de l'ordinateur peut ainsi empêcher la modification de certaines clés de registre, afin d’éviter certaines manipulations dangereuses. Ce blocage des clés peut être fait poste par poste ou via des outils de gestion de parc informatique. L'administrateur peut ainsi établir une politique de groupe, à savoir faire en sorte que certains types de comptes n'aient pas certains droits ou ni puissent pas faire telle ou telle manipulation.

### Les clés primaires

Lorsqu’on ouvre le registre, on voit clairement qu'il existe cinq clés principales :
* HKEY_CLASSES_ROOT, qui contient les associations de fichiers ;
* HKEY_CURRENT_USER, qui contient les informations sur l'utilisateur (celui qui a ouvert la session) ;
* HKEY_LOCAL_MACHINE, qui contient les informations liées au matériel (pilotes notamment) ;
* HKEY_USERS, qui contient les paramètres de chaque utilisateur (tout ce qui est modifiable dans le panneau de configuration et même un peu plus) ;
* HKEY_CURRENT_CONFIG, qui contient les informations de la configuration matérielle.
En réalité, il existe deux clés primaires, les trois autres clés principales étant des sous-clés des deux autres. Ces deux clés primaires sont HKEY_LOCAL_MACHINE et HKEY_USERS. Ainsi, HKEY_CURRENT_USER est un alias qui pointe vers HKEY_USERS\Current_user. De même, HKEY_CURRENT_CONFIG est juste un lien vers la sous-clé HKEY_Local_Machine\System\ControllSet001\Hardware Profiles. Enfin, HKEY_CLASSES_ROOT est une sorte de fusion entre HKEY_LOCAL_MACHINE\Software\Classes et HKEY_CURRENT_USER\Software\Classes keys.

#### HKEY_LOCAL_MACHINE

La clé HKEY_LOCAL_MACHINE contient plusieurs sous-clés :
* HARDWARE ;
* SYSTEM ;
* SOFTWARE ;
* SECURITY ;
* SAM.
| Sous-clé | Description |
| HARDWARE | Cette clé est recréée à chaque démarrage et mémorise toutes les informations sur la configuration matérielle : processeur, quantité de RAM, périphériques installés et ainsi de suite. |
| SYSTEM | Elle contient les options des pilotes de périphériques et divers informations sur la RAM et les pilotes. |
| SOFTWARE | Elle contient toutes les informations de configuration des logiciels, leurs emplacements sur le disque dur, la position des installeur/désinstalleurs, etc. Elle est souvent structurée de manière à ce que chaque éditeur de logiciel ait sa propre sous-clé, sous-clé qui contient des clés pour chaque programme de l'éditeur installé sur l'ordinateur. Cette organisation en éditeur/programme n'est cependant pas toujours respectée. |
| SECURITY / SAM | Les deux mémorisent les informations des différents comptes utilisateurs : leur noms, leurs mots de passe, leurs options de sécurité, etc. C'est notamment dans cette clé que se situent tous les mots de passe du système. Mais des protections logicielles font que cette clé est inaccessible pour la plupart des utilisateurs (elles paraissent vides). |
Détaillons un petit peu les clés SECURITY et SAM. La SAM, ou Secure Account Manager, est la base de données des comptes utilisateurs, qui contient les noms et mots de passe des comptes. Avant Windows 2000, toute la gestion des comptes utilisateurs se basait sur cette SAM et divers outils permettraient de sécuriser et de gérer la SAM. Cette SAM est localisée dans le fichier Windows\system32\Config\SAM.
Il y a de cela quelques années, Windows ne chiffrait pas les mots de passe mémorisés dans ce fichier. Le fichier était cependant protégé et seuls les comptes administrateurs avec certains droits d'accès pouvaient y accéder. Mais, un attaquant pouvait quand même lire le contenu de ce fichier avec une petite ruse. Il lui suffisait de faire démarrer l'ordinateur sur une clé USB, un CD-ROM ou tout autre mémoire externe sur laquelle on a installé un système d'exploitation. Ainsi, l'attaquant pouvait lire le contenu du disque dur sous Linux, sans que les sécurités de Windows n'y change quoi que ce soit. Il pouvait donc lire le fichier et accéder aux comptes utilisateur comme bon lui semble.
Mais depuis Windows 2000, tous les mots de passe sont chiffrés et la gestion des mots de passe ne passe plus par la base de registre, mais par une technologie nommée Active Directory.

#### HKEY_USERS

La clé HKEY_USERS contient divers paramètres, généralement ceux modifiables dans le panneau de configuration :
* les paramètres d'apparence de Windows ;
* les réglages d'accessibilité ;
* les paramètres d'impression ;
* et bien d'autres encore.
On y trouve plusieurs clés : une par utilisateur de la machine, plus une clé DEFAULT qui contient les réglages par défaut. Chaque clé contient :
* AppEvents, pour les sons associés aux événements Windows ;
* Console, pour gérer la ligne de commande ;
* Control Panel, qui regroupe tous les paramètres réglables dans le panneau de configuration ;
* Identities pour les réglages d'Outlook Express/Windows Mail ;
* Keyboard pour les réglages du clavier ;
* Printers pour les réglages des imprimantes installées ;
* Session Information contient des informations sur la session Windows actuelle ;
* Software contient certains paramètres des logiciels installés.

#### HKEY_CLASSES_ROOT

Pour rappel, la clé HKEY_CLASSES_ROOT n'est qu'une sorte de fusion entre HKEY_LOCAL_MACHINE\Software\Classes et HKEY_CURRENT_USER\Software\Classes keys. Si l'on regarde la clé HKEY_CLASSES_ROOT, on s’aperçoit que celle-ci contient une clé pour chaque extension de fichier connue. On peut dire que c'est un descendant du fameux fichier REG.DAT des premiers Windows, qui mémorisait ces associations de fichiers.

## L'organisation sur le disque dur de la base de registre

Comme dit plus haut, le registre est mémorisé dans divers fichiers répartis sur le disque dur, généralement dans des répertoires différents. Ces fichiers sont appelés des ruches. Il s'agit évidemment de fichiers cachés, afin que l'utilisateur lambda ne puisse pas modifier leur contenu par inadvertance. Il faut dire que vu l'importance du registre et de son contenu, les concepteurs de Windows préfèrent éviter que n'importe qui puisse y toucher.
Sur le disque dur, une ruche correspond en fait à deux fichiers :
* un fichier primaire, sans extension de fichier, qui contient les données de la ruche ;
* un fichier .LOG, qui sert juste à enregistrer les modifications faites dans le fichier primaire.
Le fichier primaire a toujours une taille qui augmente ou diminue par pas de 256 kibioctets, pour éviter la fragmentation.

### Le format de fichier de registre

Un fichier de registre peut être décomposé en plusieurs sections :
* un en-tête de 4 kibioctets ;
* suivi de plusieurs bins, de taille multiple de 4 kibioctets, eux-même composés :
** d'un entête HBIN de 32 octets ;
** suivi de cellules, qui mémorisent un attribut ou une clé.
Ce système permet de faciliter la gestion des données dans le fichier. Cela permet notamment de réserver de l'espace disque à l'avance pour y enregistrer des données (des cellules), de faciliter la mise à jour des cellules et ainsi de suite. Il se peut que des bins vides, sans données, soient entourés par des bins occupés.
Évidemment, un tel format de fichier n'est pas conçu pour économiser de l'espace disque, mais plus pour améliorer les performances et la gestion du contenu des fichiers. Il faut dire que les fichiers du registre n'ont que rarement des tailles importantes et que leur taille reste très souvent faible. Dans ces conditions, mieux vaut garder de bonnes performances ou faciliter la gestion des fichiers. Nous en reparlerons dans la partie sur la défragmentation du registre.

#### Les cellules

Chaque cellule contient :
* soit un attribut ;
* soit une clé ;
* soit une liste de sous-clés ;
* soit une liste d'attributs ;
* soit un descripteur de sécurité.
Le type de données présent dans la cellule est indiqué au début de celle-ci, dans un en-tête spécial. Une cellule peut contenir des données de taille variable, mais dont la taille sera toujours un multiple de 8 octets. Si jamais la donnée ne respecte pas cette contrainte, on ajoutera des données inutiles pour atteindre le multiple de 8 octets immédiatement supérieur. La cellule commence par un nombre entier qui indique le nombre d'octets occupé par la cellule. Si cet entier est positif, la cellule est vide. S'il est négatif, alors la taille est égale à l'opposé de ce nombre.
Chaque cellule peut faire référence à une autre. Par exemple, les cellules de valeur font référence à une valeur qui est enregistrée dans le fichier. Les cellules de clés peuvent indiquer où se situent les sous-clés associées dans le fichier. Dit autrement, toute la hiérarchie, l'arborescence du registre est mémorisée dans le fichier via des liens, des références vers d'autres morceaux du fichier.
Localiser une cellule ou une valeur dans le fichier se fait avec l'index de la donnée, à savoir la distance qui sépare celle-ci depuis le premier HBIN du fichier. Pour les cellules qui ne sont pas enregistrées sur le disque dur, les clés volatiles, le bit de poids fort de cet index est mis à 1. Il est à 0 dans le cas contraire (clés non-volatiles).

#### Les Bins

Lorsqu'on ajoute des clés dans un fichier, celles-ci sont ajoutées dans des bins. Certains bins ne sont pas pleins : on peut alors leur ajouter des clés. Quand on ajoute des clés dans un bin plein, sa taille augmente brusquement de 4 kibioctets. La part des 4 kibioctets non-utilisée par les clés ajoutées est considéré comme de l'espace libre utilisable pour de futures clés.

### La localisation des fichiers sur le disque dur

Sous Windows 9x le registre est stocké dans les fichiers USER.DAT et SYSTEM.DAT du répertoire \WINDOWS. On devine rapidement que USER.DAT contient la clé HKEY_USERS, et que SYSTEM.DAT contient la clé HKEY_LOCAL_MACHINE (rappelez-vous que les trois autres sont des sous-clés des deux précédentes). Windows Me possède un fichiers de plus : CLASSES.DAT.
Sur les Windows plus récent, toutes les clés sont mémorisées dans le répertoire Windows\System32\Config, à l'exception de HKEY_USERS. La clé HKEY_USERS est mémorisée dans Windows\Profiles\Username. Mais il ne faut pas croire qu'à chaque clé principale correspond une ruche, c'est-à-dire un fichier sur le disque dur. En réalité, voici plus ou moins l'organisation en fichier de ces clés.
| Hive Registry Path | Hive File Path |
| HKEY_LOCAL_MACHINE \SYSTEM | %SystemRoot%1\system32\config\system |
| HKEY_LOCAL_MACHINE \SAM | %SystemRoot%\system32\config\sam |
| HKEY_LOCAL_MACHINE \SECURITY | %SystemRoot%\system32\config\security |
| HKEY_LOCAL_MACHINE \SOFTWARE | %SystemRoot%\system32\config\software |
| HKEY_LOCAL_MACHINE \HARDWARE | Pas de fichier |
| HKEY_USERS \UserProfile | Profile, souvent le répertoire \profiles\user |
| HKEY_USERS.DEFAULT | %SystemRoot%\system32\config\default |
Dans le tableau plus haut, vous avez vu que certaines clés n'ont pas de fichier associé. C'est tout à fait normal, dans le sens où elles sont reconstruites à chaque démarrage de l'ordinateur. Elles ne sont jamais enregistrées sur le disque dur et n'ont pas de fichiers associés. Ces clés sont appelées des clés volatiles. Toute modification de ces clés ou des valeurs/clés qu'elles contiennent ne peut donc pas être sauvegardé. Les clés suivantes sont des clés volatiles :
* HKEY_LOCAL_MACHINE\System\CurrentControlSet ;
* HKEY_CURRENT_USER ;
* HKEY_LOCAL_MACHINE\Hardware.
Les fichiers du registre ne sont pas lus ou écrits depuis le disque dur à chaque fois qu'on en a besoin. À la place, le système d'exploitation copie le registre en mémoire RAM au démarrage du système d'exploitation. Cela prend un peu de mémoire, mais pas beaucoup. Évidemment, le système d'exploitation utilise de nombreuses techniques d'optimisation pour faciliter la recherche d'une informations dans le registre. Une partie de celles-ci sont décrites dans les documents suivants : Inside registry internals, The Internal Structure of the Windows Registry.

## Manipuler le registre

Aussi bien le système d'exploitation que les programmes installés peuvent manipuler le registre. L'utilisateur peut aussi aller trifouiller dans le registre de lui-même, s'il sait comment faire. Dans ce qui va suivre, nous allons voir quelles sont les manipulations habituelles sur le registre, à savoir :
* la modification ;
* la sauvegarde ;
* et les opérations comme le nettoyage ou la défragmentation.

### La modification du registre

Modifier le registre peut se faire à la main. Windows est fourni avec un éditeur de registre, regedit.exe, qui permet de lire le contenu du registre et de le modifier. Cela peut servir aux utilisateurs expérimentés qui souhaitent modifier des options sans avoir à passer par le panneau de configuration.
Mais, dans la plupart des cas, le registre est modifié directement par les programmes, essentiellement des installeurs ou des désinstalleurs. C'est généralement lors de l'installation d'un programme que le registre est modifié et que les clés liées au programme installé sont créées. Une fois la clé créée, il se peut que l'ordinateur doive redémarrer pour que les clés soient prises en compte. Cela vient du fait que beaucoup de clés ne sont vérifiées que lors du démarrage de l'ordinateur (c'est le cas des clés liées aux pilotes ou aux services de Windows). Dans ces conditions, un redémarrage est obligatoire pour que leur nouvelle valeur soit prise en compte.
Pour modifier le registre, Windows fournit diverses API, c'est-à-dire des bibliothèques de fonctions qui manipulent le registre. Il s'agit notamment des APIs Win32 Registry, qu'on trouve dans la DLL nommée ADVAPI32.DLL. Cette bibliothèque fournit plusieurs fonctions qui travaillent sur les clés ou les attributs.

### La sauvegarde du registre

Toutes les modifications du registre sont loin d'être heureuses. Par exemple, de nombreux logiciels espions ou adwares modifient le registre afin de commettre leurs méfaits. De plus, il est possible que des installeurs ou désinstalleurs bogués oublient d'effacer des clés de registre inutiles. Pire : certains logiciels qui prétendent nettoyer le registre de données soit-disant inutiles peuvent littéralement casser le registre en supprimant des clés importantes. Il est cependant possible de revenir sur des modifications assez simplement. Windows fournit divers outils pour sauvegarder le registre et son contenu.
La première méthode pour sauvegarder le registre passe par une copie de celui-ci. On pourrait croire que l'on peut faire cette copie à la main, mais c'est oublier que de nombreux fichiers du registre ne sont pas accessibles via l'explorateur de fichiers, sans compter que Windows interdit la copie de certains. On est donc obligé d'utiliser une autre méthode. Cette méthode passe par regedit : celui-ci permet d'exporter tout ou partie des clés du registre.
Une autre méthode est celle des fameux points de restauration de Windows. Ces points de restauration ne sont ni plus ni moins que des copies, des sauvegardes du registre. Ils permettent de restaurer le registre à un état antérieur, quand tout allait bien. Il faut cependant préciser que tout le registre n'est pas forcément sauvegardé. Premièrement, seule une portion importante du registre l'est. Ensuite, la sauvegarde ne prend en compte que ce qui a changé depuis la dernière sauvegarde.

### Le nettoyage et défragmentation du registre

Si vous avez déjà trainé sur divers sites de téléchargement d’utilitaires, vous connaissez certainement les logiciels de nettoyage ou de défragmentation du registre. Le nettoyage du registre sert surtout à supprimer des clés de registre devenues inutiles. Par exemple, de nombreux logiciels laissent des clés de registres une fois désinstallés (la clé de registre n'est pas effacée lors de la désinstallation). Quand on installe beaucoup de logiciels, il se peut que le registre contienne quelques clés inutiles.
Dans les faits, nettoyer le registre est souvent une mauvaise idée. Déjà, le gain en performance et en espace disque est nul, ou du moins trop faible pour valoir le coup. Effacer les clés inutiles ne diminue pas de beaucoup l'espace disque libre, en raison de l'organisation des fichiers sur le disque. On se retrouve juste avec des bins partiellement vides ou complètement vides. Les défragmenteurs et compacteurs de registre compactent les données dispersées dans plusieurs bins, histoire d'obtenir des bins totalement pleins. Ils en profitent pour supprimer les bins vides obtenus à la fin du fichier (ou entre les bins remplis). Mais vu qu'un fichier du registre grandit ou diminue par blocs de 256 kibioctets, cela ne sert généralement à rien : on ne récupère pas assez d'espace pour franchir la barre des 256 kibioctets.
De même, on voit mal d'où pourraient provenir les gains de performances du nettoyage, vu que la recherche d'une information dans le registre est très rapide. Le seul moment où le registre est massivement utilisé est au démarrage du système d'exploitation, quand le registre est copié dans la mémoire RAM. Le compacter ou le défragmenter peu alors rendre sa copie plus rapide et le démarrage marginalement plus rapide (on gagne tout au plus quelques secondes).
Nettoyer le registre peut cependant avoir des conséquences assez fâcheuses si une clé utile est effacée. Et sachant que beaucoup de nettoyeurs ne savent pas vraiment faire la différence entre ce qui est utile et ce qui ne l'est pas… Bref, vous avez bien compris que les nettoyeurs et compacteurs/défragmenteurs de registre sont tout au plus inutiles, au pire nuisibles.