- 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
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\MachineO 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 personalizadasDocumentaçã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
Documentação do Connect-PnPOnline
/usr/share/ca-certificatesou/etc/ssl/certsSó não é algo tão integrado quanto o Windows Registry
Também funciona no Windows
Exemplo do ReactOS NT Object Browser
Dá para ver diretamente os arquivos PEM em
/etc/ca-certificates/extracted/cadirO 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-PartitionAccessPathdo PowerShellPersiste mesmo após reinicialização
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
Dá para agrupar discos de VM com políticas de desempenho diferentes em um único caminho
Ao criar uma partição na interface gráfica, dá para escolher “montar em um caminho” em vez de “atribuir letra de unidade”
Letras de unidade como
€:\são um exemplo amaldiçoado, mas legalO kernel NT é muito mais flexível do que aquilo que fica exposto ao usuário
Por dentro, existe uma estrutura complexa baseada em mapeamento por GUID
Por exemplo, criar um atalho com nome
{GUID}pode levar a funcionalidades ocultasEssa estrutura também ajuda a tornar o Windows um berçário de malware
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
Ainda assim, é melhor trocar o ícone da unidade por um emoji via
autorun.inf, e também dá para colocar emoji no rótuloNa era do Win9x, dava para criar pastas inacessíveis no Explorer com o truque de
ALT + 255No ambiente de desenvolvimento do Xbox 360, letras de unidade eram strings
Ex.:
Game:\foo,Hdd0:\fooO 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ãoEstá sendo usado em servidores de jogos para isolar os recursos de cada jogador sem perder a comunicação
/proc/net/unixIsso parece um ambiente ideal para criar malware
Montagens ocultas ou nomes de unidade estranhos poderiam bagunçar o sistema
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