У меня trabl. FileName from handle

Тема в разделе "WASM.WIN32", создана пользователем VOOrDOOluck, 2 сен 2004.

  1. VOOrDOOluck

    VOOrDOOluck New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2004
    Сообщения:
    51
    Адрес:
    Ukraine
    У меня 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. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    VOOrDOOluck

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

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Наверное тем, что это kernel mode :)
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

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

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    ExAllocatePool/ExFreePool - вот тебе и ответ.
     
  6. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    А разве GetModuleFileName подойдет для хендла открытого

    файла? Это же для подгруженного модуля?

    К тому же, кажется, у человека проблема скорее с выводом

    имени файла, а не с его получением.
     
  7. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Попробуй ObReferenceObjectByHandle/ObQueryNameString





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



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

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Код (Text):
    1. %ws
     
  9. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
    Кроме ObReferenceObjectByHandle, если не хочешь лишний раз reference этот самый файл можешь поизвращаться с ZwQuerySystemInformation класс SystemHandleInformation.
     
  10. VOOrDOOluck

    VOOrDOOluck New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2004
    Сообщения:
    51
    Адрес:
    Ukraine
    В принципе связка 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 "\").
     
  11. VOOrDOOluck

    VOOrDOOluck New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2004
    Сообщения:
    51
    Адрес:
    Ukraine
    Не вспомню чево сразу не пахало(частично)но так пашет.

    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);

    }



    Всем большое спасибо
     
  12. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    [ VOOrDOOluck: выводит инфо наподобие device\#hex(или путь к hardvolium_num...polices...) ]



    RtlVolumeDeviceToDosName
     
  13. VOOrDOOluck

    VOOrDOOluck New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2004
    Сообщения:
    51
    Адрес:
    Ukraine
    Four-F

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

    Songoku Эдгар

    Публикаций:
    0
    Регистрация:
    1 мар 2003
    Сообщения:
    68
    Адрес:
    Belarus
    2 VOOrDOOluck:

    А не не получится. Я тоже пытался это узнать.

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

    VOOrDOOluck New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2004
    Сообщения:
    51
    Адрес:
    Ukraine
    Songoku

    А можеш както поподробнее свои наблюдения.

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