Потоки, вопрос

Тема в разделе "WASM.WIN32", создана пользователем bin1101d, 31 мар 2021.

  1. bin1101d

    bin1101d New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2021
    Сообщения:
    2
    Код следующий, пример работы потоков с соседнего форума:
    Код (ASM):
    1. format PE console
    2. include 'win32ax.inc'
    3. .data
    4. fName   db  'backup.txt',0
    5. capt    db   'Type text for save to file',13,10
    6.         db   '--------------------------',13,10,0
    7. cLen    dd   $ - capt
    8. final   db   '--------------------------',13,10
    9.         db   'Save to backup.txt - OK!  ',0
    10. fLen    dd   $ - final
    11. buff    db   512 dup(0)    ; буфер для ввода
    12. rSize   dd   0             ; реальная длина ввода.
    13. tHndl   dd   0             ; хэндлы: - потока  Thread
    14. fHndl   dd   0             ;         - файла   File
    15. eHndl   dd   0             ;         - события Event
    16. ;-------
    17. .code
    18. start:
    19. ;// Создаём событие и доп.поток
    20.         invoke   CreateEvent,0,0,0,0
    21.         mov      [eHndl],eax
    22.         invoke   CreateThread,0,0,threadFunc,0,0,0
    23.         mov      [tHndl],eax
    24.  
    25. ;// Выводим заголовок программы в консоль
    26. ;// и принимаем от юзера ввод
    27.         invoke   WriteConsoleA,7,capt,[cLen],0,0
    28.         invoke   ReadConsoleA,3,buff,512,rSize,0
    29.  
    30. ;// Включаем объект события для доп.потока
    31.         invoke   SetEvent,[eHndl]
    32.  
    33. ;// Выводим финальную мессагу в основном потоке
    34.         invoke   WriteConsoleA,7,final,[fLen],0,0
    35.         invoke   ExitProcess,0
    36.  
    37. ;//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    38. ;//--- Функция дополнительного потока ----
    39. proc    threadFunc
    40.         invoke   WaitForSingleObject,[eHndl],-1   ; ждём события..
    41.         invoke  _lcreat,fName,0                   ; создать файл R/W
    42.         invoke  _lwrite,eax,buff,[rSize]          ; запись в него из буфера!
    43.         invoke  _lclose,[fHndl]                   ; закрыть файл
    44.         invoke   ExitThread,0                     ;   ..и выгрузить поток.
    45.         ret
    46. endp
    47. .end start
    Вопрос: Понадобились потоки, компилю пример.

    При открытии на доли секунды вылетает консоль, отддебажил просмотрел Олей, при дебаге висит консоль, но не выводит инфу и не забирает, пустой висит, в Оле код отрабатывает правильно, ложит в стек параметры, исполняет функции, не выдает ошибок, код пересмотрел раз 10, всё ровно.
    машина win10 x32

    Посоветуете, куда смотреть?
     
    Последнее редактирование модератором: 31 мар 2021
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    У тебя invoke ExitProcess,0 срабатывает раньше чем в потоке код. Нужно ожидать пока поток завершится а потом уже завершать процесс.
     
    M0rg0t нравится это.
  3. bin1101d

    bin1101d New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2021
    Сообщения:
    2
    Подправил. Спасибо :)

    Код (ASM):
    1. format   PE console
    2.  
    3. include  'win32ax.inc'
    4. ;---------
    5. .data
    6. fName    db  'backup.txt',0
    7. capt     db  'Input txt to save in backup.txt:',0
    8. cLen     dd  $ - capt
    9. final    db  'Save to backup.txt - OK!. Press any key...',0
    10. fLen     dd  $ - final
    11. buff     db  512 dup(0)
    12. rSize    dd  0
    13. tHndl    dd  0
    14. fHndl    dd  0
    15. eHndl    dd  0
    16. ;---------
    17. .code
    18. start:
    19.          invoke         CreateEvent,0,0,0,0
    20.          mov            [eHndl],eax
    21.          invoke         CreateThread,0,0,threadFunc,0,0,0
    22.          mov            [tHndl],eax
    23.  
    24.          invoke         WriteConsole,<invoke GetStdHandle,STD_OUTPUT_HANDLE>,capt,[cLen],0,0     ;через GetStdHandle беру хендл на ввод-вывод
    25.          invoke         ReadConsole,<invoke GetStdHandle,STD_INPUT_HANDLE>,buff,512,rSize        ;win10x32 не работают 7,3
    26.          invoke         SetEvent,[eHndl]
    27.          invoke         WaitForSingleObject,[tHndl],-1                                           ;ждем пока отработает тред
    28.          invoke         WriteConsole,<invoke GetStdHandle,STD_OUTPUT_HANDLE>,final,[fLen],0,0
    29.          invoke         ReadConsoleInput,<invoke GetStdHandle,STD_INPUT_HANDLE>,buff,1,rSize     ;ждём нажатия любой клавиши
    30.          invoke         ExitProcess,0
    31. proc     threadFunc
    32.          invoke         WaitForSingleObject,[eHndl],-1
    33.          invoke         _lcreat,fName,0
    34.          invoke         _lwrite,eax,buff,[rSize]
    35.          invoke         _lclose,[fHndl]
    36.          invoke         ExitThread,0
    37.          ret
    38. endp
    39. ;---------
    40. .end start
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    bin1101d,

    Нужно знать механизмы синхронизаций, их очень много, но базовые не менялись. Все изменения по синхрону реализованы не в виде ядерных сервисов, как пример - rwl блокировки, это юзер алгоритмическая реализация. Базовых(сервисных) не много может десяток, эвенты семафоры и тп. В ядре иначе, там защита от race cond. etc.

    Обзор этого можно посмотреть у Неббета. Если читать Рихтера, то ты заблудишься.

    ps эвент это самый примитивный синхромеханизм, есть двойной. Спецификация по базовому синхрону.
     

    Вложения:

    • NativeAPI.pdf
      Размер файла:
      2 МБ
      Просмотров:
      744
    • sem.pdf
      Размер файла:
      127,9 КБ
      Просмотров:
      278
    Последнее редактирование: 3 апр 2021
    RETN нравится это.
  5. RETN

    RETN Member

    Публикаций:
    4
    Регистрация:
    4 апр 2020
    Сообщения:
    74
    Indy_, Хоть это и не в тему и не к месту, (причем тут натив в данной теме). Попробую добавить свою лепту (свой файл) с рабочего стола :)
    Удобней нативные функи искать в структурированном "chm" (для чего для новых виндов надо ставить пакет обновления), чем в "pdf".
     

    Вложения:

    • ntundoc.7z
      Размер файла:
      192,4 КБ
      Просмотров:
      213
    Последнее редактирование: 3 апр 2021
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    RETN,

    Удобно в сурках и манах. Просто нужно в начале сориентироваться. Откуда брать инфу, источник должен быть чётким понятным.
     
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Indy_, RETN,
    расскажите же, как создать поток средствами чисто Native API и зачем. Или все таки нужно юзать винапи?

    Вот ваш пост за 11 год:
     
    Indy_ нравится это.
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    M0rg0t,

    Если создать ядерный обьект, поток например то он будет не полноценный - нужна юзер обёртка". Поэтому нет никакого смысла из юзер использовать ядерные вызовы.
     
  9. RETN

    RETN Member

    Публикаций:
    4
    Регистрация:
    4 апр 2020
    Сообщения:
    74
    M0rg0t,
    тут обсуждалось уже
    https://wasm.in/threads/rtlcreateuserthread-vs-createremotethread.29253/
    Меня больше взволновало , что у я же 2ч потратил сегодня
    на долбаный GetOpenFileName , пока не врубил во флагах PE хидера для Wow64(кто не знает х86 процесс на х64 кодесе)
     
    Последнее редактирование модератором: 6 апр 2021
    M0rg0t нравится это.