- Sous Windows, il est possible d’utiliser comme lettre de lecteur des symboles ou des caractères non-ASCII en dehors de A-Z
- En interne, le chemin Win32 (
C:\\foo) est traité comme un chemin de l’espace de noms NT (\\??\\C\\foo)
- Cette structure est gérée par l’Object Manager, et une lettre de lecteur comme
C: existe comme un simple objet de lien symbolique
- Grâce à la commande
subst, il est possible de créer des lettres de lecteur non standard comme +: ou €:, mais Explorer ou PowerShell ne les reconnaissent pas
- Ce comportement constitue un indice important pour comprendre la structure interne de la gestion des chemins Windows et le mode d’encodage (WTF-16, etc.)
Structure interne des lettres de lecteur
- Le chemin Win32 courant (
C:\\foo) est un chemin de l’espace de noms Win32, et il est converti en chemin de l’espace de noms NT lors d’un appel d’API
- Exemple :
CreateFileW("C:\\foo") est converti en interne vers NtCreateFile("\\\\??\\\\C:\\foo")
\\?? est un dossier virtuel de l’Object Manager, une combinaison de \\GLOBAL?? et du dossier DosDevices propre à chaque utilisateur
- L’objet
C: existe comme lien symbolique dans \\GLOBAL??, et pointe vers le chemin de périphérique réel \\Device\\HarddiskVolume4
- Donc,
C: n’est pas un caractère réservé spécial, mais traité comme un nom de lien symbolique ordinaire
Définition des lettres de lecteur
- Une lettre de lecteur est un sous-produit du processus qui transforme un chemin Win32 en chemin NT
- La fonction de conversion
RtlDosPathNameToNtPathName_U convertit C:\\foo en \\??\\C:\\foo
- Cette fonction gère aussi de la même manière des caractères non standard comme
+:, donc si l’objet +: existe, le chemin +:\\ fonctionne correctement
- L’objet
+: créé via subst +: C:\\foo est stocké dans le dossier DosDevices propre à l’utilisateur
Comportement des lettres de lecteur non standard
- Explorer.exe n’explore que la plage A-Z, donc le lecteur
+: ne s’affiche pas
- PowerShell ne reconnaît pas non plus les lecteurs non ASCII et renvoie une erreur
- cmd.exe, en revanche, gère correctement les lecteurs comme
+: ou €:
Lettres de lecteur non ASCII et Unicode
- Il est possible de créer un lecteur (€, le symbole euro) avec la commande
subst €: C:\\foo
- Cela fonctionne sans distinction de casse (
Λ: et λ: sont reconnus de la même manière)
- La lettre de lecteur est limitée à une unité de code WTF-16 unique (≤ U+FFFF)
- Les caractères au-delà de U+FFFF, comme
𤭢:, provoquent une erreur dans subst
- Il est possible de créer via un appel direct à
MountPointManager, mais la conversion du chemin Win32 échoue et l’accès est impossible
- Cela montre que Windows ne prend pas entièrement en charge les paires de substitution UTF-16
Détermination du chemin et problème d’encodage
- L’implémentation de la gestion des chemins selon le langage peut différer de
RtlDosPathNameToNtPathName_U
- Exemple : Rust reconnaît comme chemins absolus uniquement
A-Z (C:\\ vaut true, +:\\ vaut false)
- Selon l’encodage (WTF-8 vs WTF-16), les indices
path[0], path[1], etc. peuvent différer, ce qui peut changer le résultat de la détection d’un chemin absolu
- La bibliothèque standard de Zig implémente la reconnaissance jusqu’à la plage
<= U+FFFF pour prendre en compte cette différence
Bug de traitement non-ASCII de SetVolumeMountPointW
- L’appel
SetVolumeMountPointW("€:\\", volume) réussit, mais le lien réellement créé apparaît comme ¬:
- Cela est probablement dû au fait que
0x20AC (€) est stocké en étant tronqué à 0xAC
- Un cas qui montre la limite de l’API à traiter correctement les lettres de lecteur non ASCII
Conclusion
- Windows ne limite pas en interne les lettres de lecteur à A-Z
- Les limites viennent des différences d’implémentation d’outils de niveau supérieur comme Explorer ou PowerShell
- Comprendre la structure de conversion entre Win32 et l’espace de noms NT, le traitement de l’encodage et le comportement de l’Object Manager permet de mieux comprendre le mécanisme interne du système de fichiers Windows
1 commentaires
Commentaire Hacker News
Les chemins NT sont la manière dont Object Manager référence les ressources
Par exemple,
HKEY_LOCAL_MACHINEest un alias de\Registry\MachineNT est similaire à Unix en ce qu’il utilise un espace de noms VFS global
Les chemins commençant par une lettre de lecteur sont des « DOSPath » pour la compatibilité DOS, et certains sous-systèmes les utilisent encore, y compris en mode noyau
Dans PowerShell, diverses ressources sont exposées comme des « lecteurs », et au-delà des lecteurs par défaut comme
hklm:\, on peut aussi créer des lecteurs personnalisésDocumentation associée : exemple de gestion des lecteurs PowerShell
Sous Linux/Bash, on ne peut pas accéder aux certificats via un chemin de fichier, mais c’est possible avec PowerShell/Windows
Je recommande d’installer le module PowerShell NtObjectManager et d’explorer avec
ls NtObject:\Lien du module
Documentation Connect-PnPOnline
/usr/share/ca-certificatesou/etc/ssl/certsC’est simplement moins intégré que le Windows Registry
Il fonctionne aussi sous Windows
Exemple du navigateur NT Object de ReactOS
On peut voir directement les fichiers PEM sous
/etc/ca-certificates/extracted/cadirWindows peut aussi accéder aux partitions sans lettre de lecteur
Comme sous Linux, on peut les monter sous un répertoire, et le configurer avec la commande PowerShell
Add-PartitionAccessPathCela persiste après redémarrage
L’installateur refuse la carte SD, mais on peut le tromper avec un point de montage NTFS
En revanche, certains installateurs vérifient l’espace libre du disque parent et s’y perdent
Pour les montages permanents, les liens symboliques sont plus pratiques
On peut regrouper sous un même chemin des disques de VM avec des politiques de performance différentes
Lors de la création d’une partition dans l’interface GUI, on peut choisir « monter dans le chemin » au lieu de « attribuer une lettre de lecteur »
Une lettre de lecteur comme
€:\est un exemple maudit mais génialLe noyau NT est bien plus flexible que ce qui est exposé à l’utilisateur
À l’intérieur se cache une structure complexe fondée sur des mappages GUID
Par exemple, créer un raccourci nommé
{GUID}peut pointer vers une fonctionnalité cachéeC’est aussi ce genre de structure qui fait de Windows un terrain fertile pour les malwares
L’Explorateur de fichiers ne reconnaît pas les lettres de lecteur autres que A à Z
Donc le rêve de remplacer toutes les lettres de lecteur par des emoji est impossible
Cela dit, mieux vaut remplacer l’icône du lecteur par un emoji via
autorun.inf, et on peut aussi mettre des emoji dans le libelléÀ l’époque de Win9x, l’astuce
ALT + 255permettait de créer des dossiers inaccessibles depuis l’ExplorateurDans l’environnement de développement Xbox 360, les lettres de lecteur étaient des chaînes de caractères
Ex. :
Game:\foo,Hdd0:\fooL’émulateur Xenia le gère avec un système de fichiers virtuel basé sur des liens symboliques
Exemple de code Xenia
Sous Linux, il existe un concept similaire avec les Abstract Domain Socket
Ce sont des sockets de domaine Unix dont le premier caractère est NUL(
\0), ce qui permet de contourner les restrictions de permissionsJe les utilise sur un serveur de jeu pour isoler les ressources de chaque joueur tout en maintenant la communication
/proc/net/unixCe genre de fonctionnalité semble offrir un excellent terrain pour créer des malwares
Avec des montages cachés ou des noms de lecteurs étranges, on pourrait perturber le système
Lorsqu’il faut monter plusieurs images disque, les lettres de lecteur deviennent vite très confuses
Par exemple, monter 36 ISO de DVD fait vite tomber dans un enfer de guillemets en ligne de commande
Sur les anciens DOS, probablement la version 3.3, la lettre qui suivait Z était AA
Je l’avais vérifié en créant plusieurs petits RAM drives