WINDOWS
中定義了一個CONTEXT
結構,該結構包含了特定處理器上的寄存器資料。系統使用CONTEXT
結構執行各種內部操作。目前,已經存在為Intel
、MIPS
、Alpha
和PowerPC
處理器定義的CONTEXT
結構。若要瞭解這些結構的定義,可以去看WinNT.h
。
該結構並沒有說明結構體內的成員,也沒有描述這些成員是誰,因為這些成員要取決於WINDOWS
運行在哪個平台上。在WINDOWS
定義的所有資料結構中,CONTEXT
結構是特定於CPU
的唯一結構。
在CONTEXT
結構中,它包含了主機CPU
上的每個寄存器的資料結構。在X86
電腦上,資料成員是EAX
,EBX
,ECX
,EDX
等等。如果是Alpha
處理器,那麼資料成員包括IntV0,IntT0,IntT1,IntS0,IntRa
和IntZero
等等。下面的代碼示範了X86 CPU
完整的CONTEXT
結構。
typedef struct _CONTEXT
{
DWORD ContextFlags;
//
調試寄存器
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
//
浮點寄存器
FLOATING_SAVE_AREA FloatSave;
//
棧寄存器
DWORD SegGs;
DWORD SegFs;
DWROD SegEs;
DWORD SegDs;
//
整型寄存器
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
//
控制寄存器
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
//
擴充寄存器
BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
}CONTEXT;
可以使用
BOOL GetThreadContext(HANDLE,PCONTEXT);
函數來取得一個線程的上下文。
ContextFlags
用於指定你關注此資料結構中哪些寄存器值。可以是如下定義
CONTEXT_CONTROL
CONTEXT_INTEGER
CONTEXT_SEGMENTS
CONTEXT_FLOATING_POINT
CONTEXT_DEBUG_REGISTERS
CONTEXT_EXTENDED_REGISTERS;
另外,在WinNT.h
中還定義了一個CONTEXT_FULL
定義如下
#ifdefine _X86
#define CONTEXT_FULL /
CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS
#endif
#ifdefine _ALPHA
#define CONTEXT_FULL / CONTEXT_CONTROL|CONTEXT_FLOATING_POINT|CONTEXT_INTEGER
#endif
同樣我們可以通過SetThreadContext(HANDLE,PCONTEXT);
來修改一個線程的寄存器值。步驟如下。
1、
將要操作的線程掛起。
2、
定義一個CONTEXT
結構變數,將其ContextFlags
初始化,標記你關注哪些值。
3、
使用GetThreadContext
取得上下文。
4、
修改你想修改的寄存器值。
5、
用SetThreadContext
更新系統中線程的上下文。
6、
喚醒線程
另外,對於指令指標和堆棧指標寄存器X86
和ALPHA
機器上是不一樣的。
X86
是EIP
和ESP
,而ALPHA
中是Fir
和IntSp
。在使用的時候,應該根據具體情況分析。。當然,上面的操作在一般的應用程式中不會使用。若你想編寫偵錯工具,調試器等才有可能用到。