SEH. Узнать регистры после экзепта.

Тема в разделе "WASM.WIN32", создана пользователем Colombo, 15 авг 2005.

  1. Colombo

    Colombo New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    20
    Документация мелкософта по сэх блокам какаято кривая.

    Указатели SEH фреймов еще ок сходятся, но указатель на блок регистров которые были в момент ошибки не тот ! Он откатывается выше данного указателя. ХЕЛП!
     
  2. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    _http://www.wasm.ru/article.php?article=Win32SEHPietrek1
     
  3. Colombo

    Colombo New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    20
    я же говорю не сходится данная документация
     
  4. Colombo

    Colombo New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    20
    третий параметр в callback ф-ию это _CONTEXT, глядел я дебагером этот указатель, фактический CONTEXT начинается с CONTEXT+6C проверьте плз у себя
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    _CONTEXT описаный в статье, аналогичен тому, что описан в winnt.h и совершенно правильный.



    В процедуру обработки исключения передаётся один параметр (указатель на EXCEPTION_POINTERS), а не три.
     
  6. Colombo

    Colombo New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    20
    какой 1 ???? тут даже 4

    __cdecl _except_handler(

    struct _EXCEPTION_RECORD *ExceptionRecord,

    void * EstablisherFrame,

    struct _CONTEXT *ContextRecord,

    void * DispatcherContext

    );

    и походу чувствуется шо эти SEH системы в 9х и NT разные
     
  7. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    это хэндлер ставится VС++ для

    __try __except блока (try{} catch(...){})



    это обертка компилятора над системным обработчиком
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Параметр у функции один - указатель на структуру.

    А сама структура, на которую указывает этот указатель, состоит из нескольких частей.

    Да и выглядит она не так, как ты привёл, а так:


    Код (Text):
    1. typedef struct _EXCEPTION_POINTERS {
    2.   PEXCEPTION_RECORD ExceptionRecord;
    3.   PCONTEXT ContextRecord;
    4. } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;




    посмотри пример в аттаче



    [​IMG] _1104955706__div_by_zero.zip
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Второе поле структуры EXCEPTION_POINTERS - указатель на структуру CONTEXT, которая выглядит так:


    Код (Text):
    1. CONTEXT STRUCT
    2.   ContextFlags  DWORD      ?                ;offset     0h
    3.   iDr0          DWORD      ?                ;offset     4h
    4.   iDr1          DWORD      ?                ;offset     8h
    5.   iDr2          DWORD      ?                ;offset    0Ch
    6.   iDr3          DWORD      ?                ;offset    10h
    7.   iDr6          DWORD      ?                ;offset    14h
    8.   iDr7          DWORD      ?                ;offset    18h
    9.   FloatSave     FLOATING_SAVE_AREA <>       ;offset    1Ch
    10.        ;(sizeof FLOATING_SAVE_AREA = 70h)
    11.   regGs         DWORD      ?                ;offset    8Ch (1Ch + 70h)
    12.   regFs         DWORD      ?                ;offset    90h
    13.   regEs         DWORD      ?                ;offset    94h
    14.   regDs         DWORD      ?                ;offset    98h
    15.   regEdi        DWORD      ?                ;offset    9Ch
    16.   regEsi        DWORD      ?                ;offset   0A0h
    17.   regEbx        DWORD      ?                ;offset   0A4h
    18.   regEdx        DWORD      ?                ;offset   0A8h
    19.   regEcx        DWORD      ?                ;offset   0ACh
    20.   regEax        DWORD      ?                ;offset   0B0h
    21.   regEbp        DWORD      ?                ;offset   0B4h
    22.   regEip        DWORD      ?                ;offset   0B8h
    23.   regCs         DWORD      ?                ;offset   0BCh
    24.   regFlag       DWORD      ?                ;offset   0D0h
    25.   regEsp        DWORD      ?                ;offset   0D4h
    26.   regSs         DWORD      ?                ;offset   0D8h
    27.   ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?)
    28. CONTEXT ENDS




    В примере который в аттаче, использованы именно эти смещения. Они могут быть несколько другими. И зависит это от размера структуры FLOATING_SAVE_AREA, размер которой может варьироваться. И зависит он не от ОС, а от типа процессора (процессорозависимая).
     
  10. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    cresta

    У меня сложилось впечатление, что Colombo имел ввиду не финальный обработчик, а внутрипоточный, которому действительно передается четыре параметра...
     
  11. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Colombo

    Статьи Питрека и Гордона прочитал? Если да, то показывай код.
     
  12. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Colombo

    Вот, набросал на скорую руку демку. В ней генерируется исключение, которое затем устраняется во внутрипоточном обработчике. Внутрипоточный обработчик модифицирует структуру CONTEXT.



    З.Ы.: Проверил ее под Windows 2000 Pro (sp-3) русская версия.

    [​IMG] _1891974504__SEH.asm
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Oleg_SK



    Внутрипоточным не пользуюсь, поэтому подумал, что финальный обработчик. Хотя какая разница, структура CONTEXT ведь одинакова в обоих случаях?
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Colombo

    Прежде чем мутить воду проверь свой код и не спеши списывать собственные ошибки\описки на происки мелкософта ;)

    Поточные обработчики работают одинаково в 9х и NT. А ты скорее всего путаешь УКАЗАТЕЛЬ на CONTEXT с самой структурой. Вот типичный примерчик, который работает всегда и везде:
    Код (Text):
    1.     mov eax,[esp+0Сh]           ;<- в eax указатель lpCONTEXT
    2.     add dword [eax+0B8h],xbytes ;<- прибавляем к CONTEXT.regEIP xbytes для обхода ошибки


    cresta

    > "эти смещения. Они могут быть несколько другими"

    Могут, но только в принципе и на процессорах, существенно отличных от 32-бит x86. Иначе вся программная совместимость пойдет прахом ;)