Получить путь по хэндлу

Тема в разделе "WASM.NT.KERNEL", создана пользователем guessWh0_o, 12 янв 2019.

  1. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Доброго времени суток, может быть у кого-то завалялся кусок кода, который по открытому хэндлу файла вернет полный путь к файлу. Или же направьте в нужное русло
     
  2. CheckOut

    CheckOut New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2018
    Сообщения:
    24
  3. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    CheckOut, вроде тема создана в KERNEL. Такой способ, увы, не поможет
     
  4. CheckOut

    CheckOut New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2018
    Сообщения:
    24
    Ах, да, не обратил внимание в каком разделе тема создана :dntknw:
     
  5. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    поиск по хелпу Windows Driver Kit говорит, что ZwQueryInformationFile с параметром FileNameInformation
     
  6. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Может знает в чем может быть причина BSOD? (пробный вариант, поэтому пока не проверяю код возврата)
    Вот сама функция, с помощью которой я получаю путь:
    [​IMG]
    Вот тут вызов:
    [​IMG]
     
  7. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    Исправил ошибку, но остался один косяк. Иногда выводятся левые символы. В чем может быть проблема?
    [​IMG]
    Выделяю память перед вызовом функции получения пути следующим образом:
    PWCHAR filePath = (PWCHAR)ExAllocatePool(NonPagedPool, sizeof(WCHAR) + MAX_PATH * 2);

    Получаю путь следующим образом:
    NTSTATUS GetPathByHandle(HANDLE FileHandle, PWCHAR FileName)
    .......
    status = ZwQueryInformationFile(FileHandle, pIoStatus, pInfo, sizeof(FILE_NAME_INFORMATION) + MAX_PATH, FileNameInformation);
    if (!NT_SUCCESS(status)) {
    ExFreePool(pIoStatus);
    ExFreePool(pInfo);
    KdPrint(("Error execution ZwQueryInformationFile. STATUS=%x", status));
    return status;
    }
    wcscpy(FileName, pInfo->FileName); //пробовал выводить отдельно pInfo->FileName, проблема такая же, лишние символы
     
  8. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Может потому, что длина полученного имени возвращена явно в pInfo->FileNameLength , и никто не обещал , что будут нули после имени ?
     
    guessWh0_o нравится это.
  9. guessWh0_o

    guessWh0_o New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2018
    Сообщения:
    27
    njeen, пробовал таким образом, но результат тот же. Или надо терминирующий ноль руками дописывать?:
    wcscat_s(FileName, driveDosName->Length, driveDosName->Buffer);
    wcscat_s(FileName, pInfo->FileNameLength, pInfo->FileName);
     
  10. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    да, но зачем? Проще из этого UNICODE_STRING сделать, и делать дальше что нужно - хоть через KdPrint выводить
     
  11. CheckOut

    CheckOut New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2018
    Сообщения:
    24
    guessWh0_o, память, которую выделяет ExAllocatePool, не инициализирована. Поэтому, чтобы там не было мусора, вам нужно перед использованием этой памяти, обнулить её.