Как получить hThread основного потока чужого процесса

Тема в разделе "WASM.BEGINNERS", создана пользователем _NEBO, 13 мар 2011.

  1. _NEBO

    _NEBO New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    27
    Как получить хендл основного треда чужого потока?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Видимо, имелось в виду "чужого процесса"? Например, через NtQuerySystemInformation. Хотя это немного недокументированный способ. Более документированный вариант -- CreateToolhelp32Snapshot.
     
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    открыть с помощью OpenThread по тиду-потока... тид потока можно узнать с помощью:
    (первый поток в списке будет основным)
     
  4. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    А что вообще такое - основной поток? Че-то не вкурю.
     
  5. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Ursus
    Видимо это поток, который был запущен самым первым.
     
  6. red_mould

    red_mould New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2010
    Сообщения:
    34
    Через ZwQuerySystemInformation получаешь список всех процессов, находишь нужный и из структуры SYSTEM_PROCESSES там есть такая штука как Threads. Тя интересует нулевой элемент этого массива... Ну и потом дергаешь PsLookupThreadByThreadId... И будет те счастье. А именно ETHREAD основного потока...
    Ну при запуске любой приложухи создается процесс который в себе содержит поток... Он и является основной. А из этого основного потока при помощи CreateThread и пр. ты уже создаешь другие потоки... Более детально покури Рихтера... Там все грамотно описано...
     
  7. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Нет, я вот чё хочу сказать. Если этот "первый" поток умирает, остальные ведь остаются жить, соответственно, продолжает жить и процесс. А если так, каков смысл понятия "основной поток"? Все потоки процесса совершенно равноценны, скажем, каждый может иметь очередь сообщений, окна и т.п. Т.е. практического смысла говорить, что некий поток - "основной" - нет никакого.
     
  8. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Задача сформулирована некорректно. Как известно процесс завершается лишь при завершении
    последнего его потока. Первый запущенный поток может завершиться без завершения процесса если создаст хотя бы один новый. Так что тут приходит в голову только одно решение:
    1)перехват
    BOOL
    WINAPI
    CreateProcessInternalW(HANDLE hToken,
    LPCWSTR lpApplicationName,
    LPWSTR lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL bInheritHandles,
    DWORD dwCreationFlags,
    LPVOID lpEnvironment,
    LPCWSTR lpCurrentDirectory,
    LPSTARTUPINFOW lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation,
    PHANDLE hNewToken);
    в родительском процессе.
    2)Замена параметра dwCreationFlag на CREATE_SUSPEND.
    3)Просмотр списка процессов через ZwQuerySystemInformation.
    4)Нахождение первого элемента массива Threads.
    5)Нахождение соответствующего tid по этому элементу.
    Судя по всему ТС не определился с целью. Нужен ли вам id потока,который к моменту использования уже может быть завершен? Это так ,на вскидку. Может что и рациональней
    можно придумать.Опишите задачу подробней.
    Блин,спасибо за тему. Врубился почему у меня инжект не пашет)))).
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    Ursus
    AndjellaArtavazdovna
    предлагаю вам двоим отправить гневное письмо в майкрософт... конкретно авторам отладчика Visual Studio... и потребовать у них не выделять в окне "Threads" отладчика "Main Thread" от "Worker Thread"...

    основной поток теоретически не должен завершаться до завершения всех его потомков, поскольку это может привести уничтожению всяких CRT-шных штук и тд, которые могут использоваться другими потоками... там может быть много подводных камней в принципе...
     
  10. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Rel
    На счет этого не в курсе. Можно по подробней? Основной поток как-то связан с runtime library
    и как-то ассоциирован с ф-й main()? Хотя,логично. Не подумал.
     
  11. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Это целиком проблемы CRT - при выходе из main она действительно прибивает все остальные потоки. В других языках, в принципе, то же самое.
    Однако, теоретически все потоки процесса равноправны.
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    можно рассмотреть на простом примере... допустим есть статический класс-синглтон, который каким-то образом манипулирует ресурсами, которые должны быть разделены между главным и несколькими рабочими потоками... если главный поток завершится (ретурн ноль из мейн), то в его контексте будет вызывана функция atexit (внтури CRT-точки входа), которая в свою очередь вызовет деструктор статического синглтона, после чего общие ресурсы станут недоступными...

    такова реализация... когда один поток создает другие потоки предполагается, что именно он должен их контролировать (поскольку побочные потоки сами по себе не знают друг о друге)... хотя наroвнокодить можно все, что угодно, и даже будет работать)))
     
  13. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Как - то CRT не интересовался. Не сразу сообразил. Спасибо.
     
  14. red_mould

    red_mould New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2010
    Сообщения:
    34
    Не совсем так... Если убить главный(он же первичный) поток то дуба врежет и сам процесс... А остальные потоки прибьет система... По поводу CreateProcess вот что пишут умные люди
    более подробно тутhttp://www.efes.odessa.ua/oop289.htm
    Т.е. сам по себе процесс это просто совокупность потоков. Один основной, а остальные (если есть такая необходимость) поражденные...

    Ну и вот что пишет старик Рихтер на тему завершения процесса
    более подробно тут http://wm-help.net/books-online/book/59464/59464-23.html
     
  15. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Нифига. Лень было, но я все же проверил. В аттаче есть простейшее Win приложение, которое создает вторичный поток в WinMain, после чего первичный поток выходит. Можно запустить прогу в отладчике, либо смотреть ProcessExplorer-ом, но в любом случае видно, что вторичный поток работает без первичного.
    Да, для этого мне пришлось отключить CRT и поставить точкой входа кастомную WinMain.

    CreateProcess тут не в тему.

    Он, очевидно, подразумевал, что нормальные люди всегда используют ту или иную реализацию CRT (или ее аналог в других ЯП). Она действительно прибивает процесс, когда главный поток выходит из main(). Исходники CRT любимого компилятора посмотрите сами.
     
  16. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Блин, то ли аттачи не пашут, то ли я на лыжах.
    Короче, положу сюда.


    Код (Text):
    1. DWORD WINAPI ThreadProc(LPVOID)
    2. {
    3.  
    4.     ::OutputDebugStringW(L"Thread started\n");
    5.  
    6.     int i = 0;
    7.     while (i < 10) {
    8.         ::Sleep(1000);
    9.         ::OutputDebugStringW(L"Thread running...\n");
    10.         i++;
    11.     }
    12.  
    13.     ::OutputDebugStringW(L"Thread finished\n");
    14.     return 0;
    15. }
    16.  
    17.  
    18. extern "C" int APIENTRY NoCrtWinMain(HINSTANCE hInstance,
    19.                      HINSTANCE hPrevInstance,
    20.                      LPTSTR    lpCmdLine,
    21.                      int       nCmdShow)
    22. {
    23.        
    24.     ::OutputDebugStringW(L"WinMain started\n");
    25.  
    26.     DWORD tid;
    27.     HANDLE hThread = ::CreateThread(0, 0, ThreadProc, 0, 0, &tid);
    28.  
    29.     ::OutputDebugStringW(L"WinMain finished\n");
    30.     return 0;
    31. }
    На выходе получаем

    Код (Text):
    1. WinMain started
    2. WinMain finished
    3. The thread 'Win32 Thread' (0x200) has exited with code 0 (0x0).
    4. Thread started
    5. Thread running...
    6. Thread running...
    7. Thread running...
    8. Thread running...
    9. Thread running...
    10. Thread running...
    11. Thread running...
    12. Thread running...
    13. Thread running...
    14. Thread running...
    15. Thread finished
    16. The program '[0x874] Yuv.exe: Native' has exited with code 0 (0x0).
     
  17. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    в большинстве реализаций CRT, фактически во всех, что я видел просто-напросто происходит вызов ExitProcess в самом конце CRT-точки входа... это как бы стандарт уже)) Рихтер, CreateProcess тут не при чем... можно написать свою собственную CRT и использовать ее...и еще есть кстати всякие beginthread/endthread, которые производят какие-то CRT-инициализации, я помню Рихтер о них же писал, мол что нужно их использовать вместо WinAPI-функций))