Вызов Nt* функций и переключение режима

Тема в разделе "WASM.WIN32", создана пользователем Saint German, 9 июл 2005.

  1. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Как всем известно, наборы Nt функций указывают на обработчики, вызванные после переключения режима, т.е. после прохождения шлюза, Zw до этого.



    Т.е. если вызвать системный вызов (NtCreateFile) в контексте какого-то процесса, например, то обработчик проверит предыдущий режим, а так как предыдущий режим был usemode, произойдет исключение, и вызов возвратит 0xc0000005, значит нужно переключить(хотя, насколько я знаю, невозможно), что-бы обработчик, проверяя прошлый режим, убедился, что он был kernelmode, что делать в такой ситуации???



    Тоже и с системными вызовами не экспортируемыми в ntoskrnl, тот же NtWriteVirtualMemory, найти адресс обработчика можно в SDT, можно восстановить ее, если таблица запатчена, но как вызвать ее в kernel'e, с предыдущим юзермодным режимом?



    В DriverEntry вызовы Nt проходят на ура, а в DrvDispatch, завершаются c0000005, т.е. обработчик проверяет предыдущий режим, так и есть.
     
  2. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Я у себя делал просто- выделял блок памяти в юзермоде, копировал в неё параметры, устанавливал на неё все указатели (причём как IN, так и OUT!) и вызывал Nt*. И всё работает!
     
  3. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Я ж тебе предлагал вариант через WorkItem. Там PreviousMode уж точно будет KernelMode. А вообще, странное решение какое-то: создавать файл из обработчика хука NtCreateFile. Не лучше ли накапливать данные в памяти? И если уж так нужно файло в драйвере создавать, то делать это где-нить в другом месте.
     
  4. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Расскажи подробнее о WorkItem. Я что-то не понял, что именно ты имеешь ввиду.
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    В системе есть несколько рабочих потоков (system worker threads), которые любой драйвер может использовать для всякой черновой работы. Работают они в контексте системного процесса. Особенно полезны, когда надо находясь на IRQL >= DISPATCH_LEVEL, сделать что-то, что на этом IRQL делать нельзя. Тогда можно дать эту работу рабочему потоку, т.к. он всегда на PASSIVE_LEVEL работает.



    Функции такие
    Код (Text):
    1. IoAllocateWorkItem - выделить управляющую структуру
    2. IoQueueWorkItem    - подцепиться к рабочему потоку в очередь
    3. IoFreeWorkItem     - освободить управляющую структуру




    В KmdKit даже пример есть \examples\basic\WorkItem
     
  6. Saint German

    Saint German New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2003
    Сообщения:
    222
    Да, это выход, не только для такой ситуации, но и для других. Спасибо!