SetThreadContext x64 volatile registers

SetThreadContext x64 volatile registers

本文关键字:registers volatile x64 SetThreadContext      更新时间:2023-10-16

我有一个问题与SetThreadContext。我不能改变任何volatile寄存器(表在这里)。

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应用程序?在x86应用程序中,我可以更改任何寄存器(这与volatile与否无关)。

注:是的,我试图调用SetThreadContext与ctx->ContextFlags = CONTEXT_FULL;

在64位windows上,SetThreadContext只设置非易失性寄存器。(参见WRK中/base/ntos/ps/amd64/psctxamd64.c中的PspGetSetContextInternal) 1

可设置的寄存器有:Rbx、Rsp、Rbp、Rsi、Rdi、R12-R15、Xmm6-Xmm15。