gpt4 book ai didi

c - Win32中如何设置线程栈的地址?

转载 作者:行者123 更新时间:2023-11-30 20:52:46 29 4
gpt4 key购买 nike

我想知道是否有办法在创建 Win32 线程时设置线程堆栈的地址。

最佳答案

有人建议使用SetThreadContext,事实证明这是设置线程堆栈地址的一种方法。对于我的处理器(它是特定于处理器的),我必须将 CONTEXT 结构的 Esp 成员设置为我想要的堆栈地址。请注意,堆栈向 0 增长,因此您需要将堆栈设置到堆栈区域的末尾。另请注意,Win32 似乎在您指定的地址之后立即修改了一些堆栈,因此您需要稍微备份该地址。

您需要获得使用SetThreadContext的权限;要启用权限,请遵循以下指南:https://learn.microsoft.com/en-us/windows/win32/secauthz/creating-a-security-descriptor-for-a-new-object-in-c-- 。基本上,您需要设置一个 SECURITY_ATTRIBUTES 结构,并将其传递给 CreateThread。对于指南设置 EXPLICIT_ACCESS 结构的部分,我使用了以下内容:

ZeroMemory(&explicit_access, sizeof(EXPLICIT_ACCESS));
explicit_access.grfAccessPermissions = THREAD_ALL_ACCESS;
explicit_access.grfAccessMode = GRANT_ACCESS;
explicit_access.grfInheritance= NO_INHERITANCE;
explicit_access.Trustee.TrusteeForm = TRUSTEE_IS_SID;
explicit_access.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
explicit_access.Trustee.ptstrName = (LPTSTR) everyone_sid;

从技术上讲,您只需要THREAD_GET_CONTEXT,但我只使用了THREAD_ALL_ACCESS

另一件事需要注意的是 SEH(结构化错误处理)似乎不再起作用。

这是不安全的,但我这样做只是为了测试通常在 MCU 上实现的模块机制。

编辑:对于 64 位,我还必须修改内部 Windows TIB ( https://en.wikipedia.org/wiki/Win32_Thread_Information_Block ),具体来说,我必须确保堆栈基数和上限正确,以便 _chkstk ( What is the purpose of the _chkstk() function? ) 不会尝试访问无效内存。请注意,TIB 中的堆栈上限是分页的当前上限,而不是堆栈的最顶部。

关于c - Win32中如何设置线程栈的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57564731/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com