Как определить какой модуль запустил конкретный поток?
От: alienufo Россия  
Дата: 27.09.07 12:12
Оценка:
hi all.

Проблема в следующем. Поставщик, для работы с оборудованием, предоставляет dll в которой был замечен баг, а именно то, что при выгрузке dll не закрывает поток, открытый при инициализации, и это приводит к фатальным ошибкам всего приложения. Задача проста завершить то, что должна делать dll, а именно закрыть все созданные ею потоки. Перебор всех потоков в процессе я организовал но вот как определить какой поток мой, а кокой dll я не знаю.

К примеру:
В Process Explorer`е на закладке "Threads" в поле "Start Address" указаны <имя модуля>!<функция>+<адрес>. <адрес> я получаю, а вот с <имя модуля> беда.

Есть идеи?
-= The Alien//Ufocomp =-
Re: Как определить какой модуль запустил конкретный поток?
От: Unmanaged Россия ICQ 476611995
Дата: 27.09.07 12:41
Оценка:
A>К примеру:
A>В Process Explorer`е на закладке "Threads" в поле "Start Address" указаны <имя модуля>!<функция>+<адрес>. <адрес> я получаю, а вот с <имя модуля> беда.

Process Explorer работает с Native API.
В вашем случае всё несколько проще.

A>Есть идеи?


Можно почитать вот эту статью — Enumerating All Modules For a Process.
Это при условии, что вам известен виртуальный адрес рабочей функции потока.
Если кратко, то алгоритм должен выглядеть так:

1. OpenProcess()
2. EnumProcessModules()
3. GetModuleFileNameEx()
4. GetModuleInformation()
5. CloseHandle()

GetModuleFileNameEx() — для каждого модуля получим полный путь к файлу. Если это нужный нам модуль, то далее функция GetModuleInformation() подскажет адрес загрузки этого модуля и размер его образа в памяти. Остаётся только вычислить, находится ли адрес функции потока в пределах этого модуля или нет. Всё.
STATUS_INVALID_DEVICE_REQUEST
Re[2]: Как определить какой модуль запустил конкретный поток
От: alienufo Россия  
Дата: 27.09.07 13:56
Оценка:
Здравствуйте, Unmanaged, Вы писали:

U>Остаётся только вычислить, находится ли адрес функции потока в пределах этого модуля или нет. Всё.


Спасибо, огромное, именно так всё и получилось.
-= The Alien//Ufocomp =-
Re: Как определить какой модуль запустил конкретный поток?
От: quodum  
Дата: 27.09.07 16:21
Оценка:
Здравствуйте, alienufo, Вы писали:

[]

A>Есть идеи?


Посмотри еще на GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.