NtWriteFile STATUS_INVALID_HANDLE

Тема в разделе "WASM.NT.KERNEL", создана пользователем qwe8013, 9 июн 2010.

  1. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Проблема с записью в файл:
    1)В DriverEntry создаю файл (OBJ_CASE_INSENSITIVE or OBJ_KERNEL_HANDLE) - создаётся без проблем.

    2)В контексте другого процесса пытаюсь писать в файл, запись не происходит, и возвращается STATUS_INVALID_HANDLE, причём например ZwQueyObject
    работает нормально и возвращает STATUS_SUCCESS.

    3)В DriverUnload хендл закрывается без проблем.

    Почему NtWriteFile возвращает STATUS_INVALID_HANDLE?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Покажи, как вызываешь NtWriteFile(), где именно вызываешь, и какие параметры передаёшь. И, кстати, почему NtWriteFile(), а не ZwWriteFile()? Это у тебя хук в SDT что ли или что?
     
  3. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    qwe8013
    При работе с kernel-описателем нужно использовать nt!ZwWriteFile(...)
     
  4. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    0x6b65
    Действительно, заработало, но почему нельзя использовать NtWriteFile, ведь NtCreateFile работает?
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не совсем так, достаточно, чтобы previous mode было равно kernel-mode, а этого можно добиться и другим способом, например, зашедулить work item и вызвать в нём NtWriteFile() - тоже будет работать.
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Потому что NtCreateFile() создаёт хендл, а проверки предусмотрены только для его использования.
     
  7. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    qwe8013
    Уже писал в ветке http://wasm.ru/forum/viewtopic.php?pid=380652#p380652 :) Относительно этого случая: DriverEntry всегда вызывается ы контексте процесса SYSTEM. При этом будет создан kernel-описатель, который можно использовать либо при PreviousMode==KernelMode, либо в функциях, в которых явно указывается RequestorMode. Все Zw-функции сделаны для вызова Nt-функций (системных сервисов) так, что перед вызовом PreviousMode принудительно выставляется KernelMode, а после вызова - восстанавливается изначальный.
     
  8. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Да, так тоже будет работать. Создание системного треда тоже даст работоспособный вариант. Ну и никто не запрещает править PreviousMode прямо в структуре текущей нити)))
     
  9. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Ясно, благодарю за ответы.