проблемы с CreateThread

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

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

    q_q New Member

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

    в теории должно работать

    Ссылку пожалуйста.



    Afaik созданный поток становится в общую очередь на общих правах.
     
  2. NoName

    NoName New Member

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

    ""основной" успел вызвать ExitProcess"



    Но ведь отладчик показывает, что ошибка возникает именно в вызове CreateThread!
     
  3. q_q

    q_q New Member

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

    Я пас, т.к. у меня Olly не сообщает об ошибке.

    Попробуй пойти внутрь CreateThread.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Хорошо, если вытсавить флаг CREATE_SUSPENDED, а потом ResumeThread, то опять возникает ошибка.
     
  5. NoName

    NoName New Member

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

    q_q New Member

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

    потом ResumeThread

    А потом ExitProcess?



    Я нигде не встречал упоминания, что функция CreateThread/ResumeThread заставляет ОС бросить все дела и передать управление созданному/указанному потоку. Afaik в обоих случаях не более чем постановка в очередь.
     
  7. NoName

    NoName New Member

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

    q_q New Member

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

    Какая ОС? Наличие sp? Версия Olly?
     
  9. NoName

    NoName New Member

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


    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include kernel32.inc
    5. include user32.inc
    6. includelib user32.lib
    7. includelib kernel32.lib
    8. _Thread PROTO :DWORD
    9. .code
    10. start:
    11. main proc
    12. mov eax,offset _Thread
    13. invoke CreateThread,0,0,eax,0,0,0
    14. push 1
    15. call Sleep
    16. call ExitProcess
    17. main EndP
    18. _Thread proc Param:DWORD
    19. start2:
    20. push 0
    21. push 0
    22. push 0
    23. push 0
    24. call MessageBox
    25. jmp start2
    26. _Thread endp
    27. end start




    Причем, если будет invoke Sleep,0

    то 99% вероятности того, что тред ни один раз не выполниться. Поэтому чтобы он выполнялся подольше нужно поставить больший интервал времени и он закроется когда закончится код у основного потока, т.е. при ExitProces.
     
  10. NoName

    NoName New Member

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

    OllyDbg 1.10
     
  11. q_q

    q_q New Member

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

    До wxpsp1 + olly1.10 доберусь завтра, попробую.



    Зачем зацикленный поток?



    нужно сделать так как писал q_q

    Я предпочитаю
    Код (Text):
    1. invoke CreateThread, ...
    2. invoke WaitForSingleObject, hThread, ...
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    У меня нормально всё, например работает вот такой пример:
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. INFINITE   =   0FFFFFFFFh
    7.  
    8.  
    9. section '.code' code readable executable
    10.  
    11. align 4
    12. ThreadProc:
    13.   invoke Sleep, 1000
    14.   retn 4
    15.  
    16. align 4
    17. start:
    18.   invoke CreateThread, NULL, 0, ThreadProc, NULL, 0, ThreadID
    19.   push eax
    20.   invoke WaitForSingleObject, eax, INFINITE
    21.   call [CloseHandle]
    22.  
    23. invoke ExitProcess, 0
    24.  
    25. section '.data' data readable writeable
    26.  
    27. ThreadID  dd  ?
    28.  
    29.  
    30. section '.idata' import data readable
    31.  
    32. library kernel32,'KERNEL32.DLL'
    33. include '%fasminc%\APIA\KERNEL32.INC'
     
  13. q_q

    q_q New Member

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

    Вообще-то INFINITE не самый лучший вариант, вдруг функция потока "вечная".
     
  14. Asterix

    Asterix New Member

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

    Пример написан исключительно для теста.
     
  15. NoName

    NoName New Member

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

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Кстати тут выяснилось что если перед call ExitProcess

    в том же коде вместо Sleep выставить бесконечный цикл (так чтобы да ExitProcess не дошло) после запуска треда с конечным временем выполнения, то ошибка опять вылезает.



    Решение этой проблемы мне уже не горит, но если у кого есть склонности к таким извращениям, то могут покалупать.
     
  17. q_q

    q_q New Member

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

    вместо Sleep выставить бесконечный цикл

    Imho у тебя склонность к нездоровым вариантам. ;)



    Посмотри в диспетчере задач на загрузку и время ЦП
    Код (Text):
    1.  
    2. .386
    3. .model flat,stdcall
    4. .nolist
    5. include kernel32.inc
    6. includelib kernel32.lib
    7. .list
    8. .code
    9. l1:
    10.   xor eax,eax
    11.   jmp short l1
    12.   invoke ExitProcess, eax
    13. end l1
    Даже на маме с двумя ксеонами загруженность ЦП с 3% поднимается до 25%.



    Попробовал оба аттача на wxpsp1 с Olly и без. Ни каких ошибок или исключений.
     
  18. NoName

    NoName New Member

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


    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4. include kernel32.inc
    5. include user32.inc
    6. includelib user32.lib
    7. includelib kernel32.lib
    8. _Thread PROTO :DWORD
    9. .code
    10. start:
    11. main proc
    12. mov eax,offset _Thread
    13. invoke CreateThread,0,0,eax,0,0,0
    14. ;push 1
    15. ;call Sleep
    16. l1:
    17.   xor eax,eax
    18. jmp short l1
    19. call ExitProcess
    20. main EndP
    21. _Thread proc Param:DWORD
    22. start2:
    23. push 0
    24. push 0
    25. push 0
    26. push 0
    27. call MessageBox
    28. jmp start2
    29. _Thread endp
    30. end start




    Ошибка остается, а вариант с выходом основного потока отпадает.
     
  19. NoName

    NoName New Member

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

    Worm32 New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2005
    Сообщения:
    33
    Адрес:
    Azerbaijan
    Asterix

    Код твой скомпилил нормально, в Ольке выдает ошибку

    "unexpected event 00000002 in injected code,please reload..." И так далее.

    Дело не в том что код "не работает" а в том что Олька его неможет нормально переварить....

    А так запускаеться нормально.



    Система Win XP SP2

    Версия Ольки 1.0.10.0
     
Статус темы:
Закрыта.