gpt4 book ai didi

c++ - SetThreadContext x64 volatile 寄存器

转载 作者:可可西里 更新时间:2023-11-01 11:29:17 25 4
gpt4 key购买 nike

我对 SetThreadContext 有疑问。我无法更改任何 volatile 寄存器(表 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 寄存器,因为它们是非 volatile 的。GetLastError 返回 0。使用 THREAD_SET_CONTEXT | 打开的线程THREAD_GET_CONTEXT | THREAD_SUSPEND_RESUME | THREAD_SET_INFORMATION 权利。

为什么我不能在 x64 应用程序中更改 volatile 寄存器?在 x86 应用程序中,我可以更改任何寄存器(这与 volatile 无关)。

附言是的,我尝试使用 ctx->ContextFlags = CONTEXT_FULL 调用 SetThreadContext;

最佳答案

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

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

关于c++ - SetThreadContext x64 volatile 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com