Inter-Privilege Level Call innerhalb von Threads



  • Guten Morgen,

    ich erzeuge einen Thread per _beginthreadex. Der Thread-Routine wird die Adresse einer Klasse übergeben, die beispielsweiße folgende Member enthält:

    class Class
    {
    	int a, b;
    	double d;
    	long long l;
    };
    

    Innerhalb der Routine wird eine Methode aufgerufen, welche wiederum zwei Funktionen aus der Kernel32.dll aufruft. Es handelt sich dabei also um 2 inter-privilege level calls.
    Die beiden Funktionen benutzten intern sysenter und sysexit um von Privilege Level 3 Privilege Level 0 bzw. umgekehrt zu callen.

    Nun habe ich folgendes Phänomen:
    Beim ersten WinAPI-Call wird an der Stelle, an der die Instruktion sysenter ausgeführt wird das Member "a" meiner Klasse genullt. An der Stelle des zweien WinAPI-Call wird ebenfalls bei der gleichen Instruktion die Variable "l" genullt.

    Es ist mir absolut rätselhaft, was das Problem ist. Tiefer als ins Disassembly an die Stelle der entsprechenden Instruktion kann ich nun mal nicht einsteigen.

    Es sei folgendes erwähnt:
    Ursprünglich sah die Methode ungefähr so aus:

    void Class.Method()
    {
    	this->a = 4711;
    	this->l = 815;
    
    	WinAPIFuncA();
    	WinAPIFuncB();
    }
    

    Der weitere Programmablauf erfordert zwingend, dass die Variablen "a" und "l" den zugewiesenen Wert besitzen.
    Dieses Problem lässt sich umgehen - keinesfalls lösen - in dem man die Sequenz umdreht:

    void Class.Method()
    {
    	WinAPIFuncA();
    	WinAPIFuncB();
    
    	this->a = 4711;
    	this->l = 815;
    }
    

    Erwartungsgemäß und wenig überraschend haben die Variablen nun beim Austritt aus dieser Methode den korrekten Wert. Viel interessanter ist jedoch, dass ich dem Memory-Dump entnehmen kann, dass dieses Mal durch die WinAPI-Calls keine der beiden Speicherstellen beeinflusst wird.

    Ich habe mir Mühe gegeben dieses Problem einigermaßen nachvollziehbar zu schildern und hoffe wirklich, dass mich jemand darauf hinweisen kann, dass ich hier etwas ganz entscheidendes Übersehe.
    Ich persönlich bin mit meinem Latein beinahe am Ende. Nebenbei bemerkt leistet die Funktion natürlich ihren Dienst, wenn sie außerhalb eines Threads aufgerufen wird. Ich gehe daher davon aus, dass der IPL-Call innerhalb des Threads ausschlaggebend dafür ist.

    Vielen Dank vorab an jeden der sich die Mühe macht mir hier zu helfen.


  • Mod

    Liegt die Klasse mit demn Daten im Heap oder auf dem Stack?

    Wenn Sie auf dem Stack liegt muss gareantiert sein, dass der Thread seine Zugriffe beendet bevor diese Varaible mit den Daten aus dem Funktions Kontext verschwinden...



  • Martin Richter schrieb:

    Liegt die Klasse mit demn Daten im Heap oder auf dem Stack?

    Hallo,

    die Instanz befindet sich im Heap.

    EDIT:
    Ausführlicher: Die Instanz wird von einer std::list erstellt, welche den Standard STL-Allokator "allocator" verwendet.



  • Vielleicht eine vergessene calling convention?



  • Hi schrieb:

    Vielleicht eine vergessene calling convention?

    Leider nicht. Die Deklaration der WinAPI-Funktionen stammt aus der "Windows.h".


Anmelden zum Antworten