Получение дескриптора к основному потоку процесса

Я создал дополнительный поток в некотором маленьком приложении тестирования и хочу приостановить основной поток от этого дополнительного потока. Дополнительный поток создается через CreateRemoteThread от внешнего процесса.

С тех пор SuspendThread потребности a HANDLE к потоку, который должен быть приостановлен, я хочу знать, как получить это HANDLE из кода, работающего в моем дополнительном потоке.

14
задан Etan 5 April 2012 в 09:25
поделиться

3 ответа

DWORD GetMainThreadId () {
    const std::tr1::shared_ptr<void> hThreadSnapshot(
        CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0), CloseHandle);
    if (hThreadSnapshot.get() == INVALID_HANDLE_VALUE) {
        throw std::runtime_error("GetMainThreadId failed");
    }
    THREADENTRY32 tEntry;
    tEntry.dwSize = sizeof(THREADENTRY32);
    DWORD result = 0;
    DWORD currentPID = GetCurrentProcessId();
    for (BOOL success = Thread32First(hThreadSnapshot.get(), &tEntry);
        !result && success && GetLastError() != ERROR_NO_MORE_FILES;
        success = Thread32Next(hThreadSnapshot.get(), &tEntry))
    {
        if (tEntry.th32OwnerProcessID == currentPID) {
            result = tEntry.th32ThreadID;
        }
    }
    return result;
}
7
ответ дан 1 December 2019 в 07:39
поделиться

Не думаю, что есть что-то, что отличало бы главный поток от других после запуска процесса. Однако можно перечислить все потоки в процессе , а с помощью GetThreadTimes найти поток с самым ранним временем создания. Вызовите OpenThread, чтобы получить HANDLE из идентификатора потока.

.
16
ответ дан 1 December 2019 в 07:39
поделиться

Ряд полезных API-функций этого типа находится под (конечно!) Справка по инструментам . API CreateToolhelp32Snapshot() API сделает снимки выполняющихся потоков для указанного процесса.

// Take a snapshot of all running threads  
hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
if( hThreadSnap == INVALID_HANDLE_VALUE ) 
  return( FALSE );

Полный код примера здесь.

Возвращаемая структура не отличает первичный поток от остальных. Механизм этого не известен; в то время как в некоторых версиях исполнения С в конце основного потока будет выполняться ExitProcess(), во всех последних версиях процесс продолжается до выхода последнего потока.

Лучшим вариантом может быть рекомендация Interjay по использованию GetThreadTimes. Если можно CreateProcess() целевой процесс, то член hThread блока PROCESS_INFORMATION содержит tid для основного потока. Приветствуйте любые идеи от других.

2
ответ дан 1 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: