12 ctx.ContextFlags = CONTEXT_ALL;
14 if (!GetThreadContext(hThread, &ctx)) {
15 std::cerr <<
"GetThreadContext failed: " << GetLastError() <<
"\n";
20 case Register64::RAX:
return ctx.Rax;
21 case Register64::RBX:
return ctx.Rbx;
22 case Register64::RCX:
return ctx.Rcx;
23 case Register64::RDX:
return ctx.Rdx;
24 case Register64::RSI:
return ctx.Rsi;
25 case Register64::RDI:
return ctx.Rdi;
26 case Register64::RBP:
return ctx.Rbp;
27 case Register64::RSP:
return ctx.Rsp;
28 case Register64::R8:
return ctx.R8;
29 case Register64::R9:
return ctx.R9;
30 case Register64::R10:
return ctx.R10;
31 case Register64::R11:
return ctx.R11;
32 case Register64::R12:
return ctx.R12;
33 case Register64::R13:
return ctx.R13;
34 case Register64::R14:
return ctx.R14;
35 case Register64::R15:
return ctx.R15;
36 case Register64::RIP:
return ctx.Rip;
44 ctx.ContextFlags = CONTEXT_ALL;
46 if (!GetThreadContext(hThread, &ctx)) {
47 std::cerr <<
"GetThreadContext failed: " << GetLastError() <<
"\n";
52 case Register64::RAX: ctx.Rax = value;
break;
53 case Register64::RBX: ctx.Rbx = value;
break;
54 case Register64::RCX: ctx.Rcx = value;
break;
55 case Register64::RDX: ctx.Rdx = value;
break;
56 case Register64::RSI: ctx.Rsi = value;
break;
57 case Register64::RDI: ctx.Rdi = value;
break;
58 case Register64::RBP: ctx.Rbp = value;
break;
59 case Register64::RSP: ctx.Rsp = value;
break;
60 case Register64::R8: ctx.R8 = value;
break;
61 case Register64::R9: ctx.R9 = value;
break;
62 case Register64::R10: ctx.R10 = value;
break;
63 case Register64::R11: ctx.R11 = value;
break;
64 case Register64::R12: ctx.R12 = value;
break;
65 case Register64::R13: ctx.R13 = value;
break;
66 case Register64::R14: ctx.R14 = value;
break;
67 case Register64::R15: ctx.R15 = value;
break;
68 case Register64::RIP: ctx.Rip = value;
break;
71 SetThreadContext(hThread, &ctx);
76 ctx.ContextFlags = CONTEXT_ALL;
78 if (!GetThreadContext(hThread, &ctx)) {
79 std::cerr <<
"GetThreadContext failed: " << GetLastError() <<
"\n";
84 case Register32::EAX:
return ctx.Eax;
85 case Register32::EBX:
return ctx.Ebx;
86 case Register32::ECX:
return ctx.Ecx;
87 case Register32::EDX:
return ctx.Edx;
88 case Register32::ESI:
return ctx.Esi;
89 case Register32::EDI:
return ctx.Edi;
90 case Register32::EBP:
return ctx.Ebp;
91 case Register32::ESP:
return ctx.Esp;
100 ctx.ContextFlags = CONTEXT_ALL;
102 if (!GetThreadContext(hThread, &ctx)) {
103 std::cerr <<
"GetThreadContext failed: " << GetLastError() <<
"\n";
108 case Register32::EAX: ctx.Eax = value;
break;
109 case Register32::EBX: ctx.Ebx = value;
break;
110 case Register32::ECX: ctx.Ecx = value;
break;
111 case Register32::EDX: ctx.Edx = value;
break;
112 case Register32::ESI: ctx.Esi = value;
break;
113 case Register32::EDI: ctx.Edi = value;
break;
114 case Register32::EBP: ctx.Ebp = value;
break;
115 case Register32::ESP: ctx.Esp = value;
break;
119 SetThreadContext(hThread, &ctx);
127 SuspendThread(hThread);
130 ctx.ContextFlags = CONTEXT_FULL;
132 if (!GetThreadContext(hThread, &ctx)) {
133 std::cerr <<
"GetThreadContext failed\n";
134 ResumeThread(hThread);
139 ctx.EFlags |=
static_cast<DWORD64
>(flag);
141 ctx.EFlags &= ~static_cast<DWORD64>(flag);
143 if (!SetThreadContext(hThread, &ctx)) {
144 std::cerr <<
"SetThreadContext failed\n";
147 ResumeThread(hThread);
151 SuspendThread(hThread);
154 ctx.ContextFlags = CONTEXT_FULL;
156 if (!GetThreadContext(hThread, &ctx)) {
157 std::cerr <<
"GetThreadContext failed\n";
158 ResumeThread(hThread);
162 bool result = (ctx.EFlags &
static_cast<DWORD64
>(flag)) != 0;
163 ResumeThread(hThread);
170 SuspendThread(hThread);
173 ctx.ContextFlags = CONTEXT_FULL;
175 if (!GetThreadContext(hThread, &ctx)) {
176 std::cerr <<
"GetThreadContext failed\n";
177 ResumeThread(hThread);
182 ctx.EFlags |=
static_cast<DWORD>(flag);
184 ctx.EFlags &= ~static_cast<DWORD>(flag);
186 if (!SetThreadContext(hThread, &ctx)) {
187 std::cerr <<
"SetThreadContext failed\n";
190 ResumeThread(hThread);
194 SuspendThread(hThread);
197 ctx.ContextFlags = CONTEXT_FULL;
199 if (!GetThreadContext(hThread, &ctx)) {
200 std::cerr <<
"GetThreadContext failed\n";
201 ResumeThread(hThread);
205 bool result = (ctx.EFlags &
static_cast<DWORD>(flag)) != 0;
206 ResumeThread(hThread);
int32_t getRegister(HANDLE hThread, Register32 reg)
Reads a 32-bit general-purpose register.
void setFlag(HANDLE hThread, Flags32 flag, bool enabled)
Sets or clears a status flag in EFLAGS.
bool getFlag(HANDLE hThread, Flags32 flag)
Reads a status flag from EFLAGS.
void setRegister(HANDLE hThread, Register32 reg, int32_t value)
Writes a 32-bit general-purpose register.
Flags32
x86 CPU status flags.
Register32
32-bit x86 general-purpose registers.
@ EIP
Instruction Pointer.