![Windows 注册表中文件系统路径中的问号有什么作用?](https://linux22.com/image/1491140/Windows%20%E6%B3%A8%E5%86%8C%E8%A1%A8%E4%B8%AD%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E8%B7%AF%E5%BE%84%E4%B8%AD%E7%9A%84%E9%97%AE%E5%8F%B7%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
答案1
双问号路径是NT 对象管理器路径可以查找 DOS 风格的设备(如驱动器号)。对象管理器是一个将大量不同类型的系统资源(例如设备、内存部分、窗口站、事件)组织成一个树状结构的系统。您可以使用程序运行对象工具。
伪目录\??
首先在请求进程的DosDevices
表中查找,但如果进程没有设备的特定定义(负责页面文件的组件可能没有),则查找将继续到\GLOBAL??
对象管理器目录。其内容可以在GLOBAL??
WinObj 部分看到。还有其他子树,比如Device
。事实上,中的每一项GLOBAL??
都是指向其他地方的对象的符号链接——快捷方式或别名。\GLOBAL??\C:
(在我的系统上)是指向的链接\Device\HarddiskVolume4
,屏幕截图中显示的其余路径是该卷根下的路径。每个驱动器号都显示为指向其所在卷的符号链接。您可能会发现其他熟悉的设备,比如CON
和NUL
。
注意:在大多数应用程序中,您不能使用此类路径访问文件或目录。只有某些低级系统组件设计为与对象管理器路径配合使用。
这解释了您的屏幕截图中的ExistingPageFiles
,但不是PagingFiles
。PagingFiles
包含您的虚拟内存设置,其中页面文件的路径以正常路径表示。如果您的系统设置为自行管理所有虚拟内存设置,则该条目不会指定驱动器号(仅指定文件名和路径),因此?
只是页面文件最终所在的驱动器的占位符。
总而言之,是的,这些问号应该存在。
进一步阅读:NT 对象管理器内部,对象管理器 (Windows),Win32 到 NT 路径转换的权威指南,Windows Internals 第六版第 1 部分第 174 页
视频:NT对象管理器在微软的 Channel 9
答案2
我似乎记得在使用 DOS cmd 文件查询时,问号表示单字符通配符。我对双问号一无所知,除非它只是表示带有 2 个连续通配符的路径的一部分。希望这能有所帮助。
例如,?: 可能是 C: 或 D:,而 \d*\ 则不同,后者表示 d 字符,后面可以跟任意数量和类型的字母或数字,例如 \dr\ 或 \d2165thingy\
尝试提供帮助,因为根据我的经验,?:符号指的是在 DOS 3 及更高版本中运行该命令时识别的任何驱动器。
答案3
我见过\?\C:\...
很多使用路径来访问长度超过 260 个字符的文件/路径的情况。至少在处理 Win32 API 调用时。虽然屏幕截图中的结构略有不同,但我可以放心地假设它们的行为是相似的。或者,也可能是 Win32 API(从此注册表项读取值时)会自动用适当的值替换这些“变量”。
Windows API 中有许多函数也有 Unicode 版本,允许扩展长度的路径,最大路径总长度为 32,767 个字符。此类路径由用反斜杠分隔的组件组成,每个组件的长度不超过 GetVolumeInformation 函数的 lpMaximumComponentLength 参数返回的值(此值通常为 255 个字符)。要指定扩展长度的路径,请使用“
\\?\
”前缀。例如,“\\?\D:\very long path
”。