· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› У меня trabl. FileName from handle

Посл.отвђт Сообщенiе


Дата: Сен 2, 2004 19:08:16

У меня trabl. FileName from handle
Всем привет.У меня проблема.Мне нужно получить имя файла
имея его handle.Вообще насколько это реально я не знаю.Сейчас ковыряю в таком направлении:
ZwQueryInformationFile(FileHandle,&IoStatusBlockQ,&FileInformation,\
sizeof(FILE_NAME_INFORMATION),FileNameInformation);

text_2 = (PCHAR)ExAllocatePool(NonPagedPool ,FileInformation.FileNameLength+1);
if(text_2 != NULL)
{
// memset(text_2,0,FileInformation.FileNameLength+1);
RtlFillMemory(text_2,FileInformation.FileNameLength+1,0);
// memcpy(text_2,FileInformation.FileName,FileInformation.FileNameLen gth);
RtlCopyMemory(text_2,FileInformation.FileName,FileInformation.FileNa meLength);
DbgPrint("\nHookReadFile:\n\tPID:%lu\nFileName:%s\n",PsGetCurrentPro cessId(),text_2);
ExFreePool(text_2);
} ...

typedef struct _FILE_NAME_INFORMATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;

Принт text_2 выводит только первый символ.(%s или %S->тоже фигня).
Подскажите че не так или какие есть еще методы.
Заранее большое спасибо.


Дата: Сен 2, 2004 19:56:50

VOOrDOOluck
Чем тебя не устраивает функция GetModuleFileName ??


Дата: Сен 2, 2004 21:48:55

Наверное тем, что это kernel mode :)


Дата: Сен 2, 2004 22:47:43

volodya
В вопросе про ядро не упоминалось..


Дата: Сен 2, 2004 22:56:57

ExAllocatePool/ExFreePool - вот тебе и ответ.


Дата: Сен 3, 2004 00:50:46

А разве GetModuleFileName подойдет для хендла открытого
файла? Это же для подгруженного модуля?
К тому же, кажется, у человека проблема скорее с выводом
имени файла, а не с его получением.


Дата: Сен 3, 2004 01:40:50

Попробуй ObReferenceObjectByHandle/ObQueryNameString


[ VOOrDOOluck: Принт text_2 выводит только первый символ.(%s или %S->тоже фигня). ]

Так ты пытаешься unicode-строку как ansi выводить! Юзай %


Дата: Сен 3, 2004 01:41:52

%ws


Дата: Сен 3, 2004 04:46:51

Кроме ObReferenceObjectByHandle, если не хочешь лишний раз reference этот самый файл можешь поизвращаться с ZwQuerySystemInformation класс SystemHandleInformation.


Дата: Сен 3, 2004 15:41:04

В принципе связка ObReferenceObjectByHandle/ObQueryNameString работает получше но она если срабатывает то выводит инфо наподобие device\#hex(или путь к hardvolium_num...polices...).
Это лучше чем ничего но немного не то.
Я делаю так:
nt = ObReferenceObjectByHandle(FileHandle,/*MAXIMUM_ALLOWED*/0,0,UserMode,&Object,NULL);
...
nt = ObQueryNameString(Object,DestinationStringW,1024,&i);
Может я в ObReferenceObjectByHandle что то не то прописал.
И еще вопрос в данном направлении.После ObReferenceObjectByHandle как я понимаю Object является в принципе объектом на файл.Попробовал
pF = (PFILE_OBJECT)Object;
pF->FileName;
Но результата вообще нет.(или "" или(null)).Почему так получается.
Four-F(MSDN)
%s - (String) When used with printf functions, specifies a single-byte–character string;
%S - (String) When used with printf functions, specifies a wide-character string;
Результат ObQueryNameString вывожу через %S нормально
(через %s "\").


Дата: Сен 3, 2004 16:27:47

Не вспомню чево сразу не пахало(частично)но так пашет.
nt = ObReferenceObjectByHandle(FileHandle,0,0,UserMode,&pF,NULL);
if (nt == STATUS_SUCCESS)
{
DbgPrint("\nnHookReadFile PID:%lu\nObReferenceObjectByHandle FileObject name:%S\nLength:%lu\n\n",\
PsGetCurrentProcessId(),pF->FileName.Buffer,pF->FileName.Length);
ObDereferenceObject(&pF);
}

Всем большое спасибо


Дата: Сен 3, 2004 17:03:59

[ VOOrDOOluck: выводит инфо наподобие device\#hex(или путь к hardvolium_num...polices...) ]

RtlVolumeDeviceToDosName


Дата: Сен 3, 2004 17:23:04

Four-F
Не знаю поможет ли RtlVolumeDeviceToDosName но что такое manifest,polices и тд я пока вообще не знаю.Наврят ли так имена файлов будут называться или нет?


Дата: Сен 8, 2004 01:06:12

2 VOOrDOOluck:
А не не получится. Я тоже пытался это узнать.
В результате маего ислодования я узнал что при создании файла ядро находит файл на диске и сохраняет информацию о его место расположение, потом строка и названием пути к файлу освобождается. :((((


Дата: Сен 10, 2004 14:15:00

Songoku
А можеш както поподробнее свои наблюдения.
То что мне нужно у меня получилось.При использовании ObReferenceObjectByHandle в вых параметре FILE_OBJECT содержится имя файла,если это файл, а если это не файл а какойто device то имя файла равно нулю и тогда нужно смотреть объект DEVICE_OBJECT в FILE_OBJECT .Я все понял именно так и то что мне нужно было у меня получилось.Наврядли это было совпадением. И помойму сама система при запросах подобного рода делает именно так.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087