У меня есть DLL, которую я впрыскиваю в другие процессы, используя SetWindowsHookEx
. Внутри DLL я увеличиваю опорный счетчик модуля, вызвав GetModuleHandleEx
, чтобы я мог контролировать, когда модуль выгружен.Выгрузка вложенной DLL
На этом этапе счетчик ссылок модуля должен быть «2» из обоих этих вызовов API. Когда вызывающий процесс выключается, он вызывает UnhookWindowsHookEx
, уменьшая количество ссылок до 1. В DLL есть поток, который ждет несколько вещей, один из которых является дескриптором процесса, который называется SetWindowsHookEx
. Когда процесс уходит, DLL выполняет некоторую очистку, завершает все потоки, очищает память и обрабатывает, а затем вызывает FreeLibraryAndExitThread
. Это уменьшает счетчик, и DLL выгружается.
Вот моя проблема. Существует несколько процессов, особенно без пользовательского интерфейса, где DLL никогда не выгружается. Я довольно уверен, что все убрал. И я знаю, что ни один из моих потоков не работает.
Прежде всего, если у вас есть советы по устранению неполадок, которые помогут раскрыть причину, это было бы полезно. В противном случае я думал об использовании какого-либо API, например, NtQueryInformationProcess
, чтобы получить адрес модуля и подтвердить, что число обработчиков модуля фактически равно нулю, а затем вызывает CreateRemoteThread
, чтобы ввести вызов LdrUnloadDll
, чтобы выгрузить адрес модуля из процесса. Каковы ваши мысли к этому подходу? Есть ли у кого-нибудь пример кода? У меня возникли трудности с выяснением того, как получить счетчик модулей.
Вместо того, чтобы вызывать 'NtQueryInformationProcess' самостоятельно, вы должны получить эту информацию от windbg, по крайней мере, на этих этапах устранения неполадок. –
Hook DLL вводятся и удаляются, когда целевой процесс передает сообщения. (Так как это единственный раз, когда безопасно вводить код в поток.) Если в процессе нет пользовательского интерфейса, он может прекратить перекачку сообщений, после чего у диспетчера окон нет возможности получить контроль. Включение вызова «Разгрузка» просто создает новую проблему: когда целевой процесс окончательно решает перекачать сообщения снова, у вас будет ошибка с двойным доступом. –
Я подтвердил, что приложение не получает сообщение, которое вызывает декремент счетчика ссылок. Я добавил код, который узнал счетчик, и уменьшил число, и библиотеки DLL сразу разгружаются, но, как вы подозревали, я считаю, что вижу проблему с двойным свободным сообщением, когда сообщение наконец приходит. Я думал, что если проблема связана с отсутствием работающего насоса сообщений, возможно, все, что мне нужно сделать, это создать его? Я пробовал это, однако, это не называется. Любые мысли по этому поводу? – tdemay