Проблемы с созданием потоков/FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем SomeNoOp, 16 июн 2007.

  1. SomeNoOp

    SomeNoOp New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    5
    Код (Text):
    1. format PE GUI 4.0 DLL
    2.  
    3. entry DllEntryPoint
    4.  
    5. include '..\include\win32a.inc'
    6.  
    7. section '.data' data readable writeable
    8.       ThreadID            dd         ?
    9.       Info                   db         'Test', 0
    10.  
    11. section '.code' readable executable
    12.  
    13. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    14.  
    15. proc DllEntryPoint hInstDLL, fdwReason, lpvReserved
    16.      invoke CreateThread, 0, 0, [SomeProc], 0, 0, ThreadID
    17.      ret
    18. endp
    19.  
    20. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    21.  
    22. proc SomeProc
    23.      invoke MessageBox, 0, Info, 0, 0
    24.      ret
    25. endp
    26.  
    27. ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    28. section '.idata' import data readable
    29.      library  kernel32, 'KERNEL32.DLL',\
    30.               user32,   'USER32.DLL'              
    31.  
    32. include '..\include\api\kernel32.inc'
    33. include '..\include\api\user32.inc'
    34.  
    35. section '.reloc' fixups data discardable
    Функция запускается, но в основном потоке, а не в новом. Почему?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    в смысле? как ты это определил?

    п.с.: почему функцию треда ты объявил без параметра?
     
  3. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Ему просто так кажется, т.к. когда стартанул поток, главный поток завершился. Вот ему и кажется что месадж из основного т.к. остался только один поток.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    PaCHER
    или в ольке смотрел - когда основной поток стоит, а новый еще не создан
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    странно что вобще запускаецо. [SomeProc] - это не указатель на SomeProc, а значения дворда по адресу SomeProc
     
  6. SomeNoOp

    SomeNoOp New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    5
    А как тада выглядит указатель на функцию? :/
     
  7. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    SomeNoOp
    addr SomeProc
    или
    offset SomeProc
     
  8. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    или просто SomeProc - это же fasm, все-таки... :)
     
  9. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    DWORD WINAPI ThreadFunc( LPVOID );
     
  10. SomeNoOp

    SomeNoOp New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    5
    Хмм, странно. Всеравно не работает. Дело в том, что я писаол шеллэкстеншн и столкнулся с такой проблемой: пока не нажмешь на кнопку в мясо боксе, эксплорер висит. А как тока создавал поток (если я прально ща сказал) то независимо от мессаджбокса эксплорер продолжал работу. Писал я раньше на делфи, а сча вот хотел на асм попробовать переписать. Делал типо так:

    Код (Text):
    1. procedure SomeProc;
    2. const
    3.   Info = 'Some string';
    4. begin
    5.   MessageBox(0, Info, nil, 0);
    6. end;
    7.  
    8. var
    9.   ThreadID: cardinal
    10. begin
    11.   CreateThread(0, nil, @SomeProc, 0, nil, ThreadID)
    12. end.
    И мессаджбокс висел, а параллельно с ним работал эксплорер. Вот написал на фасме что-то типо этого (код там де-то сверху), но экслорер виснет. Вот я не понимая о чем говорю, употребил слова
    "функция запускается, но в основном потоке, а не в новом". Собсна о чем это я... А, делал так:
    Код (Text):
    1. invoke      CreateThread, 0, 0, SomeProc, 0, 0, ThreadID
    Всеравно не пашет...
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    тогда я подозреваю, что ты не возвращаешь в EAX единицу на выходе из основной функции библиотеки. Ф-я CreateThread созвращает тебе определенно не единицу. И это же значение ты возвращаешь, выходя из основной функции библиотеки. Пиши xor eax,eax/inc eax перед ret
     
  12. SomeNoOp

    SomeNoOp New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    5
    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         Info    db   'Test!', 0
    8.         ThreadID dd ?
    9.  
    10. section '.code' code readable executable
    11.  
    12. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    13.         invoke     CreateThread, 0, 0, SomeProc, 0, 0, ThreadID
    14.         xor        eax, eax
    15.         inc        eax
    16.         ret
    17. endp
    18.  
    19. proc SomeProc
    20.         invoke     MessageBox, 0, Info, 0, 0
    21.         ret
    22. endp
    23.  
    24. section '.idata' import data readable writeable
    25.         library kernel32,'KERNEL32.DLL',\
    26.                 user32,'USER32.DLL'
    27.  
    28. include 'api\kernel32.inc'
    29. include 'api\user32.inc'
    30.  
    31. section '.reloc' fixups data discardable
    Получаю много мессаджбоксов. Ооочень много мессаджбоксов. Они просто открываются в цикле... :/
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    DllEntryPoint вызывается не 1 раз. или заюзай мутекс или проверяй fdwReason
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    DLLMain вызывается при создании и завершении потока в процессе.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    И этот код впадает в рекурсию по идее?
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    даже круче чем рекурсия ;)
    разветвляющаеся по экспоненте рекурсия :)
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    См. #9
    /мдя, учите испанский, а точнее Си - грю же в ф-ю для потока передаётся 1 параметр./
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в данном случае это пока не играет роли, то есть не разница в прототипах производит такое действие, а по сути ты прав, нужно ret 4 делать, либо в макросе параметр добавить.
     
  19. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    да, видать ицзелиона автор не читал
     
  20. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    [Икзильен] следует произносить;)