Где можно прочитать или расскажите кто-нибудь, что именно происходит в ядре с момента генерации исключения процессором и до передачи управления на KiUserExceptionDispatcher. Обычно рассмотрение этого вопроса идет только с момента передачи управления в Ring-3. А меня в частности интересует какие функции ядра используется.
Что за обработчик цепляет система в IDT и что он делает? Где происходит переход в UserMode? Что передается из ядра в UserMode по стеку?
KiTrapXX вектора. В общем они формируют т-фрейм(состояние камня на момент исключения) сохраняют в стек, после этого размаскируются прерывания и выполняется общая для всех векторов обработка исключений в KiDispatchException(). Между тем каждый вектор некоторые свои действия выполняет, например вызывает менеджер памяти или обслуживает NPX. KiDispatchException() выполняет обработку в зависимости от мода, для юзермода настраивает стек(контекст и инфу про фолт). Т-фрейм загружается в процессор при возврате из ISR обратным сохранению образом, тоесть извлекаются регистры из фрейма(он на дне стека), Ss:Esp, Cs:Eip & EFlags в последнюю очередь восстанавливаются аппаратно(Iret). В KiDispatchException() соответственно настраивается контекст(заменяется адрес инструкции на которой возник фолт на KiUserXcptDisp..() etc). Там всё довольно прозрачно сделано и опенсурсно.
Как обнаружить KiDispatchException? Где она примерно располагается? Я так понимаю функция не экспортируется? У меня WinXP SP3.
solvitz У каждого исключения свой вектор. Вектора фиксированы, ядро их загружает во все IDT при запуске. Думаю вам пока дизасм не нужен, в дизасме сложно вначале будет разобраться. Это всё есть в сурсах. Процедура не экспортируется. Три модуля есть - trap.asm & kimacro.inc, это непосредственно т-процессинг, там вектора и базовые макро. exceptn.c - надстройка, которая вызывает пользовательский или ядерный диспетчер.
А почему во все? IDT вроде же всего одна. И еще вопрос, можно ли перезаписать дескриптор шлюза в IDT чтобы переход осуществлялся на нужную мне процедуру. Допустим я хочу поставить новый обработчик на int3 (#BP), возможно ли такое?
в каждой core (без HT) свой IDTR и значит может быть свое значение IDT стало любопытно - на практике бывают они разные?
solvitz У каждого процессора свои дескрипторные таблицы. Камни изолированы друг от друга. У меня P4 с двумя ядрами(HT). Работает как два процессора, на каждом своя IDT, GDT etc. Да, но это не делается простой загрузкой нового шлюза. ISR должна формировать т-фрейм, а он меняется в версиях. Посему необходимо каким то образом его сформировать.
Значит загружаю в Syser программу из одной команды: Код (Text): ud2 Начинаю трейсить после исключения (#UD) выпадаю в KiUserExceptionDispatcher.NTDLL.DLL. Почему это происходит? Я же по идее должен выйти на первую команду _KiTrap06. Как мне тогда сделать, чтобы я вышел на _KiTrap06?
Malfoy Спасибо за помощь! Я делал вот так, но бряк не ставился: >idt 6 >bpm [addr] r Писало: "Invalid access type!" Буду разбираться.