Обработка исключения с сорваным стеком

Тема в разделе "WASM.WIN32", создана пользователем blood, 24 мар 2006.

  1. blood

    blood New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2004
    Сообщения:
    56
    Адрес:
    Russia
    Приветсвую всех. Столкнулся вот с проблемой: обработчик исключения отаказывается реагировать на исключения навроде

    xor eax,eax

    mov esp,eax

    mov dword ptr [eax], 1

    Такие исключения вообще реально обрабатывать?
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Вряд ли. Обработчик-то этот же самый стек использует.
     
  3. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Исключение срабатывает, только её обработка не происходит, так как указатель на обраточик теряется.



    PS: А ты где это используешь, непойму :dntknw:
     
  4. blood

    blood New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2004
    Сообщения:
    56
    Адрес:
    Russia
    Vasil

    Программа сложная, малоли что может случится. Хотелось бы чтобы критичные данные были сохранены в любом случае, а при такого рода исключении процесс просто завершается. Указатель на обработчик кстати не теряется. он хранится в SEH фрейме по fs:[0], только модификация esp его не уничтожает. Похоже что даже до KiUserExceptionDispatcher дело не доходит :dntknw:



    reverser

    Проблема в том что виндовый обработчик использует стек. В своем обработчике я могу стек и скорректировать перед использованием.



    Может быть можно использовать какие нибудь альтернативные методы. SEH и похоже SetUnhandledExceptionFilter некатят.
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
  6. blood

    blood New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2004
    Сообщения:
    56
    Адрес:
    Russia
    EvilsInterrupt

    Смотрел (правда не очень подробно), ничего похожего не нашел. Из ч.3 понял что вроде ошибка обрабатывается Int0E -> KiUserExceptionDispa -> SEH обработчик пользователя. В любом случае SEH не катит, ибо обработка идет в контексте текущего потока. У текущего потока стек сорван => обработка обламывается.
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    blood

    От хорошего чела, СПЕСИАЛЬНО для тебя!



    там тому челу с СЕХом - скажи, что в ядре проверки есть, не выходит ли esp за границы из ТИБа

    можно потрейсить в сайсе и все видно будет

    но с нулевым esp процесс завершается
     
  8. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    EvilsInterrupt

    То есть ядро видит, что esp ноль, и посылает программу на х в обход обработчиков структурных исключений? Но зачем это надо?

    Блин, а ведь процедура обработки исключений использует стек. Она же по идее выполняет call <SEH procedure>, ведь эта процедура заканчивается ret'ом. Кажись, ядро чисто предупреждает более серьёзные последствия (зацикливание обработки: стек сорвался -> исключение -> обработка -> исключение (при попытке вызвать функцию) -> ...)

    Всё-таки, что точно?
     
  9. blood

    blood New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2004
    Сообщения:
    56
    Адрес:
    Russia
    EvilsInterrupt

    Факт остается фактом - SEH обработчик не вызывается. Проверить стек мало, нужно его еще и скорректировать. Не сомневаюсь что винда проверяет esp. Насколько я понимаю, первая функция, которая отрабатывает в контексте потока это KiUserExceptionDispatcher, которая, как я уже сказал, не вызывается. Вероятно винда проверяет esp и просто убивает процесс...
     
  10. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Ну раз не вызывается, то скорее всего Windows просто пристреливает процесс, так как KiUserExceptionDispatcher выполняет ряд call'ов, а call'ы пишут в стек, а стека нет, чтобы не повис сам обработчик, не было зацикливаний и т.п. ядро обработчик не вызывает и срабатывает предусмотренная в нём реакция - прибить процесс.