Если вкратце, то любой процес во время своей жизни успевает побывать и в user и в kernel mode. Точнее даже не процес, а его треды. P.S. Чувствуется, у автора некая каша в голове. Думаю, слова "учите матчасть", здесь будут очень уместны.
Не я понимаю что краткость сестра таланта. Ну этож недокументированная ф-ция. Описание KiUserApcDispatcher у меня есть но как ей пользоваться не понятно Clerk пожалуйста поподробней. Я добавил её в драйвер но последний отказывается запускаться... В чем дело.
Что те нужно, не пойму. Чтобы запустить поток ядро ставит апк в очередь потока, это первое событие в очереди. В зависимости от того, является ли поток системным или нет, задаётся определённый адрес хэндлера, который выполнит поток в начале работы, это PspSystemThreadStartup() либо PspUserThreadStartup(). Далее после запуска потока вызывается одна из двух указанных процедур, если поток пользовательский то ставится в очередь потока апк, Eip для него загружается из KeUserApcDispatcher, а там указатель на KiUserApcDispatcher(при запуске ядра определяетсо), отсюда начнёт исполнятсо пользовательский поток. Походу тебе есчо рано дрова делоть.
Кстати, понятным языком Грит всё расписал, вторая стотья в списке на васме, нужно носом ткнуть http://wasm.ru/article.php?article=scheduler
Я мог бы обидеться на такое отношение, но на дураков обычно не обижаются. Проблема в том, что у процесса нет уровней привилегий. Даже у потока нет. Привилегии есть у дескриптора в таблице GDT/IDT/LDT, привилегии есть у селектора. Уровнем привилегий текущего выполняемого кода обычно называют уровень привилегий в текущем значении селектора CS кода. Проблема в том, что у каждого потока значение селектора CS постоянно меняется (почти у каждого, есть потоки, которые никогда не переходят в режим юзера), но у процесса в целом много потоков и значение CS которого из них брать за уровень привилегий процесса - вот в чем вопрос? Проблема номер два. Оказывается, если поток не находится в состоянии Running, то в стеке сохранён его TrapFrame, где хранится значение CS откуда был вызов, а текущее значение CS обычно равно селектору кода ядра. Которое из них брать - тоже не понятно. Отсюда делаем логичный вывод, что твой первый вопрос и все последующие уточнения не имеют смысла
Great ну извени если обидел, задачи такой не ставил... Что мне нужно я сформулировал кажется чётко. Есть драйвер корторый должен модифицировать главный тред известного процесса А если получить структуру CONTEXT Там ятак понимаю eip нужного треда? Ну а дальше вручную модифицировать...
нифига не четко Аххх.. адрес процесса это по-твоему EIP главного потока? так бы сразу и сказал на дураков не обижаются
Да уж, четко. Несколько человек два дня пытаются понять чего тебе надо. Любой процесс - это диапазон адресов от нуля до 0xFFFFFFFF (в 32 битной системе) Тебе уже сказали, что из драйвера можно приаттачиться к конкретному процессу с помощью KeStackAttachProcess. Приаттачился ? Вот и меняй что тебе вздумается. P.S BSOD тебе в руки и барабан на шею
С этим разобраля. Как сделать программу User mode резидентной. т.е. чтобы гогда прога не работает система её не сбрасывала на веник?
опять разберемся с терминологией. что значит 2программа не работает" по-твоему? Windows позволяет вешать кучу каллбеков на различные события в системе. Это полностью заменяет потребность, которая растет еще со времен ДОСа с TSR программами. для чего тебе это нужно?
Я модифицировал код проги №1 драйвером так что в заданной точке последней стаит jmp на код программы №2, прога №2 совершает нужные манипуляции и возвращает управление проге №1 как не вчем не бывало. Но на практике, к моменту перехода по jmp, кода проги №2 в памяти уже нет... Вероятно он был выгружен в фай подкачки. Или я опять ошибаюсь. Есле передать управление драйверу из проги №1 возникает исключение, вероятно из-за уровня привелегий проги №1 (ring 3). Возможно мою идею можно реализовать несколько иначе...
"проги" твои выполняются в пределах одного адресного пространства? данные, выгруженный в файл подкачки, подгружаются немедленно при первом обращении к ним, поэтому это тебя не должно волновать никоим образом, пока ты не пишешь код ядра, который должен выполняться на высоких IRQL чтобы передать управление драйверу существует куча программных и аппаратных решений. процессоры, работающие в защищенном режиме, предусматривают несколько возможностей переключения режимов с повышением привилегий - через шлюз прерывания, шлюз задачи или sysenter инструкцию. программно операционная система Windows предоставляет механизм IOCTL для вызова определенных функций драйвера в чем твоя идея то? ты описал свои кривые реализации, а идею - нет
Опять непонятно. Прога 1 и прога 2 это разные процессы? Невозможно сделать jmp из одного процесса в другой. Даже теоретически. P.S. Прислушайся к советам умных людей, и, в конце концов, внятно сформулируй что тебе надо сделать.
Partner Можно. Заюзать гейт, через который поток сменит кольцо а далее думою проблем не будет, в простейшем случае задействовать второй поток, который выполнит переход во второй процесс.