Як знайти певний модуль в завантаженому процесі «С++»

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Допустимо маю я певний процес. В ньому є кілька длл. Я хочу завантажити ще одну ДЛЛ, проте якщо вона уже буде завантажена програма впаде. Мені потрібно дізнатись чи є завантажена ця ДЛЛ в адресний простір процесу.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Если надо узнать, то GetModuleHandle (...)


Питер Джеремми 1 час назад

Допустимо маю я певний процес. В ньому є кілька длл. Я хочу завантажити ще одну ДЛЛ, проте якщо вона уже буде завантажена програма впаде. Мені потрібно дізнатись чи є завантажена ця ДЛЛ в адресний простір процесу.

Если вы второй раз вызовете LoadLibrary вы всего лишь получите еще один хендл на уже загруженную Dll, без её повторной загрузки.

По поводу энумерации см 1 ответ.

Второй раз вызывать LoadLibrary для той же dll — это нормально. Если dll своя и должна быть загружена только один раз в процесс/инстенс, то можно вот так:


#pragma data_seg(".sdata")
int inited = 0;
#pragma data_seg()

И при attach’е проверять inited на! =0. Если равен нулю, то уставить в другое значение.

Если нужно проверять была ли загружена dll глобально в системе, а не только в рамках процесса/инстенса, то делать то же самое через shared memory.

Ні я мав на увазі АвтоКАД і написані під нього модулі. Взагалі я проблему уже вирішив.

Всім спасибі.

Так это, если процесс свой, ну в смысле сам вызываешь LoadLibrary — то при повторном вызове (для одной и той же dll) никаких падений не должно быть.

Я так подозреваю, речь идет о каких-то хаках с инджекшеном dll в чужой процесс, ну или что-то в этой роде...

:) если дллка твоя, то нужно ее переписать так, чтобы не падало, или выкинуть нафиг. Как оно может падать при повторной загрузке? разве что какойто джуниор с очередной софтваре фектори это написал.
1.Если не твоя, и выкинуть нельзя, то в чем проблема в какой-то глобальной переменой сохранить статус — «уже загружено»?

2. покапатся в мсдн и найти что-то вроде EnumProcessModules и примеры использованя., но делать такое перед LoadLibrary — жуткий изврат.

Если не ошибаюсь то EnumProcessModules (Ex) / GetModuleFileName (Ex) должны помочь.

Підписатись на коментарі