路径前缀\ ?? \和\\?\

时间:2014-04-13 11:10:10

标签: windows winapi batch-file cmd

前缀为\??\的路径与前缀为\\?\

的路径之间有何区别?

在Windows 7 CMD-Line

  • DIR提供:\??\Volume{00000000-0000-0000-0000-000000000000}\
  • WMIC VOLUME LIST提供\\?\Volume{00000000-0000-0000-0000-000000000000}\

谢谢

附加信息:
我在系统驱动器上创建了一个目录,我将所有挂载点放入其中。所以我先做MD C:\HDDs,然后做了 MD C:\HDD\Drive1MD C:\HDD\Drive2 ...代表我的所有驱动器。在这些空目录上安装驱动器后,我可以通过使用CD /D C:\HDDs切换到该目录并发出DIR命令来查看GUID。也许我必须发出一个DIR /ah来显示隐藏的东西,以防挂载点是隐藏的目录......

1 个答案:

答案 0 :(得分:14)

在NT," \ ?? \"是一个路径前缀,代表为用户安装的设备保留的对象目录。请注意,对象命名空间中的设备挂载点(即联结)实现为符号链接,通常解析为" \ Device"中的设备对象。目录。

使用" \ ?? \" prefix指示对象管理器在调用者的本地设备目录中搜索" \ Sessions \ 0 \ DosDevices \ [Logon Authentication ID]",它耦合到(即隐藏)全局设备目录," \ Global ??"。为了提高效率,这两个目录都由访问令牌的登录会话引用缓存,也由每个进程对象缓存。请注意,本地目录有一个" Global"链接以允许在本地设备遮蔽全局设备时访问全局设备(例如" \\?\ Global \ Z:"),或允许设备驱动程序在不执行时创建全局设备SYSTEM线程。请注意,SYSTEM登录(ID 0x3E7)使用" \ Global ??"作为其本地设备目录。最后,请注意NT最初使用单个" \ DosDevices"这个目录。如今,为了向后兼容," \ DosDevices"是指向" \ ??"。

的链接

将DOS路径转换为本机NT路径是由NT的用户模式运行时库(即由" ntdll.dll")导出的Rtl前缀函数实现的。

直截了当的案例是以" \\。\"为前缀的路径。或" \\?\"。这是本地设备路径,而不是UNC路径。对于这种情况,前缀简单地替换为" \ ?? \"。两个WinAPI设备路径前缀之间的区别在于" \\?\"路径,一个所谓的"扩展"路径,绕过所有规范化,而a" \\。\"路径规范化以解决"。"和" .."组件,用反斜杠替换正斜杠,从最终路径组件中剥离尾随空格和点。请注意,如果该过程不支持长路径,则规范化路径限制为小于MAX_PATH(260)个字符。 (可以通过注册表和应用程序清单设置的组合在Windows 10中启用长路径支持;请参阅相关文档。)请注意GetFullPathName等效地处理两个前缀,即它还规范化扩展路径。

UNC路径也不足为奇。运行时库只是替换了前导" \\"在标准化路径中明确引用" UNC"设备,即" \ ?? \ UNC \" (例如" \\ server \ share" - >" \ ?? \ UNC \ server \ share")。请注意" \ Global ?? \ UNC"是" \ Device \ Mup",多个UNC提供者设备的符号链接,负责映射"服务器\共享"到正确的UNC提供商(例如,到SMB共享的LanmanWorkstation重定向器)。

逻辑驱动路径(即那些以" [A-Z]:"驱动器开头的路径)在几种情况下都很有趣。第一个是运行时库使用' hidden'来支持每个驱动器的工作目录。环境变量如" = C:"。例如," C:System32"解析为" C:\ Windows \ System32"如果" = C:"环境变量设置为" C:\ Windows"。此外,如果路径的最后一个组件是保留的DOS设备名称,包括名称是否具有尾随冒号,空格,点,甚至文件扩展名,则路径将转换为裸本地设备路径(例如&#34 ; C:\ Windows \ nul:.txt" - >" \ ?? \ nul")。否则,运行时库只是预先设置" \ ?? \"到标准化路径(例如" C:\ Windows" - >" \ ?? \ C:\ Windows")。

DOS逻辑驱动器,例如" C:" (即" \ Global ?? \ C:")实现为NT卷设备的符号链接。 NT设备名称不是持久性的,通常是枚举的,因此最终目标取决于添加卷的相对顺序,如果删除卷并随后还原,它甚至可能会更改。例如," E:\ Temp"的最终NT路径。在可移动驱动器上可以从" \ Device \ HarddiskVolume8 \ Temp"开始。然后,在删除并重新插入后,新的最终路径是" \ Device \ HarddiskVolume10 \ Temp"。 mountpoint管理器使用卷的唯一ID实现持久性,该ID与卷GUID名称相关联(例如"卷{00000000-0000-0000-0000-000000000000}")并且可选地(通常)a逻辑驱动器号。 GUID名称用于在支持联结(即IO_REPARSE_TAG_MOUNT_POINT重新分析点)的文件系统中实现卷装入点,例如NTFS和ReFS。

相关问题