Ребята, кто решал подобные задачи, - HELP: Допустим есть несколько DLL с экспортируемой процедурой. Эта proc будет вызываться в другом потоке (CreateThread) основным потоком. Основной же поток выполняет проверку флага завершения, по которому процесс завершает свою работу. И ВДРУГ В КАКОМ-НИБУДЬ ПОТОКЕ ПРОИЗОШЛО ИСКЛЮЧЕНИЕ (SEH)!!! Отловить то это исключение я смогу (см. ниже), а как узнать hDLLInstance DLL-библиотеки, процедура (поток) которой нагадила всему процессу ? Конструкция основного потока: ; Создание потоков... ;__try ; xor ebx, ebx ; mov bStopService, ebx ; .REPEAT ; исключения возникнут где то здесь... ; invoke SleepEx, 20, ebx ; .UNTIL ebx != bStopService ;__except(EXCEPTION_EXECUTE_HANDLER) ; ЧО ДЕЛАТЬ ТО !? ; ) ;__end
"исключения возникнут где то здесь..." - имеется в виду в блоке __try ... __except, и другим потоком.
Вводи глобал вариабле, и вначале присваивай ей нуль. В DLL вводи .tls переменную и храни там ее базовый адрес. В блоке __except присваивай глобал вариэйбл значение из .tls
Тебе же нужно узнать какой поток? А откуда поток знает из какой DLL он загружен. Вот из тээлэс и узнает.
Узнать поток можно с помощью GetCurrentThreadId, а узнать стартовый адрес этого потока с помощью ZwQueryInformationThread
Bill_Prisoner А если в DLL функция TlsAlloc не определена, то как ? Ms Rem Исключение возникает в другом потоке, а обработка осуществляется в главном. GetCurrentThreadId даст мне идентификатор главного потока.
Что за глупость ты говоришь? Исключения всегда обрабатываются в том потоке, в котором возникают. Честно говоря, вся тема (и ответы) мне кажутся полным бредом.
ЭЭЭэээ... Действительно, что-то не то )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) Sorry, это у меня от бессоницы-цы-ы =) Zz...