2

我正在尝试使用与 Windows XP 及以上兼容的 Windows API 函数来查找联结或符号链接的目标。我CreateFile用来获取重解析点的句柄,然后DeviceIoControl使用FSCTL_GET_REPARSE_POINT标志将重解析数据读入REPARSE_DATA_BUFFER. 然后,我使用缓冲区中的偏移量和长度来提取SubstituteNamePrintName字符串。

在 Windows 8 中,完美地提取PrintName作品,给我一个正常的路径(即c:\filename.ext),但在 XP 中,该PrintName部分的REPARSE_DATA_BUFFER长度似乎总是为 0,给我留下一个空字符串。

使用SubsituteName似乎在两者中都有效,但我总是\??\在文件路径的开头加上前缀(即\??\c:\filename.ext)。(作为旁注,也fsutil reparsepoint query显示\??\前缀)。

我已经阅读了 MSDN 上的大部分文档,但我找不到这个前缀的任何解释。如果保证前缀从每个 开始SubstituteName,那么当我从缓冲区复制文件路径时,我可以排除前四个字符,但我不确定是否是这种情况。我很想知道"\??\"前缀是否出现在SubstituteName所有 Microsoft 重新分析点中以及为什么。

4

2 回答 2

0

\??\前缀表示不解析路径。不能保证每个名称都有,因此您必须根据每个名称查找前缀,如果存在则跳过它。

更新:我找不到任何确切解释\??\实际代表的确切文档,但这里有一些链接提到了实际使用的\??\前缀:

http://www.flexhex.com/docs/articles/hard-links.phtml

请注意,szTarget 字符串必须包含以“未解析”前缀“\??\”为前缀的路径,并以反斜杠字符结尾,例如“\??\C:\Some Dir\”。

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/908b3927-1ee9-4e03-9922-b4fd49fc51a6

http://mjunction.googlecode.com/svn-history/r5/trunk/MJunction/MJunction/JunctionPoint.cs

此前缀向 NTFS 指示该路径将被视为虚拟文件系统中的非解释路径。

Private Const NonInterpretedPathPrefix As String = "\??\"

于 2013-01-15T03:49:32.483 回答
0

Windows 内核有一个“DOS 设备名称空间” \DosDevices\,基本上是您可以打开的任何东西CreateFile所在的位置。(QueryDosDevice是一个为您提供该命名空间的所有成员的函数。)

因为它是一个常用的路径,所以\??\也会重定向到那个命名空间。所以,对于内核来说,路径C:\Windows是无效的——它真的应该写成\??\C:\Windows. 这就是这个符号的来源。

于 2013-01-15T04:03:10.767 回答