Какая функция просто убивает поток, но не процесс?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 11 апр 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Подскажите, ребята, а?
    У меня на вооружении несколько функций, но я в каждой сомневаюсь.

    ExitThread
    Если поток является последним потоком в процессе, когда эта функция вызвана, процесс потока также завершает работу.
    Это мне не подходит. Мне нужно поток завершить, а процесс нет. После я возобновлю поток с того места, где он убился функцией CreateRemoteThread (из другого приложения)

    SuspendThread
    Это?
    Но вот здесь здесь написано, что
    "Для каждой задачи операционная система хранит счетчик приостановок, который увеличивается при каждом вызове фукнции SuspendThread XE "SuspendThread" . Если значение этого счетчика больше нуля, задача приостанавливается."
    Честно говоря, мне не очено нравится, что какой-то счётчик будет у меня работать. Да он мне без надобности. Тем более, что я собираюсь приостанавливать поток не раз и не два. Неизвестно, как этот счётчик себя поведёт.

    TerminateThread
    Это?
    Может, эта функция, я не знаю. Но её никто не рекомендует и вообще она опасная, говорят. Честное слово, страшилка какая-то.

    В общем, надо остановить поток и всё на этом. Спасибо.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    "убивать" последний поток естесно незя, ина автоматически завершиться процесс. Можно приостановить SuspendThread, а потом возабновить ResumeThread, тк ты хочешь из другова процеса то просто вызывай CreateRemoteThread с адрессом ResumeThread и передавай (HANDLE hThread) как параметр. ВОт и все.
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Спасибо
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    NtTerminateThread.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Ребята, что-то я ничего не могу понять. Можно поступенчато?
    Вот этот код приостановления потока правильный? (У меня всё компилируется и никаких ошибок не выдаётся при компиляции, но и не работает, как надо)

    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. int main () {
    4.  MessageBoxA (0, "1111111\n", "111111\n", 0);
    5.  
    6.  /*Вот я приостанавливаю поток, параметр передаю в эту функцию- пвсевдодескриптор текущего потока.
    7. */
    8.  SuspendThread (GetCurrentThread ());
    9.  
    10.  MessageBoxA (0, "22222222\n", "2222222\n", 0);
    11.  return 0;
    12. };
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. GetCurrentThread ()
    Вот оно.. Константу не дано заюзать...
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Какую константу?
    Этот-то код меньше всего вызывает у меня сомнений.
    Первая функция MessageBoxA выполняется, вторая нет. Процесс убиваю через диспетчер процессов

    GetCurrentThread () возвращает псевдодескриптор процесса и тут же он передаётся параметром в SuspendThread
    Что не так-то?
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Поток засуспенжен, как он выведет тебе второй MessageBox?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    amvoz
    Какой есчо дескриптор ??
    Она -2 возвращает :lol:
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Так это я понимаю.
    То есть всё верно в этом коде?
    Если всё верно, я хотел бы показать код, (короткий, который с помощью CreateRemoteThread и должен запускать (но не запускает) вторую МessageBoxA)

    Вот этот код. В нём я для краткости не стал писать, как я нахожу хэндл процесса, в котором необходимо создать удалённый поток

    Код (Text):
    1. #include <windows.h>
    2. #include <tlhelp32.h>
    3. int main () {
    4.  
    5.  //Это хэндл процесса
    6.  HANDLE hProcess;
    7.  
    8.  CreateRemoteThread (hProcess, 0, 0, (unsigned long (__stdcall *)(void *))0x4012f8, 0, 0, 0);
    9.  return 0;
    10. }
    И опять всё компилируется, но отдалённый поток не создаётся., вторая MessagBoxA не срабатывает.
    Адрес 0x4012f8 ключевой. Это адрес возврата из функции SuspendThread. Посмотрел в OllyDbg.
    Поток должен создаться то есть в секции кода, попросту продолжится.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не понятно ничего. Адрес возврата из SuspendThread() это обычно возврат из стуба KiFastSystemCallRet. Зачем это делать ?
    Вообще о чём топик ?
     
  12. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    Тьфу ты елы палы... у меня во втором сообщении опечатка надо передавать адресс ResumeThread, и ей параметром передавать хендел потока.
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Clerk
    Хочет оставновить последний поток в приложении, потом его запустить из другого приложения. Лучше мне бы с хуками помогали. amvoz почитай рихтора, мб станет ясней что да как делать! А вообще надо было чтото вроде
    CreateRemoteThread (hProcess, 0, 0, GetProcAddress(hmodul,"ResumeThread"), hThread, 0, 0);
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Топик о том, почему не создаётся удалённый поток с помощью функции CreateRemoteThread.
    Может быть, адрес возврата из SuspendThread() и есть возврат из стуба там какого-то, но В моём данном случае он 0x4012f8
    Именно это адрес я передаю в качестве пятого параметра функции CreateRemoteThread. Если у вас есть отладчик OllyDbg Вы можете открыть этот код (первый, не второй) в этом отладчике и убедиться, что адрес 0x4012f8 правильный.
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Э, нет
    Если про функцию ExitThread сказано, что
    Если поток является последним потоком в процессе, когда эта функция вызвана, процесс потока также завершает работу.
    То я оборатил на это внимание

    А вот про функцию SuspendThread такого не сказано, что дабы процесс не умер, приостанавливаемый поток не должен быть последним.
    А фантазировать я не могу.
     
  16. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    Это h HANDEL Thread потока, скачай уже себе MSDN. И не пишите больше бреда, а почитайте про CreateRemoteThread, и хочу заметить что я передаю hThread НЕ ЧЕТВЕРТЫМ параметром, а третим адресс апи функции ResumeThread


    PS исправленно для людей не умеющих считать до 5. (в тмч и для меня)
     
  18. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    А что, из того, что маловероятно, что я знаю английский язык, значит, что я заведомо неправ?
    Я тоже не с потолка это всё беру
    Вот, пожалуйста
    Функция CreateRemoteThread
    Читаем.
    Первый параметр- хэндл процесса
    Четвёртый функция потока. А чуть пониже "начальный адрес потока в удаленном процессе"
    А у меня четвёртым параметром сразу адрес.
    Что не так? Всё так.
    И хэндлом потока там и не пахнет, между прочим.
    Хэндл процесса естьт, функция потока есть, аргументы потока есть.
    Хэндла потока нет.Это пятый параметр в Вашем варианте
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    SPA

    Я тоже, если Вы не заметили.
    А третьим параметром Вы ноль передаёте. Или опять опечатываемся? Хватит уже, а? Вы опечатываетесь, а я понять ничего не могу.

     
  20. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    ПОсмотрите КОД ВНИМАТЕЛЬНО у меня адресс GetProcAddress(hmodul,"ResumeThread"), вы вообще эту строчку отказываетесь читать? hThread ЭТО ПАРАМЕТР ДЛЯ ResumeThread. Те в итоге получаем ResumeThread(hThread); короче идити-ка вы ... да сами разбирайтесь.