проблемы с CreateThread

Тема в разделе "WASM.WIN32", создана пользователем NoName, 30 янв 2005.

Статус темы:
Закрыта.
  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    ...

    mov eax,offset Threadproc2

    invoke CreateThread,0,0,eax,0,NORMAL_PRIORITY_CLASS,offset ThreadID2

    mov hThread2,eax

    ...



    Threadproc2 proc Param:lol: WORD

    ret

    Threadproc2 EndP



    OllyDebug выдает сообщение об непредусмотерном событии (или что то подобное) на вызове CreateThread.

    Уже волосы на голове рву, непонятно в чем ошибка.
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Моя программа без окон и консолей.
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    "unexpected event 00000002 in injected code. ..."
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NoName

    Перемнная ThreadID2 случайно не в сегменте .const?
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    q_q

    нет.

    Да и потом не в нем дело, можно NULL поставить тоже самое будет.



    .data?

    ThreadID2 dd ? ;thread id
     
  6. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Кстати примеры ицзелиона пашут почему то нормально.
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NoName

    Покажи исходник или дай exe'шник.
     
  8. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Если найдетете ошибку, лучше бы это произошло, очень мне поможете.

    Спасибо.

    [​IMG] 1095255677__Main.exe
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Процедура Thread-а это несомненно CALLBACK. И этот CALLBACK с параметром, так что простой RET надо заменить на RET с очистой стека: RET 4.
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Это не поможет в данном случае.
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NoName

    Программа из аттача выполняется без ошибок (wxpsp2).

    Ее код несколько отличается от того что ты показал в первом сообщении.
    Код (Text):
    1. 00401000 >/$ E8 05000000 CALL Main.0040100A
    2. 00401005  \. E8 24000000 CALL <JMP.&kernel32.ExitProcess>  ; \ExitProcess
    3. 0040100A  /$ B8 1F104000 MOV EAX,Main.0040101F
    4. 0040100F  |. 6A 00       PUSH 0                            ; /pThreadId = NULL
    5. 00401011  |. 6A 20       PUSH 20                           ; |CreationFlags = NORMAL_PRIORITY_CLASS
    6. 00401013  |. 50          PUSH EAX                          ; |pThreadParm => Main.0040101F
    7. 00401014  |. 50          PUSH EAX                          ; |ThreadFunction => Main.0040101F
    8. 00401015  |. 6A 00       PUSH 0                            ; |StackSize = 0
    9. 00401017  |. 6A 00       PUSH 0                            ; |pSecurity = NULL
    10. 00401019  |. E8 0A000000 CALL <JMP.&kernel32.CreateThread> ; \CreateThread
    11. 0040101E  \. C3          RETN
    12. 0040101F   . 55          PUSH EBP
    13. 00401020   . 8BEC        MOV EBP,ESP
    14. 00401022   >-EB FE       JMP SHORT Main.00401022
    15. 00401024   . C9          LEAVE
    16. 00401025   . C2 0400     RETN 4
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    AsmGuru62

    > так что простой RET надо заменить на RET с очистой стека: RET 4



    Это сделает masm



    NoName

    Откуда ты взял NORMAL_PRIORITY_CLASS



    "The thread is created with a thread priority of THREAD_PRIORITY_NORMAL. Use the GetThreadPriority and SetThreadPriority functions to get and set the priority value of a thread."



    NORMAL_PRIORITY_CLASS - это кажется для процесса



    А вообще поставь 0 и не заморачивайся :derisive:
     
  13. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    черт, придется застрелится
     
  14. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 q_q

    "Программа из аттача выполняется без ошибок (wxpsp2). "

    Попробуй так сказать об аттаче. Это таже прога, только код теперь такой:
    Код (Text):
    1.  
    2. .code
    3. start:
    4. main proc
    5. call CONTROL1
    6. call ExitProcess
    7. main EndP
    8.  
    9. CONTROL1 proc
    10. mov eax,offset Threadproc2
    11. invoke CreateThread,0,0,eax,0,0,0
    12. ret
    13. CONTROL1 EndP
    14.  
    15. Threadproc2 proc Param:DWORD
    16. start2:
    17. push 0
    18. push 0
    19. push 0
    20. push 0
    21. call MessageBox
    22. jmp start2
    23. ret 4
    24. Threadproc2 EndP


    2 Asterix

    "А вообще поставь 0 и не заморачивайся :derisive:"

    Это ясно, но проблему не решает.



    [​IMG] 147714190__Main.exe
     
  15. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Кстати говоря, объясняю почему я писал насчет окон выше.

    Помню, не так давно писал одну сетевую программку, так в ней тоже использовал треды, но проблем никакаких совершенно в этом плане не было. К сожалению сорсы утеряны навсегда благодаря EFS. Это уже другая тема.

    Так вот, может быть в этом етсь какая та логика:

    окна - треды. Очевидно что связи не должно быть, ну а вдруг?
     
  16. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NoName

    Аттач из сообщения Янв 30, 2005 18:54:38 тоже выполняется без проблем.

    Функция потока не успевает быть вызвана.

    Добавил invoke Sleep, 10000 после CreateThread и мне удалось 29 раз успеть нажать на кнопку "Ok" в появляющемся пустом MessageBox'е с заголовком "Ошибка".
     
  17. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    NoName >




    IMHO дело не в коде, а в Olly, я с такой штукой сталкивался, как решил не помню =)



    ЗЫ: оба аттача работают.
     
  18. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 q_q

    только почему не успевает?



    2 S_T_A_S_

    Дело не в Olly, без дебагера такая прога тоже не работает, если не ставить задержку.
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NoName

    Наверное, до порожденного потока не дошла очередь получить квант времени, а "основной" успел вызвать ExitProcess, смерть процесса влечет за собой смерть всех его потоков.
     
  20. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Значит надо проверить Sleep(0).
     
Статус темы:
Закрыта.