2016-11-22 67 views
-1

我正在做一個項目,我需要完全控制過程的地址空間。我需要將線程的堆棧從當前位置移到我選擇的預定義區域,因爲我需要取消分配原始堆棧內存。我找不到如何做到這一點,只有如何處理堆棧大小,但這不是我所需要的。我有兩個想法如何做到這一點,它們都不是理想的:是否可以在Windows中決定線程的堆棧位置?

  • 將ESP和EBP設置爲我的預定義區域,並更新線程TEB中的堆棧基本和堆棧限制字段。這聽起來似乎是一個糟糕的主意,因爲很難知道是否還有其他地方需要更新,更不用說內核在內部保存有關堆棧位置的簿記信息的可能性。
  • 隨處存儲內存,基本上強制新線程的堆棧分配到我剩下的可用空間中。我知道這是一個可怕的想法。

是否有可能做到這樣的事情?它不一定是同一個線程。

編輯:任何事情只要我釋放原始堆棧並決定新/舊堆棧的新位置,就會執行任何操作。因此,複製/移動堆棧,殺死舊線程並在預定位置使用堆棧啓動新線程等應該會很好。我不需要舊的線程,我只需要一種方法來強制線程在某個位置運行(已解決),並將其堆棧放在由我決定的安全位置。所以在這種情況下,丟棄舊的堆棧數據就好了,因爲目前我不依賴它。

+0

是否允許您分配自己的內存,在那裏建立一個堆棧並使用它,而不是試圖「移動」現有的堆棧?因爲你真的不能這樣做。但是,你可以複製它。 –

+0

你想在哪一點移動線程堆棧?如果在線程開始在用戶模式下執行之前或者在線程EP開始執行之前 - 如果可能的話。但隨機的時候,線程已經執行 - 100%是不可能的。例如如何使用指向棧中變量的指針?和主要 - 什麼意義嘗試這樣做? – RbMm

+0

簡單的答案是否定的。 –

回答

0

如果你想釋放系統分配堆棧,你正在打開一罐蠕蟲。問題是你需要知道線程上方所有棧幀的結構。這些幀可以引用堆棧中的地址,因此刪除它們可能會導致各種問題。

您可以創建一個帶有1頁堆棧的線程,而不是釋放它。然後分配您自己的內存塊並將其地址移入堆棧指針寄存器。在您的頂級線程例程中。