2 pontos por GN⁺ 2025-12-01 | 1 comentários | Compartilhar no WhatsApp
  • No Windows, é possível usar símbolos ou caracteres não ASCII como letra de unidade além de A~Z
  • Internamente, caminhos Win32 (C:\foo) são processados convertendo para o caminho do namespace NT (\\??\\C:\foo)
  • Essa estrutura é gerenciada pelo Object Manager, e uma letra de unidade como C: existe como um simples objeto de link simbólico
  • O comando subst pode criar letras de unidade não padrão como +: ou €:, porém Explorer ou PowerShell não as reconhecem
  • Esse comportamento é uma pista importante para entender a estrutura interna do tratamento de caminhos do Windows e o mecanismo de codificação (como WTF-16), entre outros

A estrutura interna da letra de unidade

  • O caminho comum do Windows (C:\foo) é um caminho de namespace Win32 e, em chamadas de API, é convertido para um caminho de namespace NT
    • Exemplo: ao chamar CreateFileW("C:\foo"), ele é convertido internamente para NtCreateFile("\\??\\C:\foo")
  • \\?? é uma pasta virtual do Object Manager, que combina \\GLOBAL?? e a pasta DosDevices específica do usuário
  • O objeto C: existe como link simbólico dentro de \\GLOBAL?? e aponta para o caminho físico do dispositivo \\Device\\HarddiskVolume4
  • Portanto, C: é tratado como um nome de link simbólico comum, não como um caractere reservado especial

Definição da letra de unidade

  • A letra de unidade é o resultado do processo de conversão de caminho Win32 para caminho NT
    • A função de conversão RtlDosPathNameToNtPathName_U transforma C:\foo em \\??\\C:\foo
  • Esta função trata +: da mesma forma de forma não padrão, então o caminho +:\\ também funciona normalmente quando o objeto +: existe
  • O objeto +: criado com subst +: C:\foo é armazenado na pasta DosDevices do usuário

Comportamento da letra de unidade não padrão

  • O Explorer.exe só varre o intervalo A~Z, portanto a unidade +: não é exibida
  • O PowerShell também não reconhece unidades não ASCII e retorna erro
  • No entanto, no cmd.exe, unidades como +: ou €: funcionam normalmente

Letras de unidade não ASCII e Unicode

  • A unidade €: pode ser criada com o comando subst €: C:\foo
    • Funciona sem distinção entre maiúsculas e minúsculas (Λ: e λ: são reconhecidos da mesma forma)
  • Letras de unidade ficam limitadas a uma única unidade de código WTF-16 (até U+FFFF)
    • Caracteres acima de U+FFFF, como 𤭢:, causam erro no subst
    • Chamadas diretas ao MountPointManager conseguem criar, mas o acesso falha porque a conversão do caminho Win32 falha
  • Isso mostra que o Windows não oferece suporte completo a pares substitutos UTF-16

Detecção de caminho e problema de codificação

  • A implementação de tratamento de caminhos por linguagem pode diferir da RtlDosPathNameToNtPathName_U
    • Exemplo: Rust reconhece como caminho absoluto apenas A~Z (C:\ é verdadeiro, +:\ é falso)
  • Dependendo da codificação (WTF-8 vs WTF-16), os índices path[0], path[1] etc. podem mudar e o resultado da detecção de caminho absoluto pode variar
  • A biblioteca padrão do Zig trata essa diferença implementando o reconhecimento até o limite <= U+FFFF

Bug de processamento de não ASCII em SetVolumeMountPointW

  • A chamada SetVolumeMountPointW("€:\", volume) tem sucesso, mas o link criado aparece como ¬:
  • Isso sugere que 0x20AC () é truncado e salvo como 0xAC
  • É um exemplo da limitação de uma API que não consegue processar corretamente letras de unidade não ASCII

Conclusão

  • O Windows internamente não limita a letra de unidade a A~Z
  • A limitação acontece pelas diferenças de implementação de ferramentas de nível superior, como Explorer e PowerShell
  • Entender a estrutura de conversão do Win32 e do namespace NT, o processamento de codificação e o funcionamento do Object Manager ajuda a entender com mais profundidade o mecanismo interno do sistema de arquivos do Windows

1 comentários

 
GN⁺ 2025-12-01
Comentário no Hacker News
  • Caminhos NT são a forma como o Object Manager referencia recursos
    Por exemplo, HKEY_LOCAL_MACHINE é um alias de \Registry\Machine
    O NT é semelhante ao Unix no sentido de usar um namespace VFS global
    Caminhos que começam com letra de unidade são “DOSPath” para compatibilidade com DOS, e alguns subsistemas ainda os usam mesmo no modo kernel
    No PowerShell, vários recursos são expostos como “unidades”, e além de unidades padrão como hklm:\, também é possível criar unidades personalizadas
    Documentação relacionada: Exemplos de gerenciamento de unidades do PowerShell
    No Linux/Bash, não dá para acessar certificados por um caminho de arquivo, mas no PowerShell/Windows isso é possível
    Recomendo instalar o módulo PowerShell NtObjectManager e explorar com ls NtObject:\
    Link do módulo

    • É impressionante que, mesmo depois de 30 anos, o Windows ainda esteja preso a uma estrutura de diretórios dos anos 80. Nem existem mais disquetes
    • Usando o provedor PSDrive do PnP PowerShell, também dá para navegar no SharePoint Online como se fosse uma unidade
      Documentação do Connect-PnPOnline
    • No Linux, também é possível acessar certificados como arquivos via /usr/share/ca-certificates ou /etc/ssl/certs
      Só não é algo tão integrado quanto o Windows Registry
    • O ReactOS tem um navegador de objetos NT que permite explorar toda a hierarquia do Registry em GUI
      Também funciona no Windows
      Exemplo do ReactOS NT Object Browser
    • No Linux, certificados também podem ser acessados simplesmente como arquivos
      Dá para ver diretamente os arquivos PEM em /etc/ca-certificates/extracted/cadir
  • O Windows consegue acessar partições mesmo sem letra de unidade
    Como no Linux, elas podem ser montadas sob um diretório, e isso pode ser configurado com o comando Add-PartitionAccessPath do PowerShell
    Persiste mesmo após reinicialização

    • Já usei isso para desviar o caminho de instalação de jogos para um cartão SD
      O instalador rejeita o cartão SD, mas dá para enganá-lo usando um ponto de montagem NTFS
      Alguns instaladores, porém, se confundem ao verificar o espaço livre do disco pai
      Para montagens permanentes, links simbólicos são mais úteis
    • Mesmo sem PowerShell, isso pode ser configurado na ferramenta de gerenciamento de disco pelo menu “Alterar letra de unidade e caminhos”
    • Pontos de montagem NTFS são úteis para contornar software que não permite personalizar caminhos
      Dá para agrupar discos de VM com políticas de desempenho diferentes em um único caminho
    • Mas isso só funciona entre NTFS. exFAT e ReFS não são compatíveis
      Ao criar uma partição na interface gráfica, dá para escolher “montar em um caminho” em vez de “atribuir letra de unidade”
    • Alguns programas, como o Steam, podem verificar o espaço livre do disco pai e recusar a instalação
  • Letras de unidade como €:\ são um exemplo amaldiçoado, mas legal
    O kernel NT é muito mais flexível do que aquilo que fica exposto ao usuário

    • A maioria das pessoas só conhece a casca DOS do Windows NT
      Por dentro, existe uma estrutura complexa baseada em mapeamento por GUID
      Por exemplo, criar um atalho com nome {GUID} pode levar a funcionalidades ocultas
      Essa estrutura também ajuda a tornar o Windows um berçário de malware
    • Dependendo da code page, talvez nem seja possível acessar essas letras de unidade
    • Para ser realmente flexível, letras de unidade deveriam poder ser emoji
  • O File Explorer não reconhece letras de unidade fora de A~Z
    Então o sonho de trocar todas as letras de unidade por emoji é impossível

    • A maioria dos emoji não é representada por uma única code unit UTF-16, então há essa limitação
    • Alguns emoji sorridentes podem funcionar dependendo da code page
      Ainda assim, é melhor trocar o ícone da unidade por um emoji via autorun.inf, e também dá para colocar emoji no rótulo
    • Dá para usar emoji no nome do computador
  • Na era do Win9x, dava para criar pastas inacessíveis no Explorer com o truque de ALT + 255

  • No ambiente de desenvolvimento do Xbox 360, letras de unidade eram strings
    Ex.: Game:\foo, Hdd0:\foo

    • Sim, isso realmente existiu
      O emulador Xenia trata isso como um sistema de arquivos virtual baseado em links simbólicos
      Exemplo de código do Xenia
  • No Linux existe um conceito parecido chamado Abstract Domain Socket
    É um socket de domínio Unix cujo primeiro caractere é NUL(\0), o que permite contornar restrições de permissão
    Está sendo usado em servidores de jogos para isolar os recursos de cada jogador sem perder a comunicação

    • Também dá para localizar esses sockets em /proc/net/unix
  • Isso parece um ambiente ideal para criar malware
    Montagens ocultas ou nomes de unidade estranhos poderiam bagunçar o sistema

    • Mas, na prática, os caminhos NT precisam ser mapeados para volumes reais, então não é tão fácil esconder tudo completamente
    • Você vai se surpreender ainda mais quando descobrir os Alternate Data Streams
    • Manipular unidades exige privilégios de administrador
  • Quando é preciso montar várias imagens de disco, letras de unidade viram uma grande bagunça
    Por exemplo, se você montar 36 ISOs de DVD, vai experimentar um verdadeiro inferno de aspas na linha de comando

  • No DOS antigo (provavelmente a versão 3.3), a letra de unidade depois de Z era AA
    Eu confirmei isso criando vários pequenos RAM drives

    • Também lembro que no Netware era possível fazer mapeamento de unidades além de Z