В своей проге я делаю final SHE. Он устанавливается апишной функцией (SetUnhandledExceptionFilter) для процесса. Он мне нужен для более приличного сообщения об исключениях. В нём же я отлавливаю дебужные исключения от int 3. В документации сказано, что на момент попадания в фильтр EIP указывает на инструкцию за int 3. В 98SE у меня всё так работает. Но в XP он впадает в бесконечный цикл. Там EIP указывает на саму инструкцию int 3, и я должен инкрементировать указатель на инструкцию, чтобы перейти через эту инструкцию. Кто нибудь уже встречался с такой проблемой?
Вообще-то в XP нет. В 98 - да. Но это не столь важно. Из фильтра SEH я вызываю MessageBox, который мне значение и говорит на данный момент.
В том-то и дело, что важно. Айс меняет DPL обработчика, поэтому поведение проца меняется. Ты читал вторые упаковщики?
Ух ты! Это уже довольно глубоко для меня. Возьму статью почитаю ещё раз, постараюсь разобраться. Так это надо детектить наличие Айса, чтобы правильно обрабатывать исключения? Или разбираться с DPL.
Да причем тут Айс? Я тоже с этим сталкивался, в win98 адрес исключения вытащенный через SEH будет указывать на следующую после int3 инструкцию, в 2k/XP этот адрес будет соответствовать адресу самой int3, вызвавшей исключение. В аттаче маленький тест, для сомневающихся 795515244__seh.exe
Айс тут действительно особо не причем. DPL обработчика прерывания тут причем. Не надо шаманить. Все имеет четкое и логичное объяснение.
volodya Статья об упаковщиках крутая, но для меня пока относительно тяжела. Надо будет ещё покопаться. Пока я нашёл такой выход: ;this macro allows to switch on and off all of the int 3 instructions at once int3 macro int 3 ;here is the funny thing. we avoid problem with different nop ;situations with SICE (inc .regEip or not) endm
Asterix, вдогонку вопрос... С int3 все понятно, а что из себя будет представлять адрес исключения, если оно просходит не на CC (int3), а на F1? В ХР-юхе у меня он указывает на следующую, как и в случае с int3, команду. А в 9х нет возможности проверить (впадлу ставить, а рядом нет)... Так не можешь сказать?