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
не указано, целевой путь возвращается, но только если целевой объект существует и находится на том же компьютере, что и ссылка. Если ссылка указывает на другую машину, я получаю ошибку сетевых разрешений. Если ссылка указывает на локальный - несуществующий - файл, я получаю ошибку "файл не найден".