Везде говорится о том что вызывать CreateThread в DllMain не желательно. Не полениля прочитал все сообщения касаемо этого на форуме - но решения так и не нашел. Дак как же все нужно создавать свой поток в чужем приложении? Как вариант думаю можно создать экспортируемую функцию в dll и вызвать CreateRemoteThread из инжектирующего кода на этот адрес, вот только как грамотно передать адрес этой функции в инжектирующий код? Есть более элегантные решения?
Хм-хм. Насколько я знаю, нежелательно вызывать LoadLibrary... Вроде ничего страшного не должно произойти при вызове CreateThread. Если не нравиться - можно из DllMain передать каким-либо (:rolleyes способом в основное приложение адрес функции функции, создающей поток... Оконные сообщения, проецируемые в память файлы...
Можно, только с условием, что в самой программе больше не будет создаваться ни каких потоков. При создании нового потока, созданный поток в DllMain остановится.
al79 Тут мы разсматриваем случай когда это невозможно. Но все равно спасибо - теперь я понимаю ПОЧЕМУ это не возможно. Таймер? это значит мне придется использовать оконную процедуру и обработку сообщений... ну уж нафиг. Пока остановился на варианте передачай адреса через проецируемые файлы. Есть еще варианты?
После выхода из DllMain новый поток вроде дотжен стартануть. Тока создовать надо в DLL_PROCESS_ATTACH (проверял - работает) , а в DLL_PROCESS_DETACH прибиваю
wsd ага, предлагаешь msg_loop: крутить в дллмайн? ) SWR Я так и делаю. поток то запускается. Проблема в том что в этом потоке в мне нужно вызывать функцию расположенную в основном потоке приложения. А вот это почему то не работает.
Таймер, таймер.. Сделал так proc DllEntry hInstDLL, reason, reserve .if [reason]=DLL_PROCESS_ATTACH invoke SetTimer,NULL,NULL,1000,TimerProc .endif mov eax,TRUE ret endp proc TimerProc, hwnd, uMsg, idEvent, dwTime int3 ret endp не вызывается функция таймера.
а в чем собсна проблема? адреса другие, что ли? объясни подробнее, как разные потоки мешают вызывать функцию, которая всегда лежит в одном и том же месте для любого потока???
MSoft обясняю подрбнее - вызов функции из потока dllMain и из основного потока обрабатывался по разному. Почему - я не знаю. Сейчас от вызова этой функции видимо придется отказаться. Я реализовал инжект базонезависимого кода - результат такой же GUI зависает, так что дело совсем не в потоках. Благодарю всех.
Тогда в дллмэин правь EP ехека, штобы при передаче ему управления он стартовал твой код. И стартанувший код вернёт байты EP на место. Метод черезжопный для кавото но при этом не нарушает никаких правил.