- En Windows se pueden usar símbolos o caracteres no ASCII como letra de unidad además de A~Z
- Internamente, las rutas Win32 (
C:\\foo) se procesan convertidas a rutas del espacio de nombres NT (\\??\\C:\\foo)
- Esta estructura es administrada por el Object Manager, y una letra de unidad como
C: existe como un objeto de enlace simbólico
- Puedes generar letras de unidad no estándar como
+: o €: usando el comando subst, pero Explorer o PowerShell no la reconocen
- Este comportamiento es una pista importante para entender la estructura interna del manejo de rutas en Windows y su codificación (WTF-16, entre otros)
Estructura interna de las letras de unidad
- La ruta común de Windows (
C:\\foo) es una ruta del espacio de nombres Win32 y se convierte en una ruta del espacio de nombres NT en una llamada a la API
- Por ejemplo: la llamada
CreateFileW("C:\\foo") se convierte internamente en NtCreateFile("\\??\\C:\\foo")
\\?? es una carpeta virtual del Object Manager, una forma combinada de las carpetas \\GLOBAL?? y DosDevices por usuario
- El objeto
C: existe como un enlace simbólico dentro de \\GLOBAL?? y apunta a la ruta real del dispositivo \\Device\\HarddiskVolume4
- Por eso,
C: se trata como un nombre de enlace simbólico normal, no como un carácter reservado especial
Definición de letras de unidad
- La letra de unidad es el resultado del proceso de convertir una ruta Win32 a una ruta NT
- La función de conversión
RtlDosPathNameToNtPathName_U convierte C:\\foo en \\??\\C:\\foo
- Esta función procesa
+: de la misma manera que cualquier carácter no estándar, así que si el objeto +: existe, la ruta +:\\ funciona correctamente
- El objeto
+: creado con el comando subst +: C:\\foo se guarda en la carpeta DosDevices del usuario
Comportamiento de letras de unidad no estándar
- Explorer.exe solo explora el rango A~Z, por lo que la unidad
+: no se muestra
- PowerShell tampoco reconoce unidades no ASCII y devuelve un error
- Sin embargo, en cmd.exe funcionan normalmente unidades como
+: o €:
Letras de unidad no ASCII y Unicode
- Es posible crear una unidad con el comando
subst €: C:\\foo usando el símbolo euro (€)
- Funciona sin distinguir mayúsculas y minúsculas (
Λ: y λ: se reconocen de la misma forma)
- La letra de unidad está limitada a una sola unidad de código WTF-16 (U+FFFF o menos)
- Con
𤭢: (más allá de U+FFFF), subst genera un error
- Si llamas directamente a
MountPointManager, puede crearla, pero la conversión de ruta Win32 falla y no se puede acceder a ella
- Esto muestra que Windows no admite completamente pares sustitutos de UTF-16
Problemas de detección de rutas y codificación
- La implementación del manejo de rutas por idioma puede variar en
RtlDosPathNameToNtPathName_U
- Ejemplo: Rust solo reconoce rutas absolutas en
A-Z (C:\\ es true, +:\\ es false)
- Dependiendo del esquema de codificación (WTF-8 vs WTF-16), cambian los índices
path[0], path[1], etc., así que el resultado de la detección de ruta absoluta también puede cambiar
- La biblioteca estándar de Zig implementa este caso para reconocer hasta el rango
<= U+FFFF
Error al manejar caracteres no ASCII en SetVolumeMountPointW
- La llamada
SetVolumeMountPointW("€:\\", volume) tiene éxito, pero el enlace creado aparece como ¬:
- Esto se atribuye al fenómeno de que
0x20AC (€) se guarda truncado como 0xAC
- Es un caso que evidencia la limitación de la API para manejar letras de unidad no ASCII
Conclusión
- Internamente, Windows no limita las letras de unidad a A~Z
- La limitación surge por diferencias de implementación en herramientas de nivel superior como Explorer, PowerShell
- Entender la estructura de conversión entre Win32 y el espacio de nombres NT, el manejo de codificación y el comportamiento del Object Manager permite comprender mejor los mecanismos internos del sistema de archivos de Windows
1 comentarios
Opinión de Hacker News
Las rutas NT son la forma en que el Object Manager referencia recursos
Por ejemplo,
HKEY_LOCAL_MACHINEes un alias de\\Registry\\MachineNT es similar a Unix en que usa un namespace VFS global
Las rutas que empiezan con una letra de unidad son “DOSPath” por compatibilidad con DOS, y algunos subsistemas todavía las usan incluso en modo kernel
En PowerShell, varios recursos se exponen como “unidades”, y además de las unidades predeterminadas como
hklm:\, también se pueden crear unidades personalizadasDocumentación relacionada: Ejemplos de administración de unidades de PowerShell
En Linux/Bash no se puede acceder a los certificados como una ruta de archivo, pero en PowerShell/Windows sí
Recomiendan instalar el módulo de PowerShell NtObjectManager y explorar con
ls NtObject:\Enlace del módulo
Documentación de Connect-PnPOnline
/usr/share/ca-certificateso/etc/ssl/certsSolo que no está tan integrado como el Windows Registry
También funciona en Windows
Ejemplo del navegador de objetos NT de ReactOS
Puedes ver directamente los archivos PEM bajo
/etc/ca-certificates/extracted/cadirEn Windows se puede acceder a las particiones incluso sin letra de unidad
Se pueden montar bajo un directorio, como en Linux, y configurarlo con el comando
Add-PartitionAccessPathde PowerShellSe mantiene incluso después de reiniciar
El instalador rechaza la tarjeta SD, pero puedes engañarlo usando un punto de montaje NTFS
Aun así, algunos instaladores se confunden porque revisan el espacio libre del disco superior
Para montajes permanentes, un enlace simbólico puede ser más útil
Puedes unir discos de VM con distintas políticas de rendimiento bajo una sola ruta
Al crear una partición desde la GUI, puedes elegir “Montar en la siguiente carpeta NTFS vacía” en lugar de “Asignar letra de unidad”
Letras de unidad como
€:\son un ejemplo maldito pero genialEl kernel NT es mucho más flexible de lo que se le muestra al usuario
Por dentro hay una estructura compleja basada en mapeos por GUID
Por ejemplo, si creas un acceso directo con nombre
{GUID}, puede enlazar a funciones ocultasGracias a este tipo de estructura, Windows también termina siendo un caldo de cultivo para malware
El Explorador de archivos no reconoce letras de unidad fuera de A~Z
Así que el sueño de cambiar todas las letras de unidad por emoji es imposible
Aun así, sería mejor cambiar el ícono de la unidad a un emoji con
autorun.inf, y también se puede poner emoji en la etiquetaEn la era de Win9x, con el truco de
ALT + 255se podían crear carpetas inaccesibles desde el ExploradorEn el entorno de desarrollo de Xbox 360, las letras de unidad eran cadenas de texto
Ej.:
Game:\foo,Hdd0:\fooEl emulador Xenia lo maneja como un sistema de archivos virtual basado en enlaces simbólicos
Ejemplo de código de Xenia
En Linux existe un concepto parecido: el Abstract Domain Socket
Es un socket de dominio Unix cuyo primer carácter es NUL(
\0), y puede esquivar restricciones de permisosSe está usando en servidores de juegos para aislar los recursos de cada jugador sin perder la comunicación
/proc/net/unixEsto suena como un entorno ideal para crear malware
Parece que se podría desordenar el sistema con montajes ocultos o nombres raros de unidades
Cuando tienes que montar varias imágenes de disco, las letras de unidad se vuelven muy confusas
Por ejemplo, si montas 36 ISO de DVD, terminas en un infierno de comillas en la línea de comandos
En DOS antiguo (probablemente versión 3.3), la letra de unidad después de Z era AA
Lo confirmé creando varias unidades RAM pequeñas