Видимо, имелось в виду "чужого процесса"? Например, через NtQuerySystemInformation. Хотя это немного недокументированный способ. Более документированный вариант -- CreateToolhelp32Snapshot.
открыть с помощью OpenThread по тиду-потока... тид потока можно узнать с помощью: (первый поток в списке будет основным)
Через ZwQuerySystemInformation получаешь список всех процессов, находишь нужный и из структуры SYSTEM_PROCESSES там есть такая штука как Threads. Тя интересует нулевой элемент этого массива... Ну и потом дергаешь PsLookupThreadByThreadId... И будет те счастье. А именно ETHREAD основного потока... Ну при запуске любой приложухи создается процесс который в себе содержит поток... Он и является основной. А из этого основного потока при помощи CreateThread и пр. ты уже создаешь другие потоки... Более детально покури Рихтера... Там все грамотно описано...
Нет, я вот чё хочу сказать. Если этот "первый" поток умирает, остальные ведь остаются жить, соответственно, продолжает жить и процесс. А если так, каков смысл понятия "основной поток"? Все потоки процесса совершенно равноценны, скажем, каждый может иметь очередь сообщений, окна и т.п. Т.е. практического смысла говорить, что некий поток - "основной" - нет никакого.
Задача сформулирована некорректно. Как известно процесс завершается лишь при завершении последнего его потока. Первый запущенный поток может завершиться без завершения процесса если создаст хотя бы один новый. Так что тут приходит в голову только одно решение: 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 потока,который к моменту использования уже может быть завершен? Это так ,на вскидку. Может что и рациональней можно придумать.Опишите задачу подробней. Блин,спасибо за тему. Врубился почему у меня инжект не пашет)))).
Ursus AndjellaArtavazdovna предлагаю вам двоим отправить гневное письмо в майкрософт... конкретно авторам отладчика Visual Studio... и потребовать у них не выделять в окне "Threads" отладчика "Main Thread" от "Worker Thread"... основной поток теоретически не должен завершаться до завершения всех его потомков, поскольку это может привести уничтожению всяких CRT-шных штук и тд, которые могут использоваться другими потоками... там может быть много подводных камней в принципе...
Rel На счет этого не в курсе. Можно по подробней? Основной поток как-то связан с runtime library и как-то ассоциирован с ф-й main()? Хотя,логично. Не подумал.
Это целиком проблемы CRT - при выходе из main она действительно прибивает все остальные потоки. В других языках, в принципе, то же самое. Однако, теоретически все потоки процесса равноправны.
можно рассмотреть на простом примере... допустим есть статический класс-синглтон, который каким-то образом манипулирует ресурсами, которые должны быть разделены между главным и несколькими рабочими потоками... если главный поток завершится (ретурн ноль из мейн), то в его контексте будет вызывана функция atexit (внтури CRT-точки входа), которая в свою очередь вызовет деструктор статического синглтона, после чего общие ресурсы станут недоступными... такова реализация... когда один поток создает другие потоки предполагается, что именно он должен их контролировать (поскольку побочные потоки сами по себе не знают друг о друге)... хотя наroвнокодить можно все, что угодно, и даже будет работать)))
Не совсем так... Если убить главный(он же первичный) поток то дуба врежет и сам процесс... А остальные потоки прибьет система... По поводу CreateProcess вот что пишут умные люди более подробно тутhttp://www.efes.odessa.ua/oop289.htm Т.е. сам по себе процесс это просто совокупность потоков. Один основной, а остальные (если есть такая необходимость) поражденные... Ну и вот что пишет старик Рихтер на тему завершения процесса более подробно тут http://wm-help.net/books-online/book/59464/59464-23.html
Нифига. Лень было, но я все же проверил. В аттаче есть простейшее Win приложение, которое создает вторичный поток в WinMain, после чего первичный поток выходит. Можно запустить прогу в отладчике, либо смотреть ProcessExplorer-ом, но в любом случае видно, что вторичный поток работает без первичного. Да, для этого мне пришлось отключить CRT и поставить точкой входа кастомную WinMain. CreateProcess тут не в тему. Он, очевидно, подразумевал, что нормальные люди всегда используют ту или иную реализацию CRT (или ее аналог в других ЯП). Она действительно прибивает процесс, когда главный поток выходит из main(). Исходники CRT любимого компилятора посмотрите сами.
Блин, то ли аттачи не пашут, то ли я на лыжах. Короче, положу сюда. Код (Text): DWORD WINAPI ThreadProc(LPVOID) { ::OutputDebugStringW(L"Thread started\n"); int i = 0; while (i < 10) { ::Sleep(1000); ::OutputDebugStringW(L"Thread running...\n"); i++; } ::OutputDebugStringW(L"Thread finished\n"); return 0; } extern "C" int APIENTRY NoCrtWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { ::OutputDebugStringW(L"WinMain started\n"); DWORD tid; HANDLE hThread = ::CreateThread(0, 0, ThreadProc, 0, 0, &tid); ::OutputDebugStringW(L"WinMain finished\n"); return 0; } На выходе получаем Код (Text): WinMain started WinMain finished The thread 'Win32 Thread' (0x200) has exited with code 0 (0x0). Thread started Thread running... Thread running... Thread running... Thread running... Thread running... Thread running... Thread running... Thread running... Thread running... Thread running... Thread finished The program '[0x874] Yuv.exe: Native' has exited with code 0 (0x0).
в большинстве реализаций CRT, фактически во всех, что я видел просто-напросто происходит вызов ExitProcess в самом конце CRT-точки входа... это как бы стандарт уже)) Рихтер, CreateProcess тут не при чем... можно написать свою собственную CRT и использовать ее...и еще есть кстати всякие beginthread/endthread, которые производят какие-то CRT-инициализации, я помню Рихтер о них же писал, мол что нужно их использовать вместо WinAPI-функций))