我遇到了SetThreadContext的问题。 我无法更改任何易失性寄存器(表here)。
data.context.ContextFlags = CONTEXT_FULL;
SuspendThread(hThread);
GetThreadContext(hThread, &data.context);
...
CONTEXT* ctx = &data.context;
ctx->ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
ctx->Rax = (DWORD64)0x1000;
ctx->Rcx = (DWORD64)-1;
ctx->Rip = (DWORD64)allocatedMemory;
ctx->R10 = (DWORD64)0x12345678;
ctx->Rbp = (DWORD64)0xFFFFFFFF;
SetThreadContext(hThread, ctx);
ResumeThread(hThread);
该代码更改了Rip和Rbp寄存器,因为它们是非易失性的。 GetLastError返回0。 用THREAD_SET_CONTEXT打开线程THREAD_GET_CONTEXT | THREAD_SUSPEND_RESUME | THREAD_SET_INFORMATION权利。
为什么我无法在x64 app中更改易失性寄存器?在x86应用程序中,我可以更改任何寄存器(无论是否与易失性无关)。
P.S。是的,我试图用ctx-> ContextFlags = CONTEXT_FULL调用SetThreadContext;
答案 0 :(得分:2)
在64位窗口,SetThreadContext仅设置非易失性寄存器。 (请参阅WRK中/base/ntos/ps/amd64/psctxamd64.c中的PspGetSetContextInternal)1
设置的寄存器为:仅Rbx,Rsp,Rbp,Rsi,Rdi,R12-R15,Xmm6-Xmm15。