Какие есть еще методы перехватить исключение?

Тема в разделе "WASM.WIN32", создана пользователем GorluM, 11 мар 2007.

  1. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Любой обработчик исключения внутри самого потока, вызвавшего исключение. А в общем случае исключение может обработать и отлаживающий процесс (если есть), и другой поток через ExceptionPort.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не ясно что нужно, отладочный порт использовать ?
    Если CurrentThread то KiUserExceptionDispatcher - с этой точки всё начинается.
     
  3. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    diamond
    Я не до конца понял твою мысль. Что значит:
    Находится, выполняется(с отличным от первоначального контекстом) и как? )
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    nester7
    Имелось в виду, что есть такие средства обработки исключений, как DebuggerPort и ExceptionPort, при использовании которых исключение обрабатывается не в контексте потока, вызвавшего исключение, а в контексте другого потока, создавшего соответствующий порт и ждущего на нём прихода сообщений.
     
  5. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    diamond
    Понятно. Попутно срошу - как работать с ExceptionPort'om (если он вообще используется для обычных win32-приложений)?
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    nester7
    Средствами Win32-подсистемы - вроде бы никак. Через NativeAPI - NtSetInformationProcess с классом информации ProcessExceptionPort устанавливает этот порт для указанного потока, а дальше работа с LPC через всякие NtCreatePort/NtReplyWaitReceivePort - подробности по работе с LPC есть в неоднократно упоминавшемся на этом форуме NativeAPI.pdf (глава 12). Общие слова по обработке исключений, кстати, есть там же (appendix D).
     
  7. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Поправка: ExceptionPort для процесса можно установить через NtSetInformationProcess только один раз, и csrss при создании нового процесса это делает. Так что для установки своего порта в Win32-процессе, видимо, придётся вылезать в 0-кольцо и ручками ставить EPROCESS.ExceptionPort. Либо хучить NtSetInformationProcess, вызываемую из basesrv.dll в контексте csrss.exe, причём перед вызовом CreateProcess для интересующего нас процесса.
     
  8. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    diamond
    Спасибо за разъяснения. Работа с этим портом попахивает гемороем :)
     
  9. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Нашел еще одну фичу когда система забивает на SEH обработчик и не передает ему управление под вистой. Если установлен флаг (IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 The image is compatible with data execution prevention (DEP).) в поле DLL Flags, управление наш установленный обработчик при исключении не получит, причем это поле в ЕХЕ не игнорируется под вистой, и если установлен флаг (IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 The DLL can be relocated at load time.) под вистой ЕХЕ будет грузится по разной базе (если выставленны правельно версия системы).