Format des shell items : dans une entrée ShellBags
Les shell items des valeurs BagMRU octet par octet : types de classe, items file entry, bloc 0xBEEF0004, références MFT et items réseau, pour l'analyste.
TL;DR. Chaque valeur numérotée d'une clé BagMRU est une ITEMIDLIST contenant un seul shell item : une taille sur 2 octets, un octet de type de classe à l'offset 2, puis un corps propre au type. 0x1F est un dossier racine (un GUID comme Poste de travail), 0x2X un volume, 0x3X un « file entry » (dossier ou fichier, avec le nom 8.3 et une date de modification), 0x4X un emplacement réseau, 0x71 un élément du Panneau de configuration, 0x74 un délégué. La plupart des items file entry se terminent par un bloc d'extension 0xBEEF0004 qui ajoute les dates de création et d'accès, le numéro d'entrée MFT et de séquence NTFS, et le nom long. Microsoft ne documente pas ce format ; la référence est libfwsi de libyal.
Pas besoin de décoder des shell items à la main pour exploiter les ShellBags. Il faut en revanche savoir ce que les octets peuvent contenir et ce qu'ils ne peuvent pas contenir, car c'est ce qui délimite ce que vous pouvez affirmer. Cet article décortique un item à la structure réaliste tiré de l'échantillon du site, et les quelques structures qui portent de la preuve.
ITEMIDLIST en un paragraphe
Le shell Windows désigne les objets (dossiers, lecteurs, applets du Panneau de configuration, périphériques) par des listes d'identifiants. Microsoft documente le conteneur : une ITEMIDLIST est une suite de structures SHITEMID, chacune commençant par une taille cb sur 2 octets, terminée par un élément de longueur nulle. Le contenu de chaque item est privé au dossier shell qui l'a créé. La spécification communautaire qui comble ce vide est le Windows Shell Item format de libyal (libfwsi). Les mêmes items apparaissent dans les fichiers LNK (la LinkTargetIDList de MS-SHLLINK) et dans les Jump Lists : ces connaissances se transposent.
Dans une valeur BagMRU, la liste ne contient qu'un item : le composant de chemin de cette clé. Le chemin complet provient du parcours de l'arborescence de clés, pas d'une seule valeur.
Types de classe
L'octet à l'offset 2 identifie l'item. libfwsi regroupe volumes, file entries et items réseau par le quartet haut (class_type & 0x70) :
| Type de classe | Item | Contenu principal | Preuve |
|---|---|---|---|
0x1F | Dossier racine | Index de tri + GUID de dossier connu | Racine de l'espace de noms : Poste de travail, Réseau, Corbeille, profil utilisateur, Accès rapide / Accueil. |
0x20–0x2F | Volume | Lettre de lecteur (E:\), ou GUID pour certains types de périphériques | Quelle lettre de lecteur a été parcourue. À croiser avec l'historique USB. |
0x30–0x3F | File entry | Taille, date de modification FAT, attributs, nom principal (8.3), blocs d'extension | Nom du dossier, dates, référence MFT. Indicateur 0x01 = répertoire, 0x02 = fichier, 0x04 = noms Unicode. |
0x40–0x4F | Emplacement réseau | Indicateurs, chaîne d'emplacement (\\serveur, \\serveur\partage), description/commentaires optionnels | Chemins UNC des partages et serveurs. |
0x52 | Observé dans les dossiers compressés | Incomplètement documenté dans libfwsi | Navigation dans des archives. |
0x61 | URI | Chaîne d'URL | Sites FTP et autres dossiers désignés par URI. |
0x71 | Panneau de configuration | GUID de l'applet | Catégories et éléments du Panneau de configuration ouverts. |
0x74 | Délégué (dossier des fichiers de l'utilisateur) | Signature CFSF enveloppant un file entry | Fréquent pour les dossiers du profil sous Windows 7+. |
0x00 | Variable | Variable : périphériques MTP, résultats de recherche, autres extensions shell | Souvent, seul un nom lisible peut être extrait. |
Un item file entry, octet par octet
Voici le dossier finance_2026 de l'échantillon du ShellBags Parser. Les données sont synthétiques (scénario fictif) mais construites selon la structure réelle :
0000 66 00 31 00 00 00 00 00 2e 5d a0 55 10 00 46 49 f.1......].U..FI
0010 4e 41 4e 43 45 5f 32 30 32 36 00 00 4a 00 09 00 NANCE_2026..J...
0020 04 00 ef be 2e 5d a0 55 2e 5d a0 55 2e 00 00 00 .....].U.].U....
0030 24 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 $...............
0040 00 00 00 00 00 00 00 00 00 00 66 00 69 00 6e 00 ..........f.i.n.
0050 61 00 6e 00 63 00 65 00 5f 00 32 00 30 00 32 00 a.n.c.e._.2.0.2.
0060 36 00 00 00 1c 00 6.....
| Offset | Octets | Champ | Valeur |
|---|---|---|---|
| 0x00 | 66 00 | Taille de l'item | 102 octets |
| 0x02 | 31 | Type de classe | File entry, indicateur répertoire (0x01), nom principal ASCII |
| 0x04 | 00 00 00 00 | Taille du fichier | 0 (répertoires) |
| 0x08 | 2e 5d a0 55 | Modification, date + heure FAT | 2026-09-14 10:45:00 |
| 0x0C | 10 00 | Attributs de fichier | FILE_ATTRIBUTE_DIRECTORY (0x10) |
| 0x0E | FINANCE_2026\0 | Nom principal | Nom court, complété jusqu'à un offset pair |
| 0x1C | 4a 00 | Taille du bloc d'extension | 74 octets |
| 0x1E | 09 00 | Version de l'extension | 9 |
| 0x20 | 04 00 ef be | Signature | 0xBEEF0004 |
| 0x24 | 2e 5d a0 55 | Création (FAT) | 2026-09-14 10:45:00 |
| 0x28 | 2e 5d a0 55 | Accès (FAT) | 2026-09-14 10:45:00 |
| 0x30 | 24 00 00 00 00 00 01 00 | Référence de fichier NTFS | Entrée MFT 36, séquence 1 |
| 0x4A | UTF-16LE | Nom long | finance_2026 |
| 0x64 | 1c 00 | Offset du premier bloc d'extension | 0x1C |
Décodage des valeurs FAT : le mot de date 0x5D2E contient l'année depuis 1980 dans les bits 9 à 15 (46 → 2026), le mois dans les bits 5 à 8 (9), le jour dans les bits 0 à 4 (14). Le mot d'heure 0x55A0 contient l'heure dans les bits 11 à 15 (10), les minutes dans les bits 5 à 10 (45) et les secondes/2 dans les bits 0 à 4. Microsoft documente la même structure pour DosDateTimeToFileTime. Voir horodatage FAT pour les conséquences sur la précision.
Le bloc d'extension 0xBEEF0004
Les blocs d'extension suivent le corps de l'item. Chacun commence par une taille sur 2 octets, une version sur 2 octets et une signature sur 4 octets. L'extension file entry, de signature 0xBEEF0004, est celle qui compte pour les ShellBags. D'après libfwsi :
| Version | Observée sur | Apporte |
|---|---|---|
| 3 | Windows XP, 2003 | Dates de création et d'accès, nom long |
| 7 | Windows Vista | Référence de fichier NTFS (entrée MFT + séquence) |
| 8 | Windows 7, 2008, 8.0 | Champs supplémentaires avant le nom long |
| 9 | Windows 8.1, 10 (jeu de tests libfwsi ; vérifiez vous-même les items Windows 11) | Champs supplémentaires avant le nom long |
La version est elle-même un indice : une entrée avec un bloc de version 3 a été créée par du code de l'époque XP, ce qui compte quand un profil a été migré. Les champs qui varient selon la version se trouvent avant le nom long, d'où la nécessité pour un parseur de connaître la version pour trouver le nom. Le ShellBags Parser affiche la version dans le détail de l'entrée.
La référence de fichier MFT
À partir de la version 7, l'offset 20 du bloc (0x30 dans l'exemple) contient une référence de fichier NTFS sur 8 octets : un numéro d'entrée MFT sur 48 bits et un numéro de séquence sur 16 bits, la structure que Microsoft documente sous le nom MFT_SEGMENT_REFERENCE. C'est le champ le plus sous-exploité des ShellBags :
- Filtrez la $MFT ou le journal USN sur l'entrée 36 : si le numéro de séquence y est plus élevé, le dossier a été supprimé et l'enregistrement réutilisé.
- Les dossiers situés sur des volumes FAT/exFAT n'ont pas de MFT : le champ est nul ou sans signification.
- Les items qui ne proviennent pas de répertoires NTFS (contenu d'archive, items réseau) ne portent pas de référence exploitable.
Voir aussi l'entrée de glossaire sur les références de fichier MFT et l'article sur les dossiers supprimés.
Autres items à reconnaître
Dossier racine (0x1F). L'octet 3 est un index de tri (libfwsi cite 0x50 pour Poste de travail, 0x58 pour Réseau, 0x60 pour la Corbeille), suivi d'un GUID de 16 octets. L'item Poste de travail de l'échantillon fait 20 octets : 14 00 1f 50 puis {20D04FE0-3AEA-1069-A2D8-08002B30309D} en ordre d'octets mixte. Microsoft liste les GUID de dossiers dans KNOWNFOLDERID ; les CLSID comme celui du Poste de travail proviennent de documentations shell plus anciennes et de tables communautaires.
Volume (0x2F). Une lettre de lecteur à l'offset 3 : 19 00 2f 45 3a 5c 00 correspond à E:\. La lettre est celle attribuée par Windows à ce moment-là, pas une identité de périphérique.
Réseau (0x4X). Des indicateurs à l'offset 3, puis un emplacement terminé par NUL à l'offset 5. L'item de partage de l'échantillon 1a 00 c3 00 00 5c 5c 46 49 4c 45 53 52 56 30 31 5c 46 69 6e 61 6e 63 65 00 se lit \\FILESRV01\Finance. libfwsi documente les indicateurs 0x80 (description présente) et 0x40 (commentaires présents).
Délégué (0x74). Sous Windows 7 et suivants, les dossiers du profil utilisateur sont souvent stockés sous forme d'item délégué de signature CFSF enveloppant un file entry classique. Un parseur qui l'ignore perd le nom de nombreux dossiers du profil.
Ce que les parseurs font de l'inconnu
Les extensions shell peuvent définir leurs propres items, et Microsoft en ajoute à chaque version (téléphones en MTP, fournisseurs cloud, résultats de recherche). Un parseur sérieux décode ce qu'il connaît et conserve le reste en hexadécimal. Le ShellBags Parser affiche l'item brut dans le panneau de détails de chaque entrée et se rabat sur la plus longue chaîne UTF-16 lisible pour les items variables. Son README indique que les périphériques MTP, les items de contenu ZIP (0x52) et les résultats de recherche ne sont pas encore entièrement décodés ; ShellBags Explorer couvre davantage de types, une raison de plus de recouper les entrées étranges avec lui (voir le comparatif d'outils).
Pour aller plus loin
- libfwsi : Windows Shell Item format
- Kaitai Struct : Windows shell items
- Microsoft : ITEMIDLIST, SHITEMID