Установку перехвата делаю путем прямой записи в таблицу. Общий вид функции перехвата примерно такой: нтстатус хукКреэтФайл(трололо) { количество_выполняющихся_перехваченных_вызовов++;- спомощью InterlockedIncrement результат=(вызов оригинала); количество_выполняющихся_перехваченных_вызовов--; - спомощью InterlockedDecrement ретерн результат; } Так вот после снятия хуков такой же простой записью в таблицу, остаются активными некоторые вызовы. Это я узнаю по ненулевому значению (количество_выполняющихся_перехваченных_вызовов). Чем дольше система в захуканом состоянии, тем больше накапливается этих вызовов. С течением времени эти вызовы неохотно, но завершаются. Если не выгружать драйвер,то все окей, все отлично продолжает работать. Если выгружаю - пара действий и привет бсод. Каким образом выполняются системные вызовы, что им нужно наличие в памяти моих хук-функций? Я так понимаю, их код не грузится в процессы, которые запрашивают эти вызовы. Неужели они не подружаются куда-то для выполнения? Как сделать чтоб после снятия хука, пожно было спокойно выгрузить драйвер? Спасибо.
После того ка вызов возвращает результат поток попадает обратно в твою функцию, которой уже нет Вместо Код (Text): результат=(вызов оригинала); ретерн результат; использовать Код (Text): пуш параметерс пуш оригиналретурнадрес джэмпэ оригиналфанкшон
Т800, спс, но не понял местами че делает. Если можешь, объясни кратенько какое значение имеет IRQL. Я читал, знаю про диспатч лэвэл, аппаратные, знаю что их в винде под 30, но целостной картины не сложилось. Про пуш параметерс пуш оригиналретурнадрес джэмпэ оригиналфанкшон Ведь после входа в мою хук-функцию, в стэке уже будут все переданные параметры, нужный адрес возврата. Почему я не могу сделать джамп сразу на оригинал? Объясните плиз.
Блин, нифига не получается. Если пуш адрес + рет - неверное обращение к памяти. Если джамп адрес - бсод(