Clerk Я не думаю, что проблема в отсутствии у меня KTRAP_FRAME. Допустим, выполнение происходит во второй части кода, кода уже произошел возврат из KiTrap0E. Происходит прерывание. Обработчик сохраняет контекст в своем KTRAP_FRAME и все нормально. Меня больше волнует подмена cs:eip на значения ядра -- тут не очень понятно, что будет.
Можно и отморфить. Для меня важно было понять, что происходит, а не добиться цели. Кстати, посмотрел я на ss:esp, которые в TSS. Их содержимое меняется при смене процесса точно. Не знаю насчет потоков, но, думаю, для потоков тоже.
Clerk Да, с TF - один из самых коротких и простых вариантов которые видны. Единственное что вырубает отладчег (параллельную работу). Думаю но ничего даже близко не видать...
Clerk Ну да, просто с твоих слов я понял, что стек общий, а это не так. Поэтому несохранение trap frame ничем не грозит. В принципе, можно поставить точку останова на чтение cs:eip -- проверить, читает ли его кто-то помимо iretd или нет.
Mika0x65 Просто в вашем понимании формирование трап фрейма не нужно для прерываний(не ловушек!). Свапконтекст вполне вероятно будет выполнен не корректно(к примеру прев. мод юзается очень много где), не говоря уже про большинство сервисов и пр. В прочем если не устраивает архитектура NT, то юзайте другую ось, например линупс. Хотя в ней маловероятно что вобще вы сможите чтото обработать на этом уровне и вам никто не поможет, ну кроме торвальдса и его бригады. Используйте морфинг и не мучайте форум, иначе ваша задача не разрешима. PSR1257 Какой есчо отладчик ?
(Немного обдумав) Как я понимаю, реализовать обработчик исключения можно двумя способами: - (1) Просто указав в IDT селектор:смещение, селектор в данном случае из GDT; - (2) Указав в IDT вентиль (не уверен что правильно употребил термин) задачи - таким образом обработчик прерывания выполняется как отдельная вложенная задача со своим TSS. Случай 2 (если винда так реализует обработку) наиболее интересен - при выполнении задачи мы имеем "бесплатное" логгирование в TSS - там останется CS:EIP указывающий на следующую команду после IRETD (по идее это JUMP @Begin: ). В таком случае достаточно получить два PageFault и во втором уже можно смотреть TSS - и патчить IRETD.