Форум: "Начинающим";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];
ВнизПрефикс ?? в файловых путях Найти похожие ветки
← →
Riply © (2007-10-24 14:44) [0]Здравствуйте !
Объясните, пожалуйста, какую смысловую нагрузку несет этот префикс ?
Зачем его надо добавлять к путям для некоторых функций ?
Некузяво спросила, но как иначе не знаю.
← →
Reindeer Moss Eater © (2007-10-24 14:46) [1]Все наоборот.
есть приложения не понимающие UNC имен и требующие чтобы имя файла начиналось с имени диска.
← →
Riply © (2007-10-24 14:51) [2]> [1] Reindeer Moss Eater © (24.10.07 14:46)
> Все наоборот.
> есть приложения не понимающие UNC имен и требующие чтобы имя файла начиналось с имени диска.
Может быть. Но есть и такие, что подавай им \??\ и все тут.
Иначе отказываются работать. Тунеядцы какие-то :)
Вот мне и интересно, что они с ним внутри себя делают ?
← →
Ins © (2007-10-24 14:54) [3]
> Вот мне и интересно, что они с ним внутри себя делают ?
Разве это не символьная ссылка? Т.е. внутри \??\C: преобразуется в \Device\HarddiskVolume1 - настоящий путь в пространстве имен объектов
← →
umbra © (2007-10-24 14:55) [4]
> подавай им \??\ и все тут
это может быть устройство, а не файл. Точнее, это может быть точка входа для общения с каким-нибудь драйвером
← →
Ins © (2007-10-24 14:57) [5]Хотя нет, вроде не ссылка, а реальная директория, которая уже действительно содержит символьные ссылки.
← →
Ins © (2007-10-24 14:58) [6]Вообще - вот утилита вам в помощь:
http://www.microsoft.com/technet/sysinternals/SystemInformation/WinObj.mspx
← →
Riply © (2007-10-24 15:10) [7]Еще я в какой-то статье(не могу ее найти) видела примерно следующее:
там была функция, которая могла принимать на входе путь как с \??\ так и без него.
И автор говорил, что "как опытные люди, мы сами будем добавлять \??\".
Тогда меня это не заинтересовало. А сейчас хочу знать "а зачем" ? Что это меняет ?
← →
Ins © (2007-10-24 15:16) [8]
> Riply © (24.10.07 15:10) [7]
Возможно некоторые функции и так знают, что если не указано иного, то нужно искать объект в DosDevices (DosDevices - это как раз символьная ссылка на ??\). Другим же это нужно явно указать.
Почитайте про пространство имен объектов, у меня сейчас к сожелению под рукой нет ничего, так что конкретно сказать не могу.
← →
Leonid Troyanovsky © (2007-10-24 15:24) [9]
> Riply © (24.10.07 15:10) [7]
> Тогда меня это не заинтересовало. А сейчас хочу знать "а
> зачем" ? Что это меняет ?
http://msdn2.microsoft.com/en-us/library/aa365247.aspx
--
Regards, LVT.
← →
Riply © (2007-10-24 15:45) [10]> [9] Leonid Troyanovsky © (24.10.07 15:24)
> http://msdn2.microsoft.com/en-us/library/aa365247.aspx
Спасибо. Т.е. \??\, кроме всего прочего, еще и сообщает функции,
что мы с путем особо не выкрутасничали и его можно использовать
"as is" почти без преобразований ?
← →
Leonid Troyanovsky © (2007-10-24 16:17) [11]
> Riply © (24.10.07 15:45) [10]
> Спасибо. Т.е. \??\, кроме всего прочего, еще и сообщает
Я только что заметил, что не \\?\, а \??\.
А что на самом деле имелось ввиду?
--
Regards, LVT.
← →
Игорь Шевченко © (2007-10-24 16:28) [12]Наверное это легко проверить, вызвав RtlDosPathNameToNtPathName с обоими вариантами (с префиксом и без него)
← →
Ins © (2007-10-24 16:39) [13]
> Я только что заметил, что не \\?\, а \??\.
Префикс \\?\ насколько мне известно указывается для того, чтобы преодолеть лимит MAX_PATH, а \??\ имеет совсем другой смысл. Это явное задание пути к объекту-устройство, чей драйвер будет использован в операциях ввода-вывода.
← →
Игорь Шевченко © (2007-10-24 16:49) [14]Ins © (24.10.07 16:39) [13]
> \??\ имеет совсем другой смысл. Это явное задание пути к
> объекту-устройство, чей драйвер будет использован в операциях
> ввода-вывода.
Это вообще-то название бывшего каталога объектов DosDevices. То есть, все, что доступно через \??\ (с включенным терминальным доступом через \GLOBAL??\ доступно и через обычные вызовы функций.
← →
Ins © (2007-10-24 16:55) [15]
> Это вообще-то название бывшего каталога объектов DosDevices.
> То есть, все, что доступно через \??\ (с включенным терминальным
> доступом через \GLOBAL??\ доступно и через обычные вызовы
> функций.
Ну да, я как раз на протяжении предыдущих постов [3],[5],[6],[8] пытался вспомнить что там к чему и связать это все воедино. Глубоко с этим дела не имел, спасибо за разъяснение.
← →
Игорь Шевченко © (2007-10-24 17:32) [16]Ins © (24.10.07 16:55) [15]
Я к чему - когда мне надо явно было открыть файл, которого при всем желании нету в каталоге объектов \??, использовал исключительно NtCreateFile, которая воспринимает истинные имена объектов.
Собственно, пример этого открытия - в приложении к статье
http://www.delphimaster.ru/articles/named_pipes/index.html
← →
Ins © (2007-10-24 17:54) [17]
> которого при всем желании нету в каталоге объектов \??
А это каких? Как я понял \Device\MailSlot и \Device\NamedPipe? Так они есть. Точнее ссылки на них. MAILSLOT и PIPE соответственно.
← →
Игорь Шевченко © (2007-10-24 18:00) [18]
> А это каких? Как я понял \Device\MailSlot и \Device\NamedPipe?
> Так они есть. Точнее ссылки на них. MAILSLOT и PIPE соответственно.
>
А может, где-то не было ? Оно ж давно писалось
← →
Ins © (2007-10-24 19:02) [19]Ну вот, добрался до дома, до Руссиновича, Delphi, MSDN, WinObj и подальше от злобного взгляда начальства :) Теперь можно и пообсуждать.
> А может, где-то не было ? Оно ж давно писалось
Даже если бы не было, имхо, можно было бы воспользоваться таким видом имени: "\\.\pipe\..." Оно было бы оттранслировано в настоящее. Правда, у Руссиновича сказано, что \\.\ транслируется в тот самый \??\, в котором символьная ссылка на объект-устройство создается при создании того самого объекта-устройства. Так что видимо было. Рискну предположить, что вы не нашли его потому что искали по имени NamedPipe, по крайней мере я именно из-за этого нашел не сразу.
А вообще спасибо что внесли некоторую ясность, не вредно было послушать, заглянуть в книги и исходники. Есть подозрение, что в ближайшем будущем мне может это понадобится.
← →
Ins © (2007-10-25 00:31) [20]
> Игорь Шевченко ©
В общем, возможно вы будете смеяться, но этот код похоже что работает :)procedure PipeList(List: TStrings);
var
SearchRec: TSearchRec;
begin
List.Clear;
if FindFirst("\\.\pipe\*",faAnyFile,SearchRec) = 0 then begin
try
repeat
List.Add(SearchRec.Name);
until FindNext(SearchRec) <> 0;
finally
FindClose(SearchRec);
end;
end;
end;
← →
Riply © (2007-10-25 07:13) [21]> [12] Игорь Шевченко © (24.10.07 16:28)
> Наверное это легко проверить, вызвав RtlDosPathNameToNtPathName с обоими
> вариантами (с префиксом и без него)
Попробовала и совсем запуталась.
Берем путь "E:\TestDir", смотрим его "тип"
(RtlDetermineDosPathNameType_U), получаем - RtlPathTypeDriveAbsolute.
RtlDosPathNameToNtPathName преобразует его в "\??\E:\TestDir" и тип становиться RtlPathTypeRooted.
Вроде все нормально, но если еще раз вызвать RtlDosPathNameToNtPathName с полученным значением,
то она выдаст "\??\E:\??\E:\TestDir".
Какая то "неправильная" функция.
Может я с ней не умею работать ?
Поясните, пожалуйста, с чем едят ее последние два параметра ?
И раз уж такое дело, еще вопрос:
По Rtl функции работающей со строками, трудно интутивно понять,
надо ли после ее использования "освобождать память" или нет.
Я для этого либо лезу в ReactOS, либо варварски пробую освободить,
смотрю есть ли исключение и делаю выводы :).
Может есть другие способы определения необходимости освобождать память
(кроме как среди ее параметров есть один определяющий выделять память или нет)?.
Как можно контролировать подобные "утечки" ?
ReportMemoryLeaksOnShutDown - не помошник, что и не удивительно :)
> [20] Ins © (25.10.07 00:31)
> В общем, возможно вы будете смеяться, но этот код похоже что работает :)
А почему "смеяться" ? Я так давно Pipe`ы перебираю. Это не правильно ?
> [19] Ins © (24.10.07 19:02)
> Ну вот, добрался до дома, до Руссиновича, Delphi, MSDN, WinObj и подальше от злобного взгляда начальства :)
> Теперь можно и пообсуждать.
:) А вот некоторым (не будем тыкать пальцем ) этого удовольствия не понять,
ибо они сами начальство и всегда могут заниматься тем, что им интересно :)
← →
Игорь Шевченко © (2007-10-25 09:51) [22]Ins © (24.10.07 19:02) [19]
> Рискну предположить, что вы не нашли его потому что искали
> по имени NamedPipe, по крайней мере я именно из-за этого
> нашел не сразу
Я могу открыть страшную тайну - я даже не искал по имени, я посмотрел, как сделано у Руссиновича - pipelist с исходниками был :)
← →
Ins © (2007-10-25 10:39) [23]
> По Rtl функции работающей со строками, трудно интутивно
> понять,
> надо ли после ее использования "освобождать память" или
> нет.
Если не ошибаюсь, Rtl-функции работают в user-mode, мне когда-то тоже нужно было убедиться, что память действительно выделяется, для этого поставил Break Point, нажал Ctrl+Alt+C, прогнал по строкам пока не наткнулся на вызов RtlAllocateHeap
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.043 c