Всегда ли строка "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 = "\??\"