文章摘要
Windows系统实际上支持超出A-Z范围的特殊字符作为驱动器盘符,通过subst命令可以创建如+:\这样的非标准盘符。这一现象揭示了Windows底层处理驱动器盘符的机制,表明其限制比通常认为的更为宽松,但某些特殊字符在实际使用中可能存在兼容性问题。
文章总结
标题:Windows系统盘符不限于A-Z范围
文章主要内容:
- 盘符本质解析
- Windows系统中的盘符(如C:)实际上是NT对象管理器中的符号链接,指向类似\Device\HarddiskVolume4这样的设备路径
- 通过subst工具可以创建非标准盘符(如+:\),这些盘符在cmd.exe中可以正常使用
- 技术实现原理
- Windows API会将Win32路径(如C:\foo)转换为NT路径(如\??\C:\foo)
- 转换过程由RtlDosPathNameToNtPathName_U函数实现,该函数不限制盘符必须为A-Z
- 特殊发现
- 支持非ASCII字符作为盘符(如€:\),但限制为单个WTF-16代码单元(≤U+FFFF)
- 通过MountPointManager可以直接创建包含高位Unicode字符的盘符
- 兼容性问题
- 资源管理器(explorer.exe)和PowerShell不支持非A-Z盘符
- 不同编程语言对非标准盘符的路径判断存在差异(如Rust仅识别A-Z盘符)
- SetVolumeMountPointW API在处理非ASCII盘符时存在字符截断问题
- 技术意义
- 揭示了Windows路径处理的底层机制
- 展示了系统API与用户界面之间的实现差异
- 为开发者处理路径相关问题提供了新的视角
注:文章保留了关键的技术细节和验证过程,删减了部分重复的代码示例和调试日志,突出了核心发现和系统原理。
评论总结
以下是评论内容的总结:
对NT内核灵活性的赞赏
- 用户thrtythreeforty认为NT内核的灵活性令人惊叹("The cursedness of '€:\' is awesome. It's amazing how much more flexible the NT kernel is")
- nunobrito表示从文章中学习到新知识("Learned something new today")
对特殊驱动器命名可能性的讨论
- the_mitsuhiko回忆Xbox 360使用字符串作为"盘符"("original xbox 360 had 'drive letters' which were entire strings")
- RobotToaster对无法使用emoji作为盘符表示遗憾("there goes my plan to replace all my drive letters with emojis")
对Windows盘符系统的批评
- rado指出外部驱动器盘符可能被占用的问题("its letter can be stolen by another drive, you can't work anymore")
- Tanoc描述处理多光盘阵列时盘符带来的麻烦("things get very tricky in cmd...the operators can be the same symbols as the drive letters")
对盘符历史的有趣观察
- kijin回忆早期计算机盘符使用情况("A and B were commonly used drive letters. C was a luxury")
- 并幽默地将盘符与音乐音阶联系起来("C is also the first note in the most widely known musical scale")
关于安全风险的担忧
- azalemeth和arcfour都认为这种特性可能被恶意软件利用("a wonderful way to write some truly annoying malware", "could be abused rather hilariously by malware")
替代盘符的解决方案
- noinsight指出可以通过目录挂载分区("You can mount partitions under directories just like in Linux/Unix")
- 并提供了PowerShell命令示例("Add-PartitionAccessPath -DiskNumber 1 -PartitionNumber 2 -AccessPath 'C:\Disk'")
对历史技巧的回忆
- vunderba提到Win9x时代使用ALT+255字符隐藏目录的技巧("the old-school ALT + 255 trick...made the directory inaccessible")