Написание отладчика-перехватчика в Win32:)
За основу взял статью на
http://delphiworld.narod.ru/base/use_debug_api.html
(Вряд ли кто-нибудь захочет вникать, но всё же).
Возникли следующие вопросы по данному листингу.
RestoreBreak: Boolean; - флажок, который указывает обработчику события EXCEPTION_SINGLE_STEP надо ли восстанавливать точку останова.
Отладчик "в учебных целях" перехватывает только одну функцию. А если перехватывать много? Тогда - по флажку на каждую функцию, что ли?
if RestoreBreak and (Context.EIP >= BPAddr) and (Context.EIP <= BPAddr + 32) then
Эээ... Это мы так учитываем тот факт, что после выполнения одной инструкции IP смещается на длину инструкции? По-моему, правильнее было бы определять длину исходной инструкции. Кстати, никто не знает, как это сделать? А то совсем не хочется копаться в Instruction Set Reference Manual от Intel.
Кстати, BPAddr тоже, наверное, надо заводить на каждую перехватываемую функцию? Да и OrigByte, наверно?
"...иногда процесс не завершается корректно (к примеру, отладчик, который отлаживает отладчик, который отлаживает отладчик..." - когда конкретно так бывает?
if RestoreBreak and (Context.EIP >= BPAddr) and (Context.EIP <= BPAddr + 32) then
begin
...
end
else
if RestoreBreak then
Context.EFlags := Context.EFlags or EFLAGS_TRACE;
Когда может возникнуть этот else?
С надеждой на ответ,
Brother Det Jr.