Всегда ли строка "SubstituteName" в PathBuffer структуры REPARSE_DATA_BUFFER всегда начинается с префикса "\??\", и ​​если да, то почему?

Я пытаюсь использовать функции Windows API, совместимые с Windows XP и выше, чтобы найти цель соединения или символической ссылки. Я использую CreateFile для получения дескриптора точки повторной обработки, затем DeviceIoControl с флагом FSCTL_GET_REPARSE_POINT для чтения данных повторной обработки в REPARSE_DATA_BUFFER. Затем я использую смещения и длины в буфере для извлечения строк SubstituteName и PrintName. В Windows 8 извлечение PrintName работает отлично, давая мне нормальный путь (например, c:\filename.ext), но в XP раздел PrintName в REPARSE_DATA_BUFFER, кажется, всегда имеет длину 0, оставляя меня с пустой строкой. Использование SubsituteName, кажется, работает в обоих случаях, но я всегда получаю префикс \??\ в начале пути к файлу (то есть \??\c:\filename.ext). (как примечание, запрос точки повторного сопоставления fsutil также показывает префикс \??\). Я прочитал большую часть документации по MSDN, но не могу найти объяснения этого префикса. Если префикс гарантированно начинается с каждого SubstituteName, тогда я могу просто исключить первые четыре символа, когда копирую путь к файлу из буфера, но я не уверен, что это так. Я хотел бы знать, если префикс "\??\" появляется в SubstituteName для всех точек повторной обработки Microsoft и почему.

2 ответа

Решение

Ядро Windows имеет "пространство имен устройств DOS" \DosDevices\ который в основном где- нибудь, что вы можете открыть с CreateFile проживает. (QueryDosDevice это функция, которая дает вам все члены этого пространства имен.)

Потому что это такой часто используемый путь, \??\ также перенаправляет в это пространство имен. Итак, к ядру, путь C:\Windows неверно - это действительно должно быть написано как-то \??\C:\Windows, Вот откуда эта запись.

\??\ префикс означает, что путь не анализируется. Это не гарантируется для каждого имени, поэтому вам придется искать префикс для каждого имени и пропускать его при его наличии.

Обновление: я не мог найти никакой определенной документации, объясняющей точно, что \??\ на самом деле представляет, но вот некоторые ссылки, которые упоминают \??\ префикс в действии:

http://www.flexhex.com/docs/articles/hard-links.phtml

Обратите внимание, что строка szTarget должна содержать путь с префиксом "непарсированный" префикс "\??\" и заканчиваться символом обратной косой черты, например "\?? \ C: \ Some Dir \".

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/908b3927-1ee9-4e03-9922-b4fd49fc51a6

http://mjunction.googlecode.com/svn-history/r5/trunk/MJunction/MJunction/JunctionPoint.cs

Этот префикс указывает NTFS, что этот путь следует рассматривать как не интерпретированный путь в виртуальной файловой системе.

Закрытое Const NonInterpretedPathPrefix As String = "\??\"

Другие вопросы по тегам