Свой SEH в VC8

Тема в разделе "WASM.WIN32", создана пользователем perdimonokl, 7 июн 2009.

  1. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Народ либо у меня руки кривые просто жесть какие кривые, либо я чето не так делаю.

    Короче дело такое. Хотел поразбираться с SEH. Код старый я думаю все его знают(то шо в комментах не смотрите эт мои бредни =) ).

    Код (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2. #include <windows.h>
    3. #include <stdio.h>
    4.  
    5. //#pragma comment ( linker,"/entry:main" )
    6.  
    7. DWORD scratch;
    8.  
    9. EXCEPTION_DISPOSITION __cdecl _except_handler(struct _EXCEPTION_RECORD *ExceptionRecord, void *EstablisherFrame, struct _CONTEXT* ContextRecord, void *DispatcherContext)
    10. {
    11.     unsigned i;
    12.     printf("Hello from exception...\n");
    13.     ContextRecord->Eax = (DWORD)&scratch;
    14.     return ExceptionContinueExecution;
    15. }
    16.  
    17. /*LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
    18. {
    19.     HANDLE hThread;
    20.     CONTEXT ctx;
    21.  
    22.     if(pExceptionInfo->ExceptionRecord->ExceptionCode == 0xC0000094)
    23.     {
    24.         hThread = GetCurrentThread();
    25.         GetThreadContext(hThread,&ctx);
    26.         printf("ExceptionCode: 0x%.8X\nDr0: 0x%.8X\nDr1: 0x%.8X\nDr2: 0x%.8X\nDr3: 0x%.8X\n",pExceptionInfo->ExceptionRecord->ExceptionCode, ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3);
    27.     }
    28.     return ExceptionContinueExecution; //ExceptionContinueExecution
    29. }*/
    30.  
    31. int main(int argc, char *argv[])
    32. {
    33.     /*WORD res = 0;
    34.     SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    35.     __asm {
    36.         mov ax,9
    37.         mov cx,0
    38.         xor edx,edx
    39.         div cx
    40.         mov res,ax
    41.     }*/
    42.     DWORD handler = (DWORD)_except_handler;
    43.     __asm {
    44.         push handler
    45.         push fs:[0]
    46.         mov fs:[0], esp
    47.     }
    48.     __asm {
    49.         mov eax, 0
    50.         mov [eax], 1
    51.     }
    52.     printf("After writing!\n");
    53.     __asm {
    54.         mov eax, [esp]
    55.         mov fs:[0], eax
    56.         add esp, 8
    57.     }
    58.     printf("Hay!!!\n");    
    59.     return 0;
    60. }
    Компилю из IDE на своей VС8, компилится норм но на обработчик исключений не переходит.
    Открываю "Visual Studio 2005 Command Prompt" и компилю оттуда тупо через cl.exe main.cpp, тож самое.
    Открываю cmd.exe, настраиваю все переменные окружения руками, компилю cl.exe main.cpp и опять компилится но опять же не переходит на обработчик исключений.

    Я просто запарился уже. С кучей опций компилера и линкера играл и бесполезно, ну не переходит он на мой обработчик и все тут =(

    А самый прикол в том что когда я знакомому дал, он скомпилил под VC6 просто cl.exe main.cpp и все у него работает. Я ф панике просто =) Кто может подскажите как правильно под этой VC8 комплить уже 3-ий день. В инете ниче не нарыл. В ольке тоже не брякается в обработчике.
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    В свойствах проекта, Linker => Command Line => Additional Options => добавь ключ /SAFESEH:NO.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    UnhandledExceptionFilter это не системный финальный обработчик из kernel32, который вызывается при обработки первого сех-фрейма который устанавливается для треда перед передачей управления потоком на Win32StartAddress. Если удалить первый сех-фрейм, то никакой финальный обработчик не будет вызван, аналогично если у процесса есть отладочный порт(как в вашем случае). К структурной обработке исключений не имеет никакого отношения. Ваш _except_handler должен быть вызван. Под отладчиком UnhandledExceptionFilter не будет вызван.
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Clerk
    Без /SAFESEH:NO не будет вызван _except_handler, если скомпилировано в vc8.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    TSS
    Я не имею представления об этих проблемах с компилятором.
     
  6. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    TSS
    SAFESEH это "защита" от подмены SEH обработчика на уровне PE (через LoadConfig диру). Никак не влияет на работу штатных обработчиков.
     
  7. perdimonokl

    perdimonokl New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2007
    Сообщения:
    38
    Ё маё братцы =) /SAFESEH:NO помогло =) Огромное спасибоTSS

    Clerk На счет UnhandledExceptionFilter спс разберусь, SEH запутанная тема. Да и это я смотрел по началу с его помощью коды эксепшнов =)
     
  8. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    dermatolog
    Как это не влияет? Если бы не влиял - топика не существовало бы.
     
  9. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    TSS
    При SAFESEH:YES компилер создает "белый" список обработчиков исключений и всё это дело хранится через указатель в структуре в LoadConfig дире. При возникновении исключения венда перед переходом на обработчик сначала смотрит "валидность" обработчика, проверяя его адрес по списку. Если устанавливать обработчики "руками" (как это сделано в первом посте), о которых компилер ничего не знает - тогда действительно SAFESEH:NO решит проблему.
     
  10. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    dermatolog
    Ну блин, само собой установленный обработчик НЕ через
    Код (Text):
    1.        
    2. push handler
    3. push fs:[0]
    4. mov fs:[0], esp
    будет вызыван, моя фраза "Без /SAFESEH:NO не будет вызван _except_handler, если скомпилировано в vc8." была сказана в контексте этого топика.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если пишите на си, на нём всё и пишите. Если на асме - про паскаль забыть. Иначе фтопку компилятор.