Как можно осуществить вызов функции из процесса пользователя(Ring 3) кодом драйвера(Ring 0)? "Вызвать" похоже, никак не получится, поскольку возврат в ring 0 вроде как невозможен. Но надо получить возвращаемое значение... Как такие вещи осуществляются? Чтобы время на "туда-сюда" было минимальным... Без потоков и всякого поллинга...
Открываешь в кернеле страничку памяти на запись из юзера, и вперед. Но микрософт такую дровину никогда не сертифицирует - дескать нарушения безопасности системы =)
Так эту страничку-то потом все-равно поллить придется из драйвера, поток нужен... А я поллить и память приложения могу, из драйвера... Мне вот мысль пришла, закачать требуемую функцию в драйвер, и пользоваться ею там наздоровье Такой драйвер точно сертификацию не пройдет Кстати, а как вообще можно вызвать код юзера? Какая-нибудь функция типа PsCreateSystemThread пойдет? Она вообще быстро срабатывает?
- можно APC из ядра заюзать. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllpr oc/base/asynchronous_procedure_calls.asp и вот еще: http://www.cmkrnl.com/arc-userapc.html правда, это будет совсем не быстро работать.
2 Zufyxe: Спасибо за ссылки, если что - придется ими воспользоваться... А вот все-таки интересно, что, так ведь плохо получится, если использовать потоки? Допустим, что у меня в драйвере есть поток, и в приложении поток; они оба поллят одни и те же переменные, которые находятся в памяти приложения. Поток драйвера изменяет переменную, и ждет ответа на это потока приложения(изменение какой-то другой переменной). Как это может быстро все происходить? Мне сказали, что вроде бы как в винде время переключения между потоками что-то порядка миллисекунд, и поэтому среднее время реакции будет тоже примерно такого порядка(а нужно среагировать не более чем за микросекунду). Правда ли это?
а Микрософт такие трюки и сама использует. Например при вызове юзермодного драйвера принтера из GDI engine.
Да уж... И где теперь мне найти прототип функции KeUserModeCallback? Она в стек принимает 20 байт, значит параметров, по-видимому, 5...
Гугл рулит ... NTSTATUS KeUserModeCallback ( IN ULONG ApiNumber, IN PVOID InputBuffer, IN ULONG InputLength, OUT PVOID *OutputBuffer, IN PULONG OutputLength)
2 MegaZu: СПАСИБО ТЕБЕ!!! Интересно, как ты его нашел? Я смог шото найти тока после того, как вбил весь тобой данный прототип в гугл(я обычно пользуюсь яху), и нашел только 1 рабочую ссылку и то какого-то китайского сайта Там прототип этот есть...
... Интересно, что это за параметр ApiNumber? Из какой он такой таблицы? Как в нее функцию запихнуть? Теперь с kernel_callback_table надо разбираться... Знать бы сразу все функции, которые мне могут понадобиться
Что-то я не пойму, что это значит: 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, одной для всех процессов?