помогите с seh'ом и c++

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

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    всем привет, пытаюсь написать свой обработчик для seh'a (на msvc++ v6.0), но возникла одна проблема, возможно ли как-нибудь передать в _initseh, адрес safe_place? и попутный вопрос, какие структуры находятся в hIgnore1 и hIgnore2 в обработчике _handler?


    Код (Text):
    1.  
    2. struct seh_table
    3. {
    4.     HWND    hWnd;
    5.     DWORD   reg_esp;
    6.     DWORD   reg_ebp;
    7.     DWORD   reg_eip;
    8. };
    9.  
    10. int _handler(LPEXCEPTION_RECORD lpRecord,DWORD hIgnore1,LPCONTEXT lpContext,DWORD hIgnore2)
    11. {
    12.     lpContext->Eip=seh.reg_eip;
    13.     lpContext->Esp=seh.reg_esp;
    14.     lpContext->Ebp=seh.reg_ebp;
    15.     return 0;
    16. }
    17.  
    18. __forceinline void _initseh()
    19. {
    20.     _asm
    21.     {
    22.     lea     eax,[seh]
    23.     push    _handler
    24.     push    dword PTR fs:[0]
    25.     mov     [seh.reg_esp],esp
    26.     mov     [seh.reg_ebp],esp
    27.     //mov       [seh.reg_eip],offset safe_place
    28.     mov     dword PTR fs:[0],esp
    29.     }
    30. }
    31.  
    32. __forceinline void _killseh()
    33. {
    34.     _asm
    35.     {
    36.     pop     dword ptr fs:[0]
    37.     add     esp,4
    38.     }
    39. }
    40.  
    41. int main(void)
    42. {
    43. _initseh();
    44. _asm int 3;
    45.  
    46. //safe_place:
    47. _killseh();
    48. }
    49.  
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
  3. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    про __try, __catch, __except и __finally я давно знаю, поэтому и пишу СВОЙ обработчик, код, который приведен вами для моего случая не годится
     
  4. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    hIgnore1 - указатель на структуру ERR:

    typedef struct _ERR

    {

    DWORD Next;

    DWORD Handler;

    } ERR, *PERR;

    Ничто не мешает добавить в эту структуру дополнительные поля (в т.ч. и адрес safe_place).
     
  5. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    как добавить адрес метки safe_place туда?
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Ну например вот так.
    Код (Text):
    1.  
    2. typedef struct _MYERR: ERR
    3. {
    4. DWORD safe_place;
    5. } MYERR, *PMYERR;
    6.  
    7. push    safe_place
    8. push    _handler
    9. push    dword PTR fs:[0]
    10. mov dword PTR fs:[0],esp
     
  7. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
  8. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
  9. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    спасибо, остановился всё-таки на способе не __forceinline вставок, а просто вставок