Взаимодействие UserMode - KernelMode

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

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Как можно осуществить вызов функции из процесса пользователя(Ring 3) кодом драйвера(Ring 0)?

    "Вызвать" похоже, никак не получится, поскольку возврат в ring 0 вроде как невозможен. Но надо получить возвращаемое значение... Как такие вещи осуществляются? Чтобы время на "туда-сюда" было минимальным... Без потоков и всякого поллинга...
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Открываешь в кернеле страничку памяти на запись из юзера, и вперед. Но микрософт такую дровину никогда не сертифицирует - дескать нарушения безопасности системы =)
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Так эту страничку-то потом все-равно поллить придется из драйвера, поток нужен... А я поллить и память приложения могу, из драйвера... Мне вот мысль пришла, закачать требуемую функцию в драйвер, и пользоваться ею там наздоровье:) Такой драйвер точно сертификацию не пройдет:)

    Кстати, а как вообще можно вызвать код юзера? Какая-нибудь функция типа PsCreateSystemThread пойдет? Она вообще быстро срабатывает?
     
  4. Zufyxe

    Zufyxe New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2004
    Сообщения:
    137
    Адрес:
    Russia
  5. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    2 Zufyxe: Спасибо за ссылки, если что - придется ими воспользоваться...



    А вот все-таки интересно, что, так ведь плохо получится, если использовать потоки? Допустим, что у меня в драйвере есть поток, и в приложении поток; они оба поллят одни и те же переменные, которые находятся в памяти приложения. Поток драйвера изменяет переменную, и ждет ответа на это потока приложения(изменение какой-то другой переменной). Как это может быстро все происходить? Мне сказали, что вроде бы как в винде время переключения между потоками что-то порядка миллисекунд, и поэтому среднее время реакции будет тоже примерно такого порядка(а нужно среагировать не более чем за микросекунду). Правда ли это?
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine


    а Микрософт такие трюки и сама использует. :)

    Например при вызове юзермодного драйвера принтера из GDI engine.
     
  7. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Да уж... И где теперь мне найти прототип функции KeUserModeCallback? Она в стек принимает 20 байт, значит параметров, по-видимому, 5...
     
  8. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Гугл рулит ...

    NTSTATUS KeUserModeCallback (

    IN ULONG ApiNumber,

    IN PVOID InputBuffer,

    IN ULONG InputLength,

    OUT PVOID *OutputBuffer,

    IN PULONG OutputLength)
     
  9. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    2 MegaZu:

    СПАСИБО ТЕБЕ!!!

    Интересно, как ты его нашел? Я смог шото найти тока после того, как вбил весь тобой данный прототип в гугл(я обычно пользуюсь яху), и нашел только 1 рабочую ссылку и то какого-то китайского сайта:) Там прототип этот есть...
     
  10. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    ... Интересно, что это за параметр ApiNumber? Из какой он такой таблицы? Как в нее функцию запихнуть? Теперь с kernel_callback_table надо разбираться... Знать бы сразу все функции, которые мне могут понадобиться:)
     
  11. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Что-то я не пойму, что это значит:

    The catch here is that you _must_ be in your thread's context for this to work;



    kernel_callback_table - это вообще глобальная структура? PEB - вроде бы как нет... Так что, получается по смещению 2с в PEB находится адрес глобальной структуры kernel_callback_table, одной для всех процессов?