线程控制函数
Win32 API提供了几个函数,用来修改和查询线程的执行状态。在底层,线程可以读些另一个线程的寄存器(假设它有其他线程的handle)。在高层方面,有些Win32 API允许你暂停/开始其他线程的执行。让我们看看这些线程控制函数。
GetThreadContext和IGetThreadContext
GetThreadContext使线程有能力获得另一个线程的寄存器的副本。任何时候,线程要么是正在执行、要么就是出于挂起状态。即使线程处于挂起状态,其寄存器值还是保存在一个名为thread context的结构中。GetThreadContext函数让你能够读取一个被挂起的线程的thread context。
GetThreadContext函数其实只是做参数的检验工作。它检查传入的指针是否指向足够容纳CONTEXT结构的内存块。如果答案是肯定的,程序代码就跳到内部函数IGetThreadContext中。
IGetThreadContext首先转换hThread参数为一个thread database指针,然后调用x_ThreadContext_CopyRegs,把输入的寄存器组存放到ring3的CONTEXT结构中。除了复制寄存器内容到ring3级的CONTEXT结构,IGetThreadContext也调用VWIN32.VXD取得那些寄存器的ring0版本。至于寄存器为什么要有ring0和ring3两种,不甚清楚。
在将CONTEXT结构填充完毕之后,GetThreadContext检查CS以及标志寄存器的值,看看是否合法。标志寄存器的检查很简单,只是确定目前不出于V86模式。
x_ThreadContext_CopyRegs
这个函数把被选中的寄存器内容,从某个CONTEXT结构复制到另一个CONTEXT结构。CONTEXT结构定义与WINNT.H。
补充:
在Visual Studio.NET 2003自带的SDK的WINNT.H中,分别包含针对AMD、ALPHA、x86、MIPS、PPC(Power PC)、和IA64六种CPU的CONTEXT结构定义。在针对x86的CONTEXT结构中,第一个成员是DWORD ContextFlags,该标志用来指出CONTEXT