gpt4 book ai didi

windows - 路径前缀\??\和\\?\

转载 作者:可可西里 更新时间:2023-11-01 12:14:22 32 4
gpt4 key购买 nike

前缀为 \??\ 的路径有什么区别以及前缀为 \\?\ 的那些

在 Windows 7 CMD-Line

  • DIR 给出:\??\Volume{00000000-0000-0000-0000-000000000000}\
  • WMIC 音量列表提供 \\?\Volume{00000000-0000-0000-0000-000000000000}\

  • 谢谢

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

    最佳答案

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

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

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

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

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

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

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

    诸如“C:”​​(即“\Global??\C:”)之类的 DOS 驱动器是 NT 卷设备(即对象符号链接(symbolic link))的别名。 NT 设备名称不是持久的,通常是枚举的,因此最终目标取决于添加卷的相对顺序,如果删除并随后恢复卷,它甚至可能会更改。例如,可移动驱动器上“E:\Temp”的最终 NT 路径可能以“\Device\HarddiskVolume8\Temp”开头,然后在删除并重新插入后,新的最终路径为“\Device\HarddiskVolume10\温度”。挂载点管理器使用卷的唯一 ID 实现持久性,它与卷 GUID 名称(例如“卷{00000000-0000-0000-0000-000000000000}”)和可选的(通常)DOS 驱动器号相关联。 GUID 名称用于在支持联结(即 IO_REPARSE_TAG_MOUNT_POINT 重解析点)的文件系统中实现卷挂载点,例如 NTFS 和 ReFS。

    关于windows - 路径前缀\??\和\\?\,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041983/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com