SEH
От: Аноним  
Дата: 17.02.11 16:38
Оценка:
Есть вот такой код:

EXCEPTION_DISPOSITION  __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord,  void * EstablisherFrame,
                                                 struct _CONTEXT *ContextRecord, void * DispatcherContext )
 {
     // Видимо, здесь нужно вычислить адрес __label1 и сделать ContextRecord->Eip = (DWORD) __label1 и вернуть ExceptionContinueExecution;     
     // Или нет.. 
 }

int main(int argc, CHAR* argv[])
{
    DWORD handler = (DWORD) _except_handler;
    __asm
    {                     
        push    handler   
        push    FS:[0]    
        mov     FS:[0],ESP 
    }    


    __asm {
        xor eax, eax
        call eax
    }

    printf("...");

    __asm
    {                   
        mov     eax,[ESP]
        mov     FS:[0], EAX
        add     esp, 8     
    }

__label1:
    printf("OK");



Как правильно изменить данный код, чтобы исключение было обработано и команда printf("OK") выполнилась?
Re: SEH
От: Аноним  
Дата: 17.02.11 17:59
Оценка:
Вместо printf("...") может быть любой другой код, поэтому в обработчике исключения, как я понимаю, нужно еще стек удержать, чтобы спокойно продолжить работу..
Re: SEH
От: shasa  
Дата: 17.02.11 19:43
Оценка: +1
Здравствуйте, Аноним, Вы писали:
А>Есть вот такой код...
Цель сего безумия?
Re: SEH
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 22.02.11 05:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть вот такой код:


А>
А>EXCEPTION_DISPOSITION  __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord,  void * EstablisherFrame,
...
А>



А>Как правильно изменить данный код, чтобы исключение было обработано и команда printf("OK") выполнилась?


Вот так:

int main(int argc, CHAR* argv[])
{
    try
    {
        throw "ERROR";
    }
    catch (...)
    {
        printf("OK");
    }
}
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.