Как программно получить доступ к целевому пути для символической ссылки Windows?

Windows 6 (Vista и Server 2008) поддерживает правильные символические ссылки, которые могут быть созданы с помощью функции CreateSymbolicLink. Но, похоже, не существует соответствующей функции для опроса символической ссылки для получения пути к цели ссылки.

Я обнаружил, что символические ссылки представляют собой реализацию точек повторной обработки, поэтому функции точки повторной обработки могут использоваться для получения целевого пути. Но заголовочные файлы, которые мне нужны для использования точек повторной обработки, как представляется, поставляются с набором драйверов для Windows. Настройка этого набора с VS2008 представляется нетривиальной задачей.

Есть ли простая простая функция, которую я пропустил для получения целевой ссылки, или мне действительно нужно настроить среду разработки драйверов Windows, чтобы написать код для доступа к этой информации?

EDIT: Адам Миц придумал предложение GetFinalPathNameByHandle. Эта функция отлично подходит для локальных символических ссылок, но не работает для решения удаленных ссылок (через UNC-путь).

РЕДАКТИРОВАТЬ 2: При запросе Ада вот подробности о том, что я пробовал:

Сначала я спустился по маршруту FSCTL_GET_REPARSE_POINT/DeviceIoControl, но это дает структуру REPARSE_DATA_BUFFER. Заголовки, которые определяют эту структуру, похоже, существуют только в комплекте драйверов Windows.

GetFinalPathNameByHandle() отлично работает, когда ссылка существует на локальном диске (C:\...\link и т.д.). Любопытно, что я обнаружил, что могу получить дескриптор ссылки - и, таким образом, получить цель - используя CreateFileW(), был ли указан флаг FILE_FLAG_OPEN_REPARSE_POINT или нет, независимо от того, существует ли целевой файл.

Когда CreateFileW() и GetFinalPathNameByHandle() используются для опроса удаленной ссылки, хотя (\\?\UNC\....), все начинает распутываться. Если указано FILE_FLAG_OPEN_REPARSE_POINT, GetFinalPathNameByHandle() всегда возвращает путь ссылки, а не целевой путь. Если FILE_FLAG_OPEN_REPARSE_POINT не указано, возвращается целевой путь, но только если цель существует и находится на том же компьютере, что и ссылка. Если ссылка указывает на другую машину, я получаю ошибку сетевых разрешений. Если ссылка указывает на локальный - несуществующий файл, я получаю файл, который не найден.

Ответ 1

GetFinalPathNameByHandle

Последний путь - это путь, который возвращается, когда путь полностью решена. Например, для символического ссылка с именем "C:\tmp\mydir", которая указывает на "D:\yourdir", окончательную файловую систему путь будет "D:\yourdir".