Передача параметра в CreateThread

Discussion in 'WASM.WIN32' started by ZeroMemory, Jul 8, 2005.

  1. ZeroMemory

    ZeroMemory New Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2005
    Messages:
    79
    Приветствую господа.



    в общем так, имеется char* buff1 необходимо его передать в кач-ве параметра ф-ции CreateThread, что я собсно и делаю:
    Code (Text):
    1. CreateThread(NULL, 0, &LogSend, buff1, 0, &lsid);




    далее из потоковой ф-ции, хочу его получить обратно :) и делаю:
    Code (Text):
    1. char *pIn = (char*)param;
    2. MessageBox(NULL, pIn, "", MB_OK);
    3.  




    но месседжбокс показывает ерунду. видимо я переработал... но чтото никак не получается.. помогите плз.



    Спасибо
     
  2. Dr.Golova

    Dr.Golova New Member

    Blog Posts:
    0
    Joined:
    Sep 7, 2002
    Messages:
    348
    Интересно что делает первый поток после вызова CreateThread()? Если он не висит в бесконечном цикле и буффер был на стэке, то все логично - стэк будет испорчен :)
     
  3. ZeroMemory

    ZeroMemory New Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2005
    Messages:
    79
    Да нет :))

    CreateThread() вызывается единожды :). А после его вызова, программа продолжает свои зловредные действия ;)
     
  4. Ms Rem

    Ms Rem New Member

    Blog Posts:
    0
    Joined:
    Apr 17, 2005
    Messages:
    1,057
    Location:
    С планеты "Земля"
    Во-первых, прежде чем передавать параметры функции CreateThread нужно выделить под них память с помощью Virtual/HeapAlloc, а освобождать в треде, когда не будет нужна.



    Во-вторых - надо выпрямлять руки :)
     
  5. cresta

    cresta Active Member

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    2,257
    В приведенном куске кода ошибки нет. MessageBox исправно показывает неискаженное сообщение, если buff1 глобальный.



    Если buff1 на стеке, то я пробовал из WndProc вызывать поток с локальным buff1 - тоже нормально передаётся. Видимо не обязательно должен перетираться буфер.



    А другие куски кода не имеют доступа к памяти, где находится buff1? Может (несанкционированно) какой-то участок кода переписывает твой буфер, пока он не дошёл до потока?
     
  6. Max

    Max Member

    Blog Posts:
    0
    Joined:
    May 22, 2003
    Messages:
    192
    cresta

    факты о том, что с глобальным буфером все нормально, а с локальным - нет, наводят на следующее...

    твой поток реально может получить управление [намного] позже CreateThread.

    то есть идет вызов CreateThread, потом какая-то работа со стеков (буфер портится), потом время получает твой поток, и усе...

    по нормальному делают как сказал Ms Rem, это классика.
     
  7. Quantum

    Quantum Паладин дзена

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Ms Rem



    Зачем же так радикально? Можно объявить буффер глобальным. Можно и на стеке, если есть уверенность в том, что стек не перетрётся пока буффер используется в треде.



    ZeroMemory

    Берём OllyDbg, ставим бряк на запись в первый байт беффера, жмём F9 и ждём :)
     
  8. cresta

    cresta Active Member

    Blog Posts:
    0
    Joined:
    Jun 13, 2004
    Messages:
    2,257
    Max

    Невнимательно читаешь. Нормально работает и с локальным и с глобальным буфером.

    А VirtualAlloc - это уж слишком. Может ещё и отдельный ехе запустить вместо потока?