Добрый день! Возникла проблема с выгрузкой DLL. С помощью драйвера и APC подгружаю свою DLL в процесс при его запуске. Есть необходимость перемещения/удалении dl без перезагрузки ПК а для этого соответственно требуется выгрузить эту dll. Использование FreeLibraryAndExitThread не помогает. Приходит уведомление DLL_PROCESS_DETACH в процедуру DllMain, но сам модуль остается висеть в списке загруженных. Причем, если загрузить Dll в процесс внутри программы стандартным вызовом LoadLibrary, то FreeLibraryAndExitThread прекрасно отрабатывает и dll выгружается. Подскажите как выгрузить Dll в моем случаи.
Я ошибся, уведомление DLL_PROCESS_DETACH не приходит после вызова FreeLibraryAndExitThread. Итого приходит один DLL_PROCESS_ATTACH соответственно счетчик не уменьшается.
Дык DLL_PROCESS_DETACH прийдет когда счетчик ссылок будет равен нулю. Ты ее через LoadLibrary грузил или вручную отмапил? Последи за счетчиком ссылок на эту длл-ку.
Грузил через внедрение шелкода с вызовом LoadLibrary. Опытным путем установил, что данная проблема проявляется при форсировании доставки APC во время инжекта. Если не форсировать доставку Apc, dll выгружается корректно.
я так понимаю - высвободить виртуальную память ей занимаемую и снести из пеба (возможно забыл чего) а кстати чего там с csr?
задачи грузить в csrss процесс нет, только пользовательские процессы. Вопрос в принципе снят, всем спасибо
Так я же вроде написал, проблема возникает если использовать форсирование доставки APC при инжекте. Мне не принципиально было чтобы моя dll грузилась самой первой, поэтому собственно убрал форсирование и все заработало как надо. (по крайней мере в тестовой среде)