У меня 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->тоже фигня). Подскажите че не так или какие есть еще методы. Заранее большое спасибо.
А разве GetModuleFileName подойдет для хендла открытого файла? Это же для подгруженного модуля? К тому же, кажется, у человека проблема скорее с выводом имени файла, а не с его получением.
Попробуй ObReferenceObjectByHandle/ObQueryNameString [ VOOrDOOluck: Принт text_2 выводит только первый символ.(%s или %S->тоже фигня). ] Так ты пытаешься unicode-строку как ansi выводить! Юзай %
Кроме ObReferenceObjectByHandle, если не хочешь лишний раз reference этот самый файл можешь поизвращаться с ZwQuerySystemInformation класс SystemHandleInformation.
В принципе связка 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 "\").
Не вспомню чево сразу не пахало(частично)но так пашет. 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); } Всем большое спасибо
[ VOOrDOOluck: выводит инфо наподобие device\#hex(или путь к hardvolium_num...polices...) ] RtlVolumeDeviceToDosName
Four-F Не знаю поможет ли RtlVolumeDeviceToDosName но что такое manifest,polices и тд я пока вообще не знаю.Наврят ли так имена файлов будут называться или нет?
2 VOOrDOOluck: А не не получится. Я тоже пытался это узнать. В результате маего ислодования я узнал что при создании файла ядро находит файл на диске и сохраняет информацию о его место расположение, потом строка и названием пути к файлу освобождается. (((
Songoku А можеш както поподробнее свои наблюдения. То что мне нужно у меня получилось.При использовании ObReferenceObjectByHandle в вых параметре FILE_OBJECT содержится имя файла,если это файл, а если это не файл а какойто device то имя файла равно нулю и тогда нужно смотреть объект DEVICE_OBJECT в FILE_OBJECT .Я все понял именно так и то что мне нужно было у меня получилось.Наврядли это было совпадением. И помойму сама система при запросах подобного рода делает именно так.