HANDLE
От: Аноним  
Дата: 31.05.04 06:23
Оценка:
Имеется хендл открытого файла. Можно ли по нему узнать имя и путь этого файла?
Re: HANDLE
От: AlexandrN Россия  
Дата: 31.05.04 06:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеется хендл открытого файла. Можно ли по нему узнать имя и путь этого файла?

DWORD GetModuleFileName(
    HMODULE hModule,    // handle to module to find filename for 
    LPTSTR lpFilename,    // pointer to buffer for module path 
    DWORD nSize     // size of buffer, in characters 
   );
С уважением.
AlexandrN
Re[2]: HANDLE
От: Denis Titov Россия  
Дата: 31.05.04 07:42
Оценка:
Здравствуйте, AlexandrN, Вы писали:

AN>Здравствуйте, Аноним, Вы писали:


А>>Имеется хендл открытого файла. Можно ли по нему узнать имя и путь этого файла?

AN>
AN>DWORD GetModuleFileName(
AN>    HMODULE hModule,    // handle to module to find filename for 
AN>    LPTSTR lpFilename,    // pointer to buffer for module path 
AN>    DWORD nSize     // size of buffer, in characters 
AN>   );
AN>


Да ну, что вы. Это HMODULE это дескриптор запущенного приложения (или DLL), а совсем не открытого файла. Не поможет здесь GetModuleFileName.

В NT были какие-то системные функции, названия, пардон, не помню. Можно поискать по форуму, такая тема уже поднималась.
Re: HANDLE
От: Foxhunter  
Дата: 31.05.04 07:54
Оценка:
NtQueryInformationFile(..., FileNameInformation);

wrote in message news:659706@news.rsdn.ru...
From:

Имеется хендл открытого файла. Можно ли по нему узнать имя и путь этого файла?

HANDLE Оценить
Posted via RSDN NNTP Server 1.9 alpha
Re: HANDLE
От: Vamp Россия  
Дата: 31.05.04 08:37
Оценка:
Можно — через MapViewOfFile. Подробнее не скажу — MSDN на машине не стоит. Но идея именно такая.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: HANDLE
От: Аноним  
Дата: 31.05.04 11:16
Оценка: -3
F>NtQueryInformationFile(..., FileNameInformation);

Нет такой функции, однако.
Re[3]: HANDLE
От: Аноним  
Дата: 31.05.04 12:09
Оценка:
Здравствуйте, Аноним, Вы писали:


F>>NtQueryInformationFile(..., FileNameInformation);


А>Нет такой функции, однако.


Ntdll.dll
5.1.2600.1217 (xpsp2.030429-2131)


E       Ordinal          Hint           Function                Entry Point
C       236(0x00ec)      228 (0x00e4)   NtQueryInformationFile  0x0000BDA8
Re: HANDLE
От: Pavel Dvorkin Россия  
Дата: 31.05.04 12:12
Оценка:
Привет!

Unknown wrote:
>
> Имеется хендл открытого файла. Можно ли по нему узнать имя и путь этого файла?

Только недокументированными средствами.

NtQueryInformationFile из ntdll.dll, класс информации
FileNameInformation


--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[2]: HANDLE
От: Vamp Россия  
Дата: 31.05.04 12:29
Оценка:
PD>Только недокументированными средствами.
Да ну?
Эх...
std::vector<char> get_name_by_handle(HANDLE h) {
HANDLE h_map=CreateFileMapping(h, NULL, PAGE_READONLY, 0, 0, NULL);
void* h_view=MapViewOfFile(h_map, FILE_MAP_READ, 0, 0, 0);
std::vector<char> str;
str.resize(MAX_PATH+1);
GetMappedFileName(GetCurrentProcess(), h_view, str.begin(), str.size());
return str;
}


Обработку ошибок и закрытие хендлов оставляю в качестве домашней работы.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: HANDLE
От: TarasCo  
Дата: 31.05.04 13:38
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Привет!


PD>Unknown wrote:

>>
>> Имеется хендл открытого файла. Можно ли по нему узнать имя и путь этого файла?

PD>Только недокументированными средствами.


PD>NtQueryInformationFile из ntdll.dll, класс информации

PD>FileNameInformation

С чегой то NtQueryInformationFile попала в класс недокументированных? Учитывая, что NtQueryInformationFile является шлюзом к вызову ядра ZwQueryInformationFile, которая как раз документирована в DDK, стоит ее признать "условно документированной"
Да пребудет с тобою сила
Re[3]: HANDLE
От: Lonely Dog Россия  
Дата: 31.05.04 14:17
Оценка:
Здравствуйте, TarasCo, Вы писали:


TC>С чегой то NtQueryInformationFile попала в класс недокументированных? Учитывая, что NtQueryInformationFile является шлюзом к вызову ядра ZwQueryInformationFile, которая как раз документирована в DDK, стоит ее признать "условно документированной"

Тогда уж, условно-досрочной.
Re[3]: HANDLE
От: Andrew S Россия http://alchemy-lab.com
Дата: 31.05.04 20:51
Оценка:
PD>>Только недокументированными средствами.
V>Да ну?
V>Эх...
V>
V>std::vector<char> get_name_by_handle(HANDLE h) {
V>HANDLE h_map=CreateFileMapping(h, NULL, PAGE_READONLY, 0, 0, NULL);
V>void* h_view=MapViewOfFile(h_map, FILE_MAP_READ, 0, 0, 0);
V>std::vector<char> str;
V>str.resize(MAX_PATH+1);
V>GetMappedFileName(GetCurrentProcess(), h_view, str.begin(), str.size());
V>return str;
V>}
V>


V>Обработку ошибок и закрытие хендлов оставляю в качестве домашней работы.


Ну вот, приехали... И что — прикажете psapi.dll за собой в качестве redistr таскать?

Windows NT/2000 or later: Requires Windows NT 4.0 or later.
Header: Declared in Psapi.h.
Library: Use Psapi.lib.


На мой взгляд, метод с ZwQueryInformationFile гораздо удобнее и переносимее... Хотя, конечно, метод интересный
Впрочем, на вкус и цвет... Впрочем, это все уже тут обсуждалось и не раз, и насколько я помню, был даже показан способ получать это имя под 9х.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[4]: HANDLE
От: Denis Titov Россия  
Дата: 01.06.04 03:11
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Здравствуйте, TarasCo, Вы писали:



TC>>С чегой то NtQueryInformationFile попала в класс недокументированных? Учитывая, что NtQueryInformationFile является шлюзом к вызову ядра ZwQueryInformationFile, которая как раз документирована в DDK, стоит ее признать "условно документированной"

LD>Тогда уж, условно-досрочной.

Я перекрывал функции CreateFile и CloseHandle для своего процесса, и вел таблицу соответствия между хэндлом и именем файла. Работало и в Win95-98 и WinNT-2k-xp. Но это только для хэндлов "родного" процесса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.