2016-11-22 3 views
-1

Ich mache ein Projekt, wo ich volle Kontrolle über den Adressraum des Prozesses brauche. Ich muss den Stapel des Threads von dem Ort, an dem er sich befindet, zu einem von mir gewählten vordefinierten Bereich verschieben, da ich den ursprünglichen Stapelspeicher freigeben muss. Ich konnte nichts darüber finden, wie ich das machen soll, sondern nur, wie ich mit der Stapelgröße umgehen soll, aber das ist nicht das, was ich brauche. Ich habe zwei Ideen, wie dies zu tun ist, keiner von ihnen ist ideal:Kann der Speicherort eines Threads in Windows festgelegt werden?

  • Setzen Sie ESP und EBP zu meinem vordefinierten Bereich und aktualisieren Sie die Stack-Basis und Stack-Limit-Felder in der Thread-TEB. Das klingt nach einer schlechten Idee, denn es ist schwer zu wissen, ob es noch andere Stellen gibt, die ich aktualisieren müsste, geschweige denn die Möglichkeit, dass der Kernel intern Buchhaltungsinformationen über den Standort des Stapels speichert.
  • Reservieren Sie überall den Speicher, um den Stapel eines neuen Threads zu erzwingen, der in dem Raum zugewiesen wird, den ich noch verfügbar habe. Das ist eine schreckliche Idee, ich weiß.

Ist es überhaupt möglich, so etwas zu tun? Es muss nicht derselbe Thread sein.

Bearbeiten: Alles wird so lange tun, bis ich den ursprünglichen Stapel freigeben und den neuen Speicherort des neuen/alten Stapels festlegen kann. Also das Kopieren/Verschieben des Stapels, das Töten des alten Threads und das Starten eines neuen mit einem Stack an einem vordefinierten Ort usw. sollte gut funktionieren. Ich brauche den alten Thread nicht, ich brauche nur einen Weg, um einen Thread an einer bestimmten Stelle (bereits gelöst) zu starten und seinen Stack an einem von mir bestimmten sicheren Ort zu haben. In diesem Fall ist es in Ordnung, die alten Stack-Daten zu verwerfen, da ich momentan nicht davon abhängig bin.

+0

Ist es Ihnen erlaubt, Ihren eigenen Speicher zuzuweisen, einen Stapel dort zu erstellen und ihn zu verwenden, anstatt zu versuchen, den vorhandenen Stapel zu "verschieben"? Weil du das wirklich nicht kannst .. Du könntest es aber kopieren. –

+0

an welcher Stelle möchten Sie Thread-Stack verschieben? wenn vor dem Thread beginnen im Benutzermodus ausführen oder sagen, bevor der Thread EP ausgeführt wird - denken Sie, möglich. aber zu zufälliger Zeit, wenn der Thread bereits ausgeführt wurde - 100% unmöglich. Wie wäre es zum Beispiel mit Zeigern auf Variablen im Stapel? und main - was Sinn versuchen, dies zu tun? – RbMm

+0

Einfache Antwort ist nein. –

Antwort

0

Wenn Sie den Systemzuweisungsstapel freigeben möchten, öffnen Sie eine Dose Würmer. Das Problem ist, dass Sie die Struktur aller Stapelrahmen über Ihrem Thread kennen müssen. Diese Frames könnten Adressen auf dem Stapel referenzieren, so dass sie alle möglichen Probleme verursachen könnten.

Sie könnten einen Thread mit einem 1-Seiten-Stapel erstellen und ihn nicht freigeben. Weisen Sie dann Ihren eigenen Speicherblock zu und verschieben Sie seine Adresse in das Stack-Pointer-Register. in Ihrer Top-Level-Thread-Routine.

Verwandte Themen