nikifar Если бы ты посмотрел код, ты бы догадался, что перехват ставися в тот момент когда ты хочешь, потом небольшая задержка до фактического его исполнения, а потом собственно нужные тебе действия.
Great Стуб выполняет следующие действия: - Формирует регистровый стек(KTRAP_FRAME). - Устанавливает PreviousMode исходя из селектора кодового сегмента переданного в стуб. - Для теневого сервиса вызывает NtGdiFlushUserBatch. - Копирует аргументы сервиса в стек. - Определяет из SST адрес обработчика и вызывает его. - Доставляет APC если он есть в очереди. Что из этого нужно для ядерного треда - ничего, разумеется если не хотим в чужёй обработчик попасть. PreviousMode вручную нормально так устанавливается. Обьясни мне зачем обёртки нужны ? [И я не придираюсь.]
Clerk Спасибо, конечно, но я знаю, что делает стаб. Обертки нужны - для PreviousMode. Что проще - дернуть один раз инт 2е или искать превиоус моде?
Great Даже дизасм таскать не нужно, достаточно из второй инструкции PsGetCurrentThreadPreviousMode() смещение взять. Полядра заюзать чтобы одну переменную изменить.. это никуда не годится.
Это тупик без сомнения, идём в #16. Вполне нормальное обсуждение.. Только одного не пойму, товарищ сам ответить может, зачем за него говорить.
Да не пойму зачем вообще спор разводить на пустом месте, если обе стороны прекрасно понимают всю суть проблемы и все равно будут придерживаться своих точек зрения "кому как больше нравится - тот так и кодит". Все равно что выяснять, что лучше - CreateFileA или CreateFileW.