Windows 路径前缀\?和\\

Windows 路径前缀\?和\\,windows,winapi,batch-file,cmd,Windows,Winapi,Batch File,Cmd,前缀为\??\的路径与前缀为\?\的路径有什么区别 在Windows7命令行 目录给出:\??\Volume{00000000-0000-0000-0000-000000000000}\ WMIC卷列表给出了\\?\VOLUME{00000000-0000-0000-0000-000000000000}\ 谢谢 其他信息: 我在系统驱动器上创建了一个目录,将所有装入点都放在其中。所以我先做了一个mdc:\HDDs,然后做了一个 MD C:\HDD\Drive1,MD C:\HDD\Drive

前缀为
\??\
的路径与前缀为
\?\
的路径有什么区别

在Windows7命令行

  • 目录给出:
    \??\Volume{00000000-0000-0000-0000-000000000000}\
  • WMIC卷列表给出了
    \\?\VOLUME{00000000-0000-0000-0000-000000000000}\
谢谢

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

在NT中,“\??\”是一个路径前缀,代表为用户设备保留的对象目录,或者更具体地说,是设备别名。设备别名在对象命名空间中实现为符号链接,通常解析为“\device”目录中的设备对象。有时在文档中,这些设备别名在对象名称空间中被称为“连接”,这不能与文件系统中的“目录连接”(或装入点)混淆

使用“\??\”前缀指示对象管理器在调用方的本地设备目录“\Sessions\0\DosDevices\[Logon Authentication ID]”中搜索,该目录与全局设备目录“\global???”耦合(即阴影)。为了提高效率,这两个目录都由访问令牌的关联登录会话记录以及每个进程对象缓存。系统登录(ID 0x3E7)使用“\Global???”作为其本地设备目录。请注意,本地目录有一个“全局”链接,允许在本地设备与全局设备(例如“\\?\Global\Z:”)发生阴影时访问全局设备,或允许设备驱动程序在不在系统线程中执行时创建全局设备。NT最初使用单个“\DosDevices”目录,而不考虑调用方。随着NT5中终端服务和快速用户切换的引入,他们不得不将其推广到目前的本地和全球设备系统。现在,为了向后兼容,“\DosDevices”是指向“\??”的链接

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

直截了当的情况是以“\\.\”或“\\?\”为前缀的路径。这是本地设备路径,不是UNC路径。(严格地说,它是以UNC路径的形式出现的,但是“.”和“?”是保留的设备域。)对于这种情况,前缀只需替换为NT“\??\”。两个WINAPI设备路径前缀之间的区别在于“\\?\”路径(所有反斜杠,没有正斜杠)是所谓的“扩展”路径,它绕过所有规范化,而“\\.\”路径得到规范化

设备路径规范化解析“.”和“.”组件,用反斜杠替换前斜杠,并从最终路径组件中去除尾随空格和点。由于正斜杠被转换为反斜杠,规范化设备路径的前缀可以是“///”或“///”或斜杠和反斜杠的任意组合,除了“\\?\”之外。请注意,如果进程不支持长路径,则规范化路径将限制为少于
MAX\u PATH
(260)个字符。(可以通过注册表和应用程序清单设置的组合在Windows 10中启用长路径支持;请参阅相关文档。)
GetFullPathNameW
等效地处理这两个前缀,甚至规范化以“\\?\”开头的扩展路径

UNC路径也不足为奇。运行时库只是将规范化路径中的前导“\\”替换为对“UNC”设备的显式引用,即“\??\UNC\”(例如“\\server\share”->“\??\UNC\server\share”)。请注意,“\Global???\UNC”是指向“\Device\Mup”的符号链接,多UNC提供程序设备负责将“服务器\共享”映射到正确的UNC提供程序(例如,映射到SMB共享的LanmanWorkstation重定向器)

DOS驱动器路径(即那些以“[A-Z]:”驱动器开头的路径)在一些情况下很有趣。首先,运行库支持使用传统的“隐藏”环境变量(如“=C:”)的每个驱动器工作目录。例如,如果“=C:”环境变量设置为“C:\Windows”,则“C:System32”解析为“C:\Windows\System32”。此外,如果路径的最后一个组件是保留的DOS设备名,包括名称后面的冒号、空格、点,甚至是文件扩展名,则该路径将转换为设备路径(例如“C:\Windows\nul:.txt”->“\??\nul”)。(DOS设备也保留在没有驱动器的相对路径的最后一个组件中。)否则,运行库只是在规范化路径(例如“C:/Windows”->“\??\C:\Windows”)前面加上“\??\”

DOS驱动器如“C:”(即“\Global???\C:”)是NT卷设备(即对象符号链接)的别名。NT设备名称不是持久性的,通常是枚举的,因此最终目标取决于添加卷的相对顺序,如果删除卷并随后恢复卷,它甚至可能会更改。例如,可移动驱动器上“E:\Temp”的最终NT路径可能以“\Device\HarddiskVolume8\Temp”开头,然后在删除并重新插入后,新的最终路径为“\Device\HarddiskVolume10\Temp”。装载点管理器使用卷的唯一ID实现持久性,该ID与卷GUID名称(例如“V”)关联