2016-11-22 70 views
-1

我正在做一个项目,我需要完全控制过程的地址空间。我需要将线程的堆栈从当前位置移到我选择的预定义区域,因为我需要取消分配原始堆栈内存。我找不到如何做到这一点,只有如何处理堆栈大小,但这不是我所需要的。我有两个想法如何做到这一点,它们都不是理想的:是否可以在Windows中决定线程的堆栈位置?

  • 将ESP和EBP设置为我的预定义区域,并更新线程TEB中的堆栈基本和堆栈限制字段。这听起来似乎是一个糟糕的主意,因为很难知道是否还有其他地方需要更新,更不用说内核在内部保存有关堆栈位置的簿记信息的可能性。
  • 随处存储内存,基本上强制新线程的堆栈分配到我剩下的可用空间中。我知道这是一个可怕的想法。

是否有可能做到这样的事情?它不一定是同一个线程。

编辑:任何事情只要我释放原始堆栈并决定新/旧堆栈的新位置,就会执行任何操作。因此,复制/移动堆栈,杀死旧线程并在预定位置使用堆栈启动新线程等应该会很好。我不需要旧的线程,我只需要一种方法来强制线程在某个位置运行(已解决),并将其堆栈放在由我决定的安全位置。所以在这种情况下,丢弃旧的堆栈数据就好了,因为目前我不依赖它。

+0

是否允许您分配自己的内存,在那里建立一个堆栈并使用它,而不是试图“移动”现有的堆栈?因为你真的不能这样做。但是,你可以复制它。 –

+0

你想在哪一点移动线程堆栈?如果在线程开始在用户模式下执行之前或者在线程EP开始执行之前 - 如果可能的话。但随机的时候,线程已经执行 - 100%是不可能的。例如如何使用指向栈中变量的指针?和主要 - 什么意义尝试这样做? – RbMm

+0

简单的答案是否定的。 –

回答

0

如果你想释放系统分配堆栈,你正在打开一罐蠕虫。问题是你需要知道线程上方所有栈帧的结构。这些帧可以引用堆栈中的地址,因此删除它们可能会导致各种问题。

您可以创建一个带有1页堆栈的线程,而不是释放它。然后分配您自己的内存块并将其地址移入堆栈指针寄存器。在您的顶级线程例程中。