Re[2]: Проблемы с SetUnhandledExceptionFilter
От: MescalitoPeyot Украина  
Дата: 05.08.06 03:34
Оценка:
СМ>1. все dll/exe консольные?
СМ>2. мб консоль не иниц до вызова exe, а искл происходит в dllmain
СМ>3. мб установлен другой фильтр, который снимает консоль и вызывает твой
СМ>4. у меня в SetUnhandledExceptionFilter сначала пытается вывести в консоль по WriteConsole, если неудача, то WriteFile туда же, если снова не удача, то выдается диалог.

1. Да. Хотя в gui наблюдается тоже самое
2. Нет. Эксперементируя я сам генерировал исключение
3. Фильтр в программе один
4. Т. е. такие траблы наблюдаются? А часто бывает так, что WriteConsole не срабатывает, а WriteFile — работает?

Блин, что-то у меня проблемы с вложением, выложу код тестовых примеров здесь (заранее прошу прощения за большой пост):

seh.dll — с обработчиком
format PE Dll
entry start

include '%FASM%\include\win32a.inc'

section '.data' data readable writeable

        nStCon  dd      0
        hOut    dd      0

        hello   db      'Hello world',0

section '.code' code readable executable

FinalSEH:
        xor     eax,eax
        push    eax
        push    nStCon
        push    11
        push    hello
        push    [hOut]
        call    [WriteConsole]
        xor     eax,eax
        inc     eax
        ret     4

outit:
        push    [hOut]
        call    [CloseHandle]
        jmp     endstart

start:
        mov     eax,[esp+8]
        test    eax,eax
        jz      outit
        dec     eax
        jz      init
        mov     eax,esp
endstart:
        ret     12

init:
        push    FinalSEH
        call    [SetUnhandledExceptionFilter]
        push    STD_OUTPUT_HANDLE
        call    [GetStdHandle]
        mov     [hOut],eax
        jmp     endstart
Init:
        ret

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL'

        import  kernel32,\
                WriteConsole,'WriteConsoleA',\
                AllocConsole,'AllocConsole',\
                GetStdHandle,'GetStdHandle',\
                SetUnhandledExceptionFilter,'SetUnhandledExceptionFilter',\
                ExitProcess,'ExitProcess',\
                CloseHandle,'CloseHandle'

section '.edata' export data readable

        export  'SEH.DLL',\
                Init,'Init'

section '.reloc' fixups data discardable


layer.dll — дополнительная библиотека, в которой генерируется исключение
        format PE Dll
        entry start

include '%FASM%\include\win32a.inc'

section '.code' readable executable

start:
        mov     eax,esp
        ret     12

Start:
        xor     ebx,ebx

        mov     [ebx],ebx
        push    ebx
        call    [ExitProcess]

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL',\
                seh,'SEH.DLL'

        import  kernel32,\
                ExitProcess,'ExitProcess'

        import  seh,\
                Init,'Init'

section '.edata' export data readable

        export  'LAYER.DLL',\
                Start,'Start'

section '.reloc' fixups data discardable


test1.asm — первый пример, главный модуль + seh.dll, WriteConsole работает
format PE at 400000h
entry start

include '%FASM%\include\win32a.inc'

section '.code' code readable executable

start:
        call    [Init]
        xor     eax,eax
        mov     [eax],eax

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL',\
                seh,'SEH.DLL'

        import  kernel32,\
                ExitProcess,'ExitProcess'

        import  seh,\
                Init,'Init'


test2.asm — второй пример, главный модуль + seh.dll + layer.dll в которой генерируется исключение, WriteConsole не работает
        format PE GUI 4.0 at 400000h
        entry start

include '%FASM%\include\win32a.inc'

section '.code' readable executable

start:
        xor     ebx,ebx
        call    [Init]
        call    [Start]
        push    ebx
        call    [ExitProcess]

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL',\
                layer,'LAYER.DLL',\
                seh,'SEH.DLL'

        import  kernel32,\
                ExitProcess,'ExitProcess'

        import  layer,\
                Start,'Start'

        import  seh,\
                Init,'Init'

Наличие вызова AllocConsole в seh.dll, размещение SetUnhandledExceptionFilter и GetStdHandle в dllmain или в специальной процедуре инициализации библиотеки, дополнительный GetStdHandle в обработчике исключений проблемы не решают — установлено опытным путём
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.