Quelle est la différence entre les valeurs de registre ShowSuperHidden et SuperHidden ?

Sous la clé de registre :

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced

…il y a deux valeurs bien documentées qui concernent l’affichage des fichiers et dossiers cachés dans l’Explorateur Windows.

La clé Hidden affiche les fichiers cachés quand elle est vraie, et les masque quand elle est fausse.

La clé ShowSuperHidden est généralement reconnue comme son équivalent pour les fichiers “super cachés” (c.-à-d. protégés/système) ; elle affiche les fichiers super cachés quand elle est vraie, et les masque quand elle est fausse.

Cela dit, où intervient la valeur SuperHidden ? Son nom suggère qu’elle serait l’analogue naturel de la clé Hidden, mais la documentation à son sujet et sur ce qu’elle fait est inexistante d’après ce que j’ai pu constater.

Quel est l’objectif de la valeur SuperHidden, et en quoi diffère-t-elle de ShowSuperHidden ?

ShowSuperHidden, comme nous l’avons découvert, contrôle si les fichiers super cachés (Caché + Système) sont affichés. Pour autant que je puisse le déterminer, SuperHidden ne contrôle rien et son existence est probablement une erreur de programmation.

En utilisant Process Monitor, j’ai observé les lectures et écritures de ces valeurs de registre. La seule interaction avec SuperHidden était une écriture lorsque l’utilisateur ouvrait l’onglet Affichage de la boîte de dialogue Options des dossiers. Elle recevait un 1 si les fichiers super cachés sont affichés, 0 sinon. Elle n’a jamais été lue, même quand j’ai terminé et redémarré l’Explorateur.

Procmon fournit la pile d’appels qui a conduit à une opération surveillée (double-cliquez sur un événement et consultez l’onglet Pile), j’ai donc examiné les fichiers DLL impliqués en utilisant IDA v5.0. La seule DLL pertinente mentionnant SuperHidden était shell32.dll. La fonction CachedShellState::SaveAdvancedSettings effectue une écriture de registre vers cette valeur et d’autres dans cette clé, enregistrant les paramètres d’affichage actuels.

L’Explorateur appelle apparemment cette fonction avant d’afficher l’onglet Affichage. C’est probablement fait pour s’assurer que le registre est cohérent avec les paramètres actuels en mémoire avant de charger l’état actuel des options d’affichage, bien que j’admette ne pas être sûr à 100% du raisonnement. Quoi qu’il en soit, la fonction correspondante de shell32.dll CachedShellState::_GetAdvancedSettings effectue une lecture depuis la valeur correcte, ShowSuperHidden.

Ces listings de désassemblage proviennent de la version Windows 7 de cette DLL. Sous Windows 10, SuperHidden n’existe pas dans le registre, et CachedShellState::SaveAdvancedSettings écrit dans ShowSuperHidden.

Par conséquent, je conclus que lors de la programmation de la version de cette fonction livrée avec Windows 7, un développeur a par erreur omis le Show dans ShowSuperHidden, mais l’erreur a été corrigée entre-temps pour Windows 10.

Pour les curieux, la boîte de dialogue Options des dossiers n’est pas cassée par cette erreur car elle consulte l’entrée ValueName sous chaque clé de paramètre ici :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder

Déterminer la signification des autres parties de cette branche est laissé comme exercice (amusant !) au lecteur.