Как получить программный доступ к целевому пути символьной ссылки Windows? - PullRequest
12 голосов
/ 21 октября 2008

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

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

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

РЕДАКТИРОВАТЬ: Адам Миц выдвинул предложение GetFinalPathNameByHandle. Эта функция прекрасно работает с локальными символическими ссылками, но, похоже, не работает для разрешения удаленных ссылок (по пути UNC).

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

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

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

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

1 Ответ

13 голосов
/ 21 октября 2008

GetFinalPathNameByHandle

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

...