Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать DOS имя файла из native имени?  (Прочитано 8739 раз)
0 Пользователей и 1 Гость смотрят эту тему.
l_sunny
Участник

ru
Offline Offline

« : 26-11-2009 15:46 » 

Помогите получить путь к файлу типа с:\folder\file.exe из пути \Device\HarddiskVolume1\folder\file.exe
То есть узнать DOS имя файла из native имени, а то юзеру стыдно показать такой путь, ведь все привыкли к именам, начинающемся с буквы.

Немного я раскопал:
Символьные ссылки  на устройства типа \Device\HarddiskVolume1 или \Device\CdRom0 можно узнать послав запрос  IOCTL_MOUNTMGR_QUERY_POINTS к устройству монтирования MOUNTMGR_DEVICE_NAME.
Но если файл с флешки, то полный путь будет типа \Device\Harddisk1\DP(1)0-0+3\folder\file.exe
А для \Device\Harddisk1\DP(1)0-0+3 уже нельзя получить символьные ссылки тем же способом. [IoCallDriver() выдаёт ошибку STATUS_OBJECT_NAME_NOT_FOUND]

Я уж молчу про файлы, которые лежат на сетевых дисках, там пути в native формате ещё круче.
Символьные ссылки на сетевые диски отсутствуют даже в разделе реестра HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices. 
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-11-2009 19:30 » 

а так искать не пробовали?Ага
http://www.google.com/search?hl=ru&q=%22\Device\HarddiskVolume1\%22&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=

посмотрите среди ZwQueryInformationFile, IoQueryFileDosDeviceName, ZwQueryVolumeInformationFile
ЗЫ не уверен что это то что надо, но думаю направление поиска примерно такое должно быть.

http://x64.blog.ru/51061171.html неплохая статейка...хм. пожалуй в список литературы добавлю)
« Последнее редактирование: 30-11-2009 20:15 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
l_sunny
Участник

ru
Offline Offline

« Ответ #2 : 05-12-2009 10:24 » 

IoQueryFileDosDeviceName функция подошла бы, но для неё надо знать PFILE_OBJECT, а есть только имя файла и PID, x64 в своём блоге писал, что есть какой-то непростой способ получить FILE_OBJECT зная PID, но так и не описал его. Кстати в статье http://x64.blog.ru/51061171.html описано обратное преобразование.

Уже решил проблему, но ничего умнее не нашёл, как перечисляя все буквы дисков от A до Z найти для каждой из них путь вида \Device\... с помощью ZwOpenSymbolicLinkObject ZwQuerySymbolicLinkObject. А потом этот путь сравнивать с началом моего пути. Конечно не самый быстрый способ, но работает.
Единственная тонкость: файл, запущеный из сети с расшареного ресурса, имеет начало: \Device\LanmanRedirector\%comp_name%. Здесь "\Device\LanmanRedirector" надо заменять на "\".
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 05-12-2009 16:15 » 

Не совсем понял, при чем тут PID... возможно, подойдет что-то типа:
http://www.wasm.ru/article.php?article=drvw2k15
     InitializeObjectAttributes( &oa, pusObjectName, ... )
     ZwOpenFile( &hFile, DesiredAccess, &oa, ... )
     ObReferenceObjectByHandle( hFile, 0, IoFileObjectType, KernelMode, &pFileObject, NULL )
« Последнее редактирование: 07-12-2009 17:18 от Sel » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines