Как определить инициатора SEH

Тема в разделе "WASM.WIN32", создана пользователем Vasil, 9 мар 2006.

  1. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Ребята, кто решал подобные задачи, - HELP:



    Допустим есть несколько DLL с экспортируемой процедурой. Эта proc будет вызываться в другом потоке (CreateThread) основным потоком. Основной же поток выполняет проверку флага завершения, по которому процесс завершает свою работу.



    И ВДРУГ В КАКОМ-НИБУДЬ ПОТОКЕ ПРОИЗОШЛО ИСКЛЮЧЕНИЕ (SEH)!!! :dntknw:



    Отловить то это исключение я смогу (см. ниже), а как узнать hDLLInstance DLL-библиотеки, процедура (поток) которой нагадила всему процессу ?



    Конструкция основного потока:

    ; Создание потоков...

    ;__try

    ; xor ebx, ebx

    ; mov bStopService, ebx

    ; .REPEAT

    ; исключения возникнут где то здесь...

    ; invoke SleepEx, 20, ebx

    ; .UNTIL ebx != bStopService

    ;__except(EXCEPTION_EXECUTE_HANDLER)

    ; ЧО ДЕЛАТЬ ТО !?

    ; :dntknw:)

    ;__end
     
  2. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    "исключения возникнут где то здесь..." - имеется в виду в блоке __try ... __except, и другим потоком.
     
  3. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Вводи глобал вариабле, и вначале присваивай ей нуль. В DLL вводи .tls переменную и храни там ее базовый адрес. В блоке __except присваивай глобал вариэйбл значение из .tls
     
  4. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    А локальная область хранения потоков что мне даст ?..
     
  5. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Тебе же нужно узнать какой поток? А откуда поток знает из какой DLL он загружен. Вот из тээлэс и узнает.
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Узнать поток можно с помощью GetCurrentThreadId, а узнать стартовый адрес этого потока с помощью ZwQueryInformationThread
     
  7. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    Bill_Prisoner А если в DLL функция TlsAlloc не определена, то как ?



    Ms Rem Исключение возникает в другом потоке, а обработка осуществляется в главном. GetCurrentThreadId даст мне идентификатор главного потока.
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Что за глупость ты говоришь? Исключения всегда обрабатываются в том потоке, в котором возникают.

    Честно говоря, вся тема (и ответы) мне кажутся полным бредом.
     
  9. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    ЭЭЭэээ...

    Действительно, что-то не то :)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))



    Sorry, это у меня от бессоницы-цы-ы =)



    Zz...