gpt4 book ai didi

winapi - 在 Windows 7 中成功 SuspendThread 后 GetThreadContext 失败

转载 作者:行者123 更新时间:2023-12-03 12:54:52 27 4
gpt4 key购买 nike

我在 Windows 7 中的采样分析器上遇到了一个奇怪的问题(在以前的 Windows 操作系统上没有此类问题 AFAICT,无论是 32 位还是 64 位)。

分析器通过定期挂起线程来工作 SuspendThread ,然后使用 GetThreadContext 查看上下文, 在调用 ResumeThread 之前重新启动该过程。所有这些都是在多媒体计时器线程的上下文中完成的(为了准确,大约为 1kHZ,这在 Windows 7 之前的操作系统上通常会导致可忽略的性能损失)。

在 Windows 7 和仅 Windows 7 下,即使调用 SuspendThread (和 ResumeThread )都成功了,对 GetThreadContext 的调用失败并出现错误:

ERROR_NOACCESS
998 (0x3E6)
Invalid access to memory location.



可能性非常高,但并非总是如此。

我的意思是,对于某些分析运行,一切都会像在其他操作系统上一样工作(所有 GetThreadContext 调用都会成功),但对于其他运行,它们几乎都会失败(可能会保存十几个,在几十个中)千分之一)。它发生在完全相同的二进制文件、相同的参数上。

我已经尝试过关于看起来很相似的问题的建议,以重复 GetThreadContext调用,没有更多的成功。我也试过做 Sleep SuspendThread之间和 GetThreadContext ,然后是 GetThreadContext更频繁地成功,尽管它会导致急剧放缓。

然而,这表明 Windows 7 操作系统正在从 SuspendThread 返回。虽然线程可能还没有被挂起 - 但是,如果是这样的话,我不知道如何或是否正确等待挂起,在线程中循环并敲击 GetThreadContext不这样做。

编辑: 16 字节对齐 CONTEXT 的地址 GetThreadContext 的结构正如 Dan Bartlett 所建议的那样,似乎在做这个伎俩!

最佳答案

看着GetThreadContext功能,它提到

The CONTEXT structure is highly processor specific. Refer to the WinNt.h header file for processor-specific definitions of this structures and any alignment requirements.



查看这个文件,_CONTEXT 声明为
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...

所以有可能是对齐问题。

关于winapi - 在 Windows 7 中成功 SuspendThread 后 GetThreadContext 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4696543/

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