2 puntos por GN⁺ 2025-12-01 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-12-01
Opinión de Hacker News
  • Las rutas NT son la forma en que el Object Manager referencia recursos
    Por ejemplo, HKEY_LOCAL_MACHINE es un alias de \\Registry\\Machine
    NT 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 personalizadas
    Documentació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

    • Sorprende que, incluso después de 30 años, Windows siga atado a una estructura de directorios de los años 80. Y eso que ya ni hay disqueteras
    • Si usas el proveedor PSDrive de PnP PowerShell, también puedes explorar SharePoint Online como si fuera una unidad
      Documentación de Connect-PnPOnline
    • En Linux también se puede acceder a los certificados como archivos mediante /usr/share/ca-certificates o /etc/ssl/certs
      Solo que no está tan integrado como el Windows Registry
    • ReactOS tiene un navegador de objetos NT con el que puedes recorrer toda la jerarquía del Registry desde una GUI
      También funciona en Windows
      Ejemplo del navegador de objetos NT de ReactOS
    • En Linux también se puede acceder a los certificados simplemente como archivos
      Puedes ver directamente los archivos PEM bajo /etc/ca-certificates/extracted/cadir
  • En 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-PartitionAccessPath de PowerShell
    Se mantiene incluso después de reiniciar

    • Usé esta función para desviar la ruta de instalación de juegos a una tarjeta SD
      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
    • También se puede configurar sin PowerShell desde la herramienta de Administración de discos, en el menú “Cambiar letra y rutas de acceso de unidad”
    • Los puntos de montaje NTFS son útiles para rodear software que no permite personalizar la ruta
      Puedes unir discos de VM con distintas políticas de rendimiento bajo una sola ruta
    • Eso sí, solo funciona entre volúmenes NTFS. No admite exFAT ni ReFS
      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”
    • Algunos programas, como Steam, pueden revisar el espacio libre del disco superior y rechazar la instalación
  • Letras de unidad como €:\ son un ejemplo maldito pero genial
    El kernel NT es mucho más flexible de lo que se le muestra al usuario

    • La mayoría de la gente solo conoce la capa DOS de Windows NT
      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 ocultas
      Gracias a este tipo de estructura, Windows también termina siendo un caldo de cultivo para malware
    • Según la página de códigos, puede que ni siquiera sea posible acceder a letras de unidad así
    • Para ser realmente flexible, las letras de unidad deberían poder ser emoji
  • 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

    • La mayoría de los emoji no se representan con una sola unidad de código UTF-16, así que hay limitaciones
    • Algunos emoji de carita sí podrían funcionar según la página de códigos
      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 etiqueta
    • Se pueden usar emoji en el nombre de la computadora
  • En la era de Win9x, con el truco de ALT + 255 se podían crear carpetas inaccesibles desde el Explorador

  • En el entorno de desarrollo de Xbox 360, las letras de unidad eran cadenas de texto
    Ej.: Game:\foo, Hdd0:\foo

    • Sí, realmente existían
      El 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 permisos
    Se está usando en servidores de juegos para aislar los recursos de cada jugador sin perder la comunicación

    • También se puede encontrar ese socket en /proc/net/unix
  • Esto suena como un entorno ideal para crear malware
    Parece que se podría desordenar el sistema con montajes ocultos o nombres raros de unidades

    • Pero en la práctica, una ruta NT tiene que mapearse a un volumen real, así que no es tan fácil ocultarlo por completo
    • Te sorprenderás todavía más cuando conozcas los Alternate Data Streams
    • Manipular unidades requiere privilegios de administrador
  • 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

    • También recuerdan que en Netware se podían hacer mapeos de unidad más allá de Z