CreateThread в DllMain

Тема в разделе "WASM.BEGINNERS", создана пользователем assorted, 31 мар 2008.

  1. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Везде говорится о том что вызывать CreateThread в DllMain не желательно. Не полениля прочитал все сообщения касаемо этого на форуме - но решения так и не нашел. Дак как же все нужно создавать свой поток в чужем приложении?

    Как вариант думаю можно создать экспортируемую функцию в dll и вызвать CreateRemoteThread из инжектирующего кода на этот адрес, вот только как грамотно передать адрес этой функции в инжектирующий код?

    Есть более элегантные решения?
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Хм-хм. Насколько я знаю, нежелательно вызывать LoadLibrary... Вроде ничего страшного не должно произойти при вызове CreateThread.
    Если не нравиться - можно из DllMain передать каким-либо (:rolleyes:) способом в основное приложение адрес функции функции, создающей поток...
    Оконные сообщения, проецируемые в память файлы...
     
  3. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    а таймер создать разве нельзя ?
     
  4. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Можно, только с условием, что в самой программе больше не будет создаваться ни каких потоков. При создании нового потока, созданный поток в DllMain остановится.
     
  5. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    al79
    Тут мы разсматриваем случай когда это невозможно. Но все равно спасибо - теперь я понимаю ПОЧЕМУ это не возможно.

    Таймер? это значит мне придется использовать оконную процедуру и обработку сообщений... ну уж нафиг.

    Пока остановился на варианте передачай адреса через проецируемые файлы.
    Есть еще варианты?
     
  6. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    assorted
    доки про таймер лучше прочти
     
  7. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    После выхода из DllMain новый поток вроде дотжен стартануть.
    Тока создовать надо в DLL_PROCESS_ATTACH (проверял - работает) , а в DLL_PROCESS_DETACH прибиваю
     
  8. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    wsd
    ага, предлагаешь msg_loop: крутить в дллмайн? )

    SWR Я так и делаю. поток то запускается. Проблема в том что в этом потоке в мне нужно вызывать функцию расположенную в основном потоке приложения. А вот это почему то не работает.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    читай доки про таймер.
     
  10. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Таймер, таймер..

    Сделал так

    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

    не вызывается функция таймера.
     
  11. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
     
  12. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    а в чем собсна проблема? адреса другие, что ли? объясни подробнее, как разные потоки мешают вызывать функцию, которая всегда лежит в одном и том же месте для любого потока???
     
  13. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    MSoft обясняю подрбнее - вызов функции из потока dllMain и из основного потока обрабатывался по разному. Почему - я не знаю. Сейчас от вызова этой функции видимо придется отказаться. Я реализовал инжект базонезависимого кода - результат такой же GUI зависает, так что дело совсем не в потоках.

    Благодарю всех.
     
  14. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Тогда в дллмэин правь EP ехека, штобы при передаче ему управления он стартовал твой код. И стартанувший код вернёт байты EP на место. Метод черезжопный для кавото но при этом не нарушает никаких правил.