Wie bekommst man die Main Thread ID?



  • Hi

    ich wollte eigentlich nur Fragen wie ich aus einem "Child Thread" an die Main Thread ID komme?
    Klar es würde die Funktion "GetThreadId(Thread Handle)" geben aber wie komm ich dann an den Handle?

    MFG PinguGroup



  • Redest du über deine eigenen Threads? Dann übergib das Handle doch an den Child Thread.



  • _matze schrieb:

    Redest du über deine eigenen Threads?

    Ja im prinzip schon.

    Ich machen einen neuen Thread per CreateRemoteThread() in einen Process, lade eine DLL und in der MainDll Funktion möchte ich einen Hook setzten.
    Wenn ich jetzt aber ja z.B. für den letzten Parameter von SetWindowsHookEx() GetCurrentThreadID verwende klappt ja z.B. der Keyboard Hook ned.
    Deswegen such ich eine möglichkeit die "Main Thread ID" herauszufinden.

    MFG PinguGroup



  • Kleiner Nachtrag noch:

    Ich hätte zwar eine Lösung die aber nicht sehr elegant ist:

    -Mit CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); einen Snapshot erstellen
    -dann mit Thread32First(..) ersten thread und mit Thread32Next alle threads durch gehen den Member: th32OwnerProcessID mit GetCurrentProcessID vergleichen und wenn die gleich ist halt den Hook auf die Thread ID setzten.
    Dann müsste ja der main Thread auch dabei gewesen sein!?

    Ist aber wie gesagt nicht wirklich elegant und ich denk des müsste doch noch einfacher gehen!?

    MFG PinguGroup



  • Es gibt keine MainThreadId...



  • PinguGroup schrieb:

    Kleiner Nachtrag noch:

    Ich hätte zwar eine Lösung die aber nicht sehr elegant ist:

    -Mit CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); einen Snapshot erstellen
    -dann mit Thread32First(..) ersten thread und mit Thread32Next alle threads durch gehen den Member: th32OwnerProcessID mit GetCurrentProcessID vergleichen und wenn die gleich ist halt den Hook auf die Thread ID setzten.
    Dann müsste ja der main Thread auch dabei gewesen sein!?

    Ist aber wie gesagt nicht wirklich elegant und ich denk des müsste doch noch einfacher gehen!?

    MFG PinguGroup

    Dürfte wohl die einzige Möglichkeit sein. Wenn die Threadliste nicht durchgewürfelt ist, dann müsste die erste gefundene Thread-ID auch die gesuchte sein, da ja der Thread des Prozesses der erste erstellte Thread ist.



  • Guten morgen erst mal,

    Jochen Kalmbach schrieb:

    Es gibt keine MainThreadId...

    Hmmm... ja ok wie soll ich dann die ID des "primären Thread-Objekt" (Quelle: http://derentwickler.de/itr/online_artikel/psecom,id,434,nodeid,56.html) nennen?

    Naja dan probier ich das andere mal aus.
    Falls wer noch ein andere Lösung parat hätte, sagt einfach bescheid 😉

    Schönene Tag noch PinguGroup


  • Mod

    Es gibt keine "primären Thread". Es gibt einen Thread der beim Prozesstart zuerst mit gestartet wird. Dieser darf aber gerne terminieren. Der Prozess selbst terminiert erst, wenn der letzte Thread beendet ist, oder eine entsprechende Funktion (ExitProcess) aufgerufen wird.

    Man kann also nichts "ermitteln" was es nicht gibt. Was eine Software in einem Thread tut bleibt ihr selbst überlassen.



  • Ja tut mir leid hab mich nur auf das gestützt was in dem vorherigen Link stand:

    Nachdem ein Prozess vom Kernel generiert worden ist, wird er mit einem primären Thread-Objekt ausgestattet.

    Das hab ich gemeint. Ist aber jetzt ja auch egal.

    Nun hab ich ein weiteres Problem:
    Ich hab jetzt ne DLL wenn die geladen wird soll ein Keyboardhook installiert werden.
    Funktioniert auch soweit einwandfrei wenn das laden der DLL in der main Funktion geschiet:

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        HANDLE hEditBox;
        HINSTANCE hDLL;
    
        switch(message)
        {
            case WM_CREATE:
            {
                //_beginthread(thread, 0, NULL);
    
                hDLL = LoadLibrary("C:\\inject.dll");
    
                return 0;
    
            }
            case WM_DESTROY:
            {
    /*
                if(hHook != 0)
                    UnhookWindowsHookEx(hHook);
                if(hFile != INVALID_HANDLE_VALUE)
                    CloseHandle(hFile);
    */
    
                if(hDLL != NULL)
                    FreeLibrary(hDLL);
    
                PostQuitMessage(0);
                return 0;
            }
        }
    
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    void __cdecl thread(void *pVoid)
    {
        hDLL = LoadLibrary("c:\\inject.dll");
    
    }
    

    Gut wenn ich jetzt aber mit _beginThread ein Thread starte und der dan die Library läd kommt auch das alles OK sei und der Hook installiert wurde aber aber die HookProc wird nicht aufgerufen.

    Warum kann ich aus nen Thread auf einen anderen Thread des selbene Processes keinen Hook installieren?

    Mfg PinguGroup

    PS: wenn ich den Code der DLL noch posten soll sagt bescheid!


Anmelden zum Antworten