hi all.
Проблема в следующем. Поставщик, для работы с оборудованием, предоставляет dll в которой был замечен баг, а именно то, что при выгрузке dll не закрывает поток, открытый при инициализации, и это приводит к фатальным ошибкам всего приложения. Задача проста завершить то, что должна делать dll, а именно закрыть все созданные ею потоки. Перебор всех потоков в процессе я организовал но вот как определить какой поток мой, а кокой dll я не знаю.
К примеру:
В Process Explorer`е на закладке "Threads" в поле "Start Address" указаны <имя модуля>!<функция>+<адрес>. <адрес> я получаю, а вот с <имя модуля> беда.
Есть идеи?
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() подскажет адрес загрузки этого модуля и размер его образа в памяти. Остаётся только вычислить, находится ли адрес функции потока в пределах этого модуля или нет. Всё.
Здравствуйте, alienufo, Вы писали:
[]
A>Есть идеи?
Посмотри еще на
GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS.