SetThreadContext x64易失性寄存器

时间:2014-07-28 21:02:37

标签: c++ windows multithreading 64-bit

我遇到了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;

1 个答案:

答案 0 :(得分:2)

在64位窗口,SetThreadContext仅设置非易失性寄存器。 (请参阅WRK中/base/ntos/ps/amd64/psctxamd64.c中的PspGetSetContextInternal)1

设置的寄存器为:仅Rbx,Rsp,Rbp,Rsi,Rdi,R12-R15,Xmm6-Xmm15。