能否仅通过带FILE_OPEN_REPARSE_POINT打开的符号链接句柄打开其目标?
问题
通过NtCreateFile并指定FILE_OPEN_REPARSE_POINT参数打开符号链接的句柄后,仅依靠该句柄能否打开此链接指向的目标对象?
我原本希望Windows能像未指定FILE_OPEN_REPARSE_POINT参数那样自动处理该重解析点,于是尝试调用NtCreateFile时省略FILE_OPEN_REPARSE_POINT,将RootDirectory设为该符号链接句柄,ObjectName设为空字符串。这种方式对非重解析点句柄有效(无需再次路径查找即可重新打开同一目录),但对符号链接句柄会失败,错误码为STATUS_IO_REPARSE_DATA_INVALID。
回答
仅靠这个符号链接句柄无法直接让Windows自动解析并打开目标对象,具体原因和解决方案如下:
原因分析
- 当使用
FILE_OPEN_REPARSE_POINT打开符号链接时,获取到的句柄仅关联符号链接本身,而非其指向的目标对象。该句柄仅能操作符号链接的元数据,不包含自动解析目标的逻辑。 - 你尝试的将符号链接句柄作为
RootDirectory、ObjectName设为空的调用方式,本质是请求重新打开句柄对应的对象,但符号链接不属于可被“重新解析为目标”的容器类对象,系统无法从该句柄中提取有效重解析数据完成跳转,因此返回STATUS_IO_REPARSE_DATA_INVALID错误。
可行方案
要获取目标对象的句柄,需要分两步操作:
- 读取符号链接的目标路径:调用
DeviceIoControl,传入FSCTL_GET_REPARSE_POINT控制码,从当前符号链接句柄中读取重解析数据,解析出目标路径。 - 重新打开目标对象:拿到目标路径后,调用
NtCreateFile(不指定FILE_OPEN_REPARSE_POINT参数)打开目标对象。若目标路径为相对路径,需基于原符号链接的父目录进行处理。
注意:针对跨卷、权限受限的符号链接目标,需要确保读取重解析数据和打开目标时拥有足够的权限,避免操作失败。
内容的提问来源于stack exchange,提问作者anr2394
相关产品推荐
相关产品推荐

