在Windows 7中成功执行SuspendThread后,GetThreadContext失败

Eri*_*nge 19 debugging winapi windows-7

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

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

在Windows 7和Windows 7下,即使对SuspendThread(和ResumeThread)的调用都成功,调用也会GetThreadContext失败并显示错误:

ERROR_NOACCESS
998(0x3E6)
对内存位置的无效访问.

有很高的可能性,虽然不是所有的时间.

我的意思是,对于一些分析运行,一切都会像在其他操作系统上一样工作(所有的GetThreadContext调用都会成功),但对于其他运行,它们几乎都会失败(除了数十万之外,可能会丢失十几个).它使用完全相同的二进制文件,相同的参数.

我已经尝试过关于重复GetThreadContext调用的模糊相似问题的建议,但没有更多的成功.我也试过SleepSuspendThread和之间做一个GetThreadContext,然后GetThreadContext更频繁地成功,虽然它会导致剧烈的减速.

然而,它表明Windows 7操作系统正在返回,SuspendThread而线程可能尚未暂停 - 但是,如果是这种情况,我不知道如何或是否正确等待暂停,在线程中循环并且敲击GetThreadContext没有'做到了.

编辑: 16字节对齐CONTEXT结构的地址GetThreadContext为丹巴特利特建议似乎正在做的伎俩!

Dan*_*ett 16

看一下GetThreadContext函数,它提到了这一点

CONTEXT结构具有高度的处理器特性.有关此结构的特定于处理器的定义以及任何对齐要求,请参阅WinNt.h头文件.

查看此文件,_CONTEXT声明为

typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...
Run Code Online (Sandbox Code Playgroud)

所以它可能是一个对齐问题.