Thread mit NtCreateThread() erstellen



  • Hallo,

    ich befinde mich im ring3 (usermode) eines NT Systems und möchte gerne einen Thread erstellen.
    Dazu möchte ich nicht die w32 APIs aus kernel32.dll benutzen, sondern eine native Funktion.
    Nun bin ich auf NtCreateThread gestossen, doch leider sind die nativen API Funktionen nur sehr spärlich im Internet beschrieben und so habe ich meine Probleme damit.
    Ich weiss zwar, welche Parameter die Funktion benötigt, doch weiss ich nicht wie ich diese mit sinnvollen Daten füllen kann.
    Prototyp der Funktion:

    NTSYSAPI NTSTATUS NTAPI NtCreateThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL, IN HANDLE ProcessHandle, OUT PCLIENT_ID ClientId, IN PCONTEXT ThreadContext, IN PINITIAL_TEB InitialTeb, IN BOOLEAN CreateSuspended );
    

    Kopfschmerzen bereiten mir hierbei die Parameter `InitialTeb' und `ThreadContext'.
    Hätte vielleicht jemand ein Beispielsnippet dazu oder vielleicht weitere Informationen?

    Bin für jede Hilfe dankbar.



  • Threads unter (nativ) Windows solltest du mit der C-Laufzeitfunktion
    _beginthreadex erstellen. Das ist der sicherste Weg.



  • Redhead schrieb:

    Threads unter (nativ) Windows solltest du mit der C-Laufzeitfunktion
    _beginthreadex erstellen. Das ist der sicherste Weg.

    Schwachsinn.

    icy,
    CONTEXT ist eine plattformspezifische Striktur, die alle Prozessorregister enthält



  • icy schrieb:

    ich befinde mich im ring3 (usermode) eines NT Systems und möchte gerne einen Thread erstellen.
    Dazu möchte ich nicht die w32 APIs aus kernel32.dll benutzen, sondern eine native Funktion.

    Und warum? Mit dem nächsten SP wird diese Funktion intern geändert und du fliegst auf die Nase. Microsoft hat sich schon was dabei gedacht, wenn sie Funktionen als intern kennzeichnet. Benutze also lieber den Warpper deiner Klassen Bibliothek - wie es übrigens auch von Microsoft empfohlen wird.



  • Luckie schrieb:

    Und warum? Mit dem nächsten SP wird diese Funktion intern geändert und du fliegst auf die Nase.

    Und tausend andere Stellen, die diese elementare Funktion aufrufen werden gleich mit verändert? Das glaubst du doch selber nicht.

    Luckie schrieb:

    Benutze also lieber den Warpper deiner Klassen Bibliothek

    Der Nachteil dabei ist, daß mit solchen Wrappern viele Dinge nicht möglich sind, die eine native Funktion bietet.



  • Bei NtCreateThread musst du zvor den Stack im Prozess anlegen. Diesen solltes du auch, ensprechend des Modules in dem der Stack starten soll, auf COMMIT und RESERVED setzen. Zusätzlich musst du noch die CPU-Register auf die enstprechnded Werte bzw. Standardwerte von Windows setzen. Danach verhält es sich aber genauso wie CreateThread.

    Diese Standardwerte haben sich bis jetzt zwar noch nicht verändert seit NT4, könnten sich aber auch gut in Zukunft verändern, sprich bei x86-64 Porzessoren oder eingeschaltetem Stackschutz

    Ein weiteres Problem ist du solltest CRSS.exe Prozess von Windows über den neuen Thread informieren, damit alles glatt läuft. Dies kannst du über CsrClientCallServer machen - jedoch ist davon nichts dokumentiert und weitgehend unbekannt. Da müsstes du also noch viel selbst rausfinden



  • Wrap it schrieb:

    Luckie schrieb:

    Und warum? Mit dem nächsten SP wird diese Funktion intern geändert und du fliegst auf die Nase.

    Und tausend andere Stellen, die diese elementare Funktion aufrufen werden gleich mit verändert? Das glaubst du doch selber nicht.

    Wieso denn das? Deswegen hat Microsoft ja gerade den Wrapper CreateThread eingeführt, damit sie an der internen Funktion was ändern können, ohne dass das Auswirkungen auf irgendwelche Anwendungen hat, die auch brav den Wrapper benutzen.

    Mir würde jetzt nichts einfallen was ich nicht mit CreateThread bzw. dessen Wrapper aus der Klassenbibliothek nicht machen könnte. Und das, was man nicht machen kann, sollte man besser auch nicht machen. 😉



  • Luckie schrieb:

    Und das, was man nicht machen kann, sollte man besser auch nicht machen. 😉

    Diese Einstellung haben alle dummen Leute.



  • Diese Einstellung haben Leute, die solide Software abliefern. Oder warum meinst du muss MS eine ganze Abteilung unterhalten, nur um ihr eigenes Betriebssystem zu hacken, damit Programme von anderen Firmen auf neuen Windowsversionen laufen, weil diese sich eben nicht darangehalten haben?

    Hier ist ein Artikel dazu: http://blogs.msdn.com/oldnewthing/archive/2003/12/24/45779.aspx
    aber dieser hier ist besser:
    http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx

    Deswegen sollte man so was tunlichst vermeiden.



  • CLIENT_ID schrieb:

    Luckie schrieb:

    Und das, was man nicht machen kann, sollte man besser auch nicht machen. 😉

    Diese Einstellung haben alle dummen Leute.

    Leider ist dies ein völlig unqualifizierter Kommentar. Anonym andere Leute zu beschimpfen ist sowieso nicht die feine englische Art.
    Gerne hören wir aber, warum du dieser Meinung bist.

    Gruß, Oli


Anmelden zum Antworten