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

Winapi 在Windows 7中成功执行SuspendThread后GetThreadContext失败,winapi,windows-7,debugging,Winapi,Windows 7,Debugging,我在Windows7中的采样分析器上遇到了一个奇怪的问题(在以前的Windows操作系统上,无论是32位还是64位,都没有这样的问题) 探查器的工作原理是,在调用以重新启动进程之前,使用定期挂起线程,然后使用查看上下文。所有这些都是在多媒体定时器线程的上下文中完成的(为了准确起见,在1kHZ左右,在Windows7之前的操作系统上,这通常会导致微不足道的性能损失) 在Windows 7和仅Windows 7下,即使对SuspendThread(和ResumeThread)的调用都成功,对GetT

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

探查器的工作原理是,在调用以重新启动进程之前,使用定期挂起线程,然后使用查看上下文。所有这些都是在多媒体定时器线程的上下文中完成的(为了准确起见,在1kHZ左右,在Windows7之前的操作系统上,这通常会导致微不足道的性能损失)

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

错误\u不成功
998(0x3E6)
对内存位置的访问无效

很有可能,虽然不是一直如此

我的意思是,对于某些评测运行,一切都将像在其他操作系统上一样工作(所有的
gethreadcontext
调用都将成功),但对于其他运行,它们几乎都将失败(除了十来个,可能是上万个)。它发生在完全相同的二进制文件中,相同的参数

我已经尝试了一些关于看似相似的问题的建议,重复了
GetThreadContext
调用,但没有成功。我还尝试在
SuspendThread
GetThreadContext
之间执行
Sleep
,然后
GetThreadContext
会更频繁地成功,尽管这会导致速度急剧减慢

然而,它表明Windows 7操作系统正在从
SuspendThread
返回,而线程可能还没有挂起-尽管如此,如果是这样,我不知道如何或是否正确地等待挂起,在线程中循环并重击
GetThreadContext
不会这样做

Edit:16字节按照Dan Bartlett的建议对齐
GetThreadContext
的结构地址似乎是个好办法

看看函数,它提到

上下文结构是高度特定于处理器的。有关此结构的处理器特定定义和任何对齐要求,请参阅WinNt.h头文件

看看这个文件,_CONTEXT是用

typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
...

所以这可能是一个对齐问题。

看起来非常具体。也许你应该找一个检查过的Windows版本来发现问题?您是否在MSDN开发者论坛中描述了此问题?或者直接向MS提交错误。创建进程时是否使用了THREAD\u ALL\u ACCESS属性?查看哪些状态表示“在Windows Server 2008和Windows Vista上线程所有访问标志的值增加”…上下文在WinNT.h中声明为“DECLSPEC\u ALIGN(16)”,可能是对齐问题?线程所有访问不是(2008和Vista中没有任何问题,顺便说一句,只有七个)。然而,对齐似乎正在发挥作用!!!谢谢Dan,看起来他们改变了Win7中编写上下文结构的方式@丹:你应该把它作为一个答案提交,这样你就可以得到分数了愚蠢有趣的事实:可以在Windows 9x上调用GetThreadContext(),上下文结构未对齐到16,但由于NT,您需要对齐其内存位置,才能使GetThreadContext正常工作。