SEH, проблемы с обработкой ошибки

Тема в разделе "WASM.WIN32", создана пользователем hawk, 5 авг 2011.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Здравствуйте.
    Подскажите пожалуйста кто знает, что я не так делаю в SEH.
    На C реализовывал такую структуру проблем не было, а как это в asm
    перекинуть не могу понять.

    Код (Text):
    1. include shell32.inc
    2. include    kernel32.inc
    3.     .386
    4.     .model    flat
    5.     .const
    6. szTitle         db      "Exit Seh",0
    7. szMessage       db      "Exit Seh",0
    8.  
    9.     .code
    10. _start:
    11.     call    delta  
    12.     delta:
    13.     pop     ebp
    14.     mov     eax,ebp
    15.     mov    edx,ebp
    16.    
    17.     push offset Exeption
    18.     push     dword ptr fs:0
    19.     mov    fs:0,esp
    20. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    21.     mov     eax,0
    22.     mov     [eax], eax
    23. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    24. ERT2:
    25.     mov ecx,eax
    26.     push    0
    27.     push    offset szTitle
    28.     push    offset szMessage
    29.     push    0
    30.     call    MessageBox
    31.     ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    32.     mov     eax,[esp]
    33.     mov     dword ptr fs:0,eax
    34.     add     esp, 8  
    35.     push    ebx
    36.     call    ExitProcess
    37.  
    38. Exeption:
    39.    
    40.     pop eax
    41.     pop ebx
    42.     pop ecx
    43.     pop edx
    44.     push    0
    45.     push    0
    46.     push    0
    47.     push    0
    48.     call    MessageBox
    49.     lea    eax,szMessage
    50.     mov [ebx+0B0h],eax
    51.     xor eax,eax
    52.     ret
    53. end    _start
    Заранее благодарен.
    С уважением,
    RED HAWK
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    И что это за pop-ы в начале обработчика? Хоть бы почитал чего для начала, например тут
     
  3. xssww2

    xssww2 New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2009
    Сообщения:
    84
    Код (Text):
    1. struc SEH_CONTEXT
    2. ;Structure of the SEH context
    3. {
    4. .ddContextFlags         dd  ?
    5. .ddDR0              dd  ?
    6. .ddDR1              dd  ?
    7. .ddDR2              dd  ?
    8. .ddDR3              dd  ?
    9. .ddDR6              dd  ?
    10. .ddDR7              dd  ?
    11. .strcFloatingArea       db  (8*4+8*10) dup (?)
    12. .ddGS               dd  ?
    13. .ddFS               dd  ?
    14. .ddES               dd  ?
    15. .ddDS               dd  ?
    16. .ddEDI              dd  ?
    17. .ddESI              dd  ?
    18. .ddEBX              dd  ?
    19. .ddEDX              dd  ?
    20. .ddECX              dd  ?
    21. .ddEAX              dd  ?
    22. .ddEBP              dd  ?
    23. .ddEIP              dd  ?
    24. .ddCS               dd  ?
    25. .ddEFlags           dd  ?
    26. .ddESP              dd  ?
    27. .ddSS               dd  ?
    28. }
    29. virtual at 0
    30. strcSEH             SEH_CONTEXT
    31. @StrcSEHSize            =   ($ - strcSEH)
    32. end virtual
    33.  
    34. _ExceptionHandler:
    35. ;Input:
    36. ;      [esp+4] - strcExceptionRecord
    37. ;      [esp+8] - ddEstablisherFrame
    38. ;      [esp+0ch] - strcContextRecord
    39. ;      [esp+10h] - ddDispatcherContext
    40.  
    41.  
    42.             pushad
    43.             mov ebp,[esp+0ch+4*8]       ;ebp points to the exception structure
    44.             mov eax,pntrReturnAddress
    45.             mov [ebp+strcSEH.ddEIP],eax
    46.             popad
    47.             xor eax,eax
    48.             ret 4*4
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    xssww2
    1) Для чего pushad с ebp? Или юзать edx\ecx "безпантово"? ;)
    2) ret 4*4 - ва-аще не правильно, т.к. обработчик вызывается как cdecl, а не stdcall -> нужно просто ret
     
  5. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    leo
    Можно обоими способами.
     
  6. xssww2

    xssww2 New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2009
    Сообщения:
    84
    яж не специально писал сюда код, а под рукой был свой, удалил лишнее оставил что есть, запостил