А как осуществляется бектрейс в ядре? Нужно же знать сигнатуры вызываемых функций для вычисления размера фрейма? Или в ядре есть какие-то средства для этого?
ntdrivers Также как и в юзермоде. Только необходимо идентифицировать фрейм(может быть как стековым, так и трап-фреймом).
__MAX__ Ну мб и проще. Только тут раздел NT.KERNEL и не все задачи решаются через апк. У ТС стандартная задача.
__MAX__ Тогда не универсально. Вы не сможите отследить создание процессов ядром(PsCreateSystemProcess() etc).
__MAX__ Отслеживание бесполезно в данном случае. ТС необходимо не только отслеживать, но и выполнять некторые действия с адресным пространством, которые выполнить без понижения SFN нельзя.
- SFN - что это ? Irql ? KernelRoutine вызывается на APC_LEVEL, но это можно поправить - KeLowerIrql(PASSIVE_LEVEL); ... выполнять некторые действия ... KfRaiseIrql(APC_LEVEL); обычно KeLowerIrql вызывать(без предварительного KfRaiseIrql) нельзя, но в данном случае можно. собственно даже ntoskrnl делает это в KiDeliverApc перед вызовом NormalRoutine из Kernelmode apc
- ясно. - адресным пространством соотносится с SFN примерно как метры c дождём. причём здесь одно к другому ?
__MAX__ При том, что на текущем уровне SFN нотифи аллокация памяти и прочие действия с адресным пространством не доступны, это приведёт к деадлоку. Их можно выполнить только понизив SFN, ниже чем в MmMapViewOfImageSection().
http://www.wasm.ru/forum/viewtopic.php?id=38892 - KernelRoutine будет вызвана вне пределов локов. - это же вы сами написали !!
__MAX__ Да, это частный случай с урезанной работаспособностью. Если процесс создаётся из юзермода, то при возврате из сервиса будет доставлена апк. Для системных процессов это работать не будет.
__MAX__ Смотрите. Есть функция X, это кэлбэк который известен. Функция Y вызывает функцию X, причём есть множество промежуточных функций. Тоесть Y() -> A() -> B() -> C()... -> X(). Число функций не известно. Также не известен адрес возврата из функции A() в функцию Y(), так как она не экспортируется и поиск сложен. Как получить управление при возврате из функции Y() без патча ?