Frage

Ich habe einen zusätzlichen Faden in einigem kleinen Test App erstellt und will den Haupt-Thread von diesem zusätzlichen Thread suspendieren. Der Zusatzfaden über CreateRemoteThread von einem externen Prozess erstellt.

Da SuspendThread eine HANDLE auf den Faden muss, die ausgesetzt werden sollte, möchte ich wissen, wie diese HANDLE läuft von Code zu bekommen in meinem zusätzlichen Faden.

War es hilfreich?

Lösung 2

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;
}

Andere Tipps

Ich glaube nicht, dass es etwas gibt, dass der Haupt-Thread von anderen Threads unterscheidet, sobald der Prozess begonnen hat. Sie können jedoch enumerate alle Threads im Prozess , und verwenden Sie GetThreadTimes den Faden mit dem finden früheste Erstellungszeit. Rufen Sie Openthread eine HANDLE von einem Thread zu bekommen ID.

Holen Sie sich die Thread-ID mit dieser Funktion:

/* CAUTION: ONLY x86 TESTED
 * get the thread id of the main thread of a target process
 *
 * params:
 *     DWORD dwPid  process id of the target process
 *
 * return:
 *     Success      thread id
 *     Error        NULL
 */
DWORD GetMainThreadId(DWORD dwPid)
{
    LPVOID lpTid;

    _asm
    {
        mov eax, fs:[18h]
        add eax, 36
        mov [lpTid], eax
    }

    HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwPid);
    if(hProcess == NULL)
        return NULL;

    DWORD dwTid;
    if(ReadProcessMemory(hProcess, lpTid, &dwTid, sizeof(dwTid), NULL) == FALSE)
    {
        CloseHandle(hProcess);
        return NULL;
    }

    CloseHandle(hProcess);

    return dwTid;
}

Einfach öffnen der Faden den Griff zu bekommen:

/*
 * get a handle to the main thread of a target process
 * if successfull, the returned handle must be closed with CloseHandle()
 *
 * params:
 *     DWORD dwPid              process id of the target process
 *     DWORD dwDesiredAccess    desired access rights to the thread
 *
 * return:
 *     Success      thread handle with desired access rights
 *     Error        NULL
 */
HANDLE GetMainThreadHandle(DWORD dwPid, DWORD dwDesiredAccess)
{
    DWORD dwTid = GetMainThreadId(dwPid);
    if(dwTid == FALSE)
        return NULL;

    return OpenThread(dwDesiredAccess, FALSE, dwTid);
}

Warum gehst du nicht einfach erstellen programmweite global (Verwendung extern wenn Sie müssen)

HANDLE mainThread ;
DWORD mainThreadId ;

In der ersten Zeile der Haupt, (bevor irgendwelche Threads erstellt werden) do

mainThread = GetCurrentThread() ;
mainThreadId = GetCurrentThreadId() ;

Sie können mit jede Form von IPC entweder die ID oder der Griff in teilen mit dem Remote-Prozess (noch nicht überprüfte die GREIFT Sharing funktioniert, aber es soll!)

Eine Reihe von nützlichen API-Funktionen dieser Art sind unter der (natürlich!) Werkzeug Hilfe Suite. Der CreateToolhelp32Snapshot() API einen Schnappschuss von die laufenden Threads für einen bestimmten Prozess.

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

Vollbeispielcode hier.

Die Struktur zurück nicht den primären Thread von den anderen unterscheiden. Ich weiß nicht, einen Mechanismus zu tun; Während einige Versionen der C-Laufzeit alle Exitprocess () am Ende des primären Thread werden, in allen neueren Versionen der Prozess, bis die letzten Thread beendet laufen weiter.

Interjay Empfehlung zur Verwendung GetThreadTimes kann die beste Wette. Wenn Sie können CreateProcess() der Zielprozess, das hThread Mitglied der PROCESS_INFORMATION Block enthält die TID für den primären Thread. Willkommen alle Ideen von anderen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top