RtlDosPathNameToNtPathName_U для "\\? \ C:" возвращает неверный путь - PullRequest
2 голосов
/ 13 марта 2011

Почему когда я звоню RtlDosPathNameToNtPathName_U по пути \\?\C:, вместо того, чтобы вернуться

\??\C:

Я вернусь

\??\C:\฀\\?\C:

что явно неверно?


Фрагмент кода (в D):

struct CurDir { UnicodeString DosPath; HANDLE Handle; }

extern (Windows) static bool RtlDosPathNameToNtPathName_U(
    in const(wchar)* DosPathName, out UnicodeString NtPathName,
    out const(wchar)* NtFileNamePart, out CurDir DirectoryInfo);

wchar[] toNtPath(const(wchar)[] path)
{
    UnicodeString ntPath;
    CurDir curDir;
    const(wchar)* fileNamePart;
    enforce(RtlDosPathNameToNtPathName_U(path.ptr, ntPath,
        fileNamePart, curDir));
    try
    { return ntPath.Buffer[0 .. ntPath.Length / ntPath.Buffer[0].sizeof].dup; }
    finally { RtlFreeHeap(RtlGetProcessHeap(), 0, ntPath.Buffer); }
}

writeln(toNtPath(r"\\?\C:"));   //Returns the weird string

Обновление:

Я выяснил проблему - см. Мой ответ.

Ответы [ 2 ]

10 голосов
/ 13 марта 2011

RtlDosPathNameToNtPathName_U дает вам правильный вывод.Причина, по которой вы видите странно выглядящий символ в середине, заключается в том, что UNICODE_STRING s не должны быть завершены нулем (что, я уверен, вы уже знаете).Имя файла \??\C:\ - это полностью допустимое имя файла в собственном формате.Я подозреваю, что вы действительно хотите добавить имя устройства вместо того, чтобы просто ссылаться на каталог GLOBAL??, как это делал RtlDosPathNameToNtPathName_U.

Чтобы сделать это, просто позвоните NtQuerySymbolicLinkObject на \??\x:,где x - буква диска, которую использует путь, и добавьте результат.Если это UNC-путь, добавьте \Device\Mup.И так далее для других типов путей (если они есть).

0 голосов
/ 13 марта 2011

Я сам решил проблему с помощью @ wj32: я совершенно забыл, что входные данные до RtlDosPathNameToNtPathName_U должны быть завершены нулем, и мой код не справился с этим должным образом.Спасибо всем за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...