Windows线程的上下文结构体,struct _CONTEXT结构是与CPU有关的,特定的CPU对应着特定的CONTEXT结构。ide
x86类型CPU对应的CONTEXT结构文档以下:线程
typedef struct _CONTEXT { DWORD ContextFlags; //在查询的时候须要设置该字段,表示查询哪些其余的CONTEXT结构字段。 //调试寄存器组 DWORD Dr0; DWORD Dr1; DWORD Dr2; DWORD Dr3; DWORD Dr6; DWORD Dr7; FLOATING_SAVE_AREA FloatSave; //浮点寄存器 //段寄存器组 DWORD SegGs; DWORD SegFs; DWORD SegEs; DWORD SegDs; //通用数据寄存器(整型寄存器)组 DWORD Edi; DWORD Esi; DWORD Ebx; DWORD Edx; DWORD Ecx; DWORD Eax; //控制寄存器组——好比CS、BP、SP之类的保存基址指针和堆栈指针、程序计数器 DWORD Ebp; DWORD Eip; DWORD SegCs; // MUST BE SANITIZED DWORD EFlags; // MUST BE SANITIZED DWORD Esp; DWORD SegSs; BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; //扩展寄存器组 } CONTEXT;
获取CONTEXT,必须先挂起线程(使用API:SuspendThread),不然取到的CONTEXT无心义。而后经过API:GetThreadContext获取线程CONTEXT。指针
代码片断: CONTEXT Context; SuspendThread(hThread);//挂起线程 Context.ContextFlags = CONTEXT_CONTROL; GetThreadContext(hThread, &Context);//获取线程Context Context.Eip = 0x00010000;//修改EIP,也就是修改了当前执行的代码,后续线程激活后,会在这个地址继续执行(这个地址是为了演示随意填写的,因为这个地址问题,程序可能会崩溃) Context.ContextFlags = CONTEXT_CONTROL; SetThreadContext(hThread, &Context);//设置线程Context ResumeThread(hThread);//恢复线程运行,此时程序从0x00010000地址处开始运行,程序会异常
经过这里咱们就知道,线程的本质也是一个结构体,只是在高2g的内存中(内核空间中),咱们没法直接访问,可是能够经过系统调用访问。调试