WinAPI和NTFS:读取更长的路径

WinAPI和NTFS:读取更长的路径,winapi,ntfs,Winapi,Ntfs,NTFS允许在完全限定路径中最多包含32k个字符。出于兼容性原因,WinAPI只允许完整路径减去文件名最多248个字符,总共255个字符。是否有任何方法可以使用DeviceIOControl()绕过此限制并读取任何可能更长的路径字符串?如果可能的话,有没有办法获得完整路径名超过255个字符的文件的句柄?内核32中大多数基于文件/路径的函数都支持更长的路径,至少从Windows 2000开始,如果您使用 例如,如果查看MSDN上的CreateFile,它会说: 在该函数的ANSI版本中,名称仅限于

NTFS允许在完全限定路径中最多包含32k个字符。出于兼容性原因,WinAPI只允许完整路径减去文件名最多248个字符,总共255个字符。是否有任何方法可以使用
DeviceIOControl()
绕过此限制并读取任何可能更长的路径字符串?如果可能的话,有没有办法获得完整路径名超过255个字符的文件的句柄?

内核32中大多数基于文件/路径的函数都支持更长的路径,至少从Windows 2000开始,如果您使用

例如,如果查看MSDN上的
CreateFile
,它会说:

在该函数的ANSI版本中,名称仅限于MAX_路径字符。要将此限制扩展到32767个宽字符,请调用Unicode版本的函数,并在路径前加上“\\?\”

如果将longPathAware标记添加到清单或更改计算机组策略,则Windows 10版本1607(周年更新)及更高版本允许您访问更长的路径,而无需前缀


shell的一部分,
CreateProcess
LoadLibrary
不支持>最大路径,无论您做什么。

Windows 10现在支持长文件名。。。如果您为此双重选择,请使用注册表项和应用程序清单元素,如下所述:。请注意,我链接到的部分建议您可以使用注册表项或manifest元素来启用长路径,但事实并非如此。您必须同时使用这两个选项。“如果您将longPathAware标记添加到清单中”——在@eryksun向我指出的一个类似问题上,longPathAware标记本身不足以启用长路径。您必须设置注册表值“HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathEnabled(类型:REG\U DWORD”除了manifest标记之外。MSDN引用在这方面是不精确的。我想这同样适用于组策略;除非您也有manifest标记,否则它不会有任何效果。我认为即使没有manifest标记,策略也可以工作。我已经测试了一段时间,所以我可能是错误的。实现已更改。例如1607年仅检查注册表,1709年在ntdll.dll的用户模式运行库中实现文件路径处理和Unicode转换。历史上,这两种方法都仅限于
MAX_path
,因为其目的只是提供与传统DOS的兼容性(例如,支持“NUL”等DOS设备)、Windows 3.x和Windows 9x应用程序。NT 4添加了对“\\?\”前缀的支持,该前缀允许绕过Unicode路径的所有路径规范化,以避免旧式DOS路径规则和限制。代价是失去对相对路径的支持、将正斜杠用作路径分隔符,以及必须将“\\?\UNC”设备用于UNC路径。